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: