Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Mãos na Massa: Organização e Fluxo - Minha versao

Estou comecando agora o curso de Go na Alura porque e a linguagem que estou querendo focar. Sem duvida uma linguagem relativamente facil de aprender, entao eu resolvi fazer a minha versao de organizar o projeto para essa primeira parte do curso.

Eu aproveitei e criei outro projeto em Go que chamei de go(Sou pessimo em dar nomes), ele e um module(s), isso quer dizer que posso reaproveita-lo em outro projeto Go sem problema nem um. Aproveitei e o implementei a este projeto que estamos fazendo no curso.

O resultado foi este ate o momento:

Package Main:

package main

import (
    "github.com/rickmvi/go/pkg/console/prompt"
    "github.com/rickmvi/goweb/src/internal/cli"
    "github.com/rickmvi/goweb/src/internal/menu"
)

func main() {

    prompt.New().
        Input("Enter your name: ").
        Format("Welcome %s!\n", 0).
        Print()

    menu.Render()
    cli.ProcessInput()
}

Package menu

package menu

import (
    "github.com/rickmvi/go/pkg/console/prompt"
)

var (
    menuItems = []string{
        "1. Start Monitoring",
        "2. Display Logs",
        "3. Exit",
    }
)

func Render() {

    str := prompt.New()

    str.LineSeparator("=", 20)
    appendMenuItems(str)
    str.LineSeparator("=", 20)

    str.Print()
}

func appendMenuItems(str *prompt.Prompt) {
    for index := range menuItems {
        str.InsertLine(menuItems[index])
    }
}

Package cli/process

package cli

import (
    "fmt"
    "github.com/rickmvi/go/pkg/console/prompt"
    "github.com/rickmvi/go/pkg/console/scan"
    "os"
)

func ProcessInput() {

    for {
        fmt.Println()
        value, err := scan.Int[int]("Select an option: ")

        if err != nil {
            prompt.Message(err.Error()).Print()
            fail()
        }

        switch value {
        case 1:
            monitor()
        case 2:
            logs()
        case 3:
            exit()
        default:
            prompt.Message("Invalid option").Print()
            fail()
        }
    }

}

func monitor() {
    prompt.Message("Monitoring...").Print()
}

func logs() {
    prompt.Message("Displaying logs...").Print()
}

func exit() {
    prompt.Message("Exiting...").Print()
    success()
}

func success() {
    os.Exit(0)
}

func fail() {
    os.Exit(-1)
}

Os metodos chamados de scan e prompt so do module que eu criei, eles sao uma mao na roda e evita ter de escrever muito codigo repetitivo, basta saber o que quer fazer e chamar o metodo que ele ja faz para voce.

Um exemplo, inves de eu ter de perder tempo criando um sistema de scan no Go para ler um input da pessoa e printar ele, desta forma:

func main() {
    var name string
    fmt.Println("Enter your name: ")
    _, err := fmt.Scan(&name)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Welcome %v", name)
}

Eu posso simplesmente fazer isso usando o module prompt:

prompt.New().
        Input("Enter your name: ").
        Format("Welcome %s!\n", 0).
        Print()

e pronto, acabou, sem dificuldade nem uma.

Este o resultado do projeto no console:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta
solução!

Olá, Rick! Tudo bem?

Que legal que você está se aprofundando em Go e já está criando seus próprios módulos! Sua organização de código está bem clara e modularizada, o que é ótimo para manutenção e reutilização.

Aqui estão algumas sugestões para melhorar ainda mais seu projeto:

  1. Documentação: Considere adicionar comentários nos seus pacotes e funções para explicar o que cada parte faz. Isso pode ser útil para você no futuro ou para qualquer outra pessoa que venha a trabalhar no seu código.

  2. Testes: Se ainda não fez, pense em adicionar testes para suas funções, especialmente para as partes que processam a entrada do usuário. Isso ajuda a garantir que o comportamento do seu programa se mantenha correto conforme você faz alterações.

  3. Melhorias no Menu: Você pode considerar adicionar uma opção de "voltar" ou "ajuda" no menu, para tornar a interface mais amigável.

  4. Tratamento de Erros: No seu método ProcessInput, você já está tratando erros de entrada, mas pode ser interessante expandir essa lógica para lidar com outros tipos de erros que possam ocorrer.

Seu projeto está no caminho certo, e essas melhorias podem ajudar a torná-lo ainda mais robusto e fácil de usar. Continue assim!

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.