0
respostas

[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

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora