Menu
Coddy logo textTech

Interface CLI de Administrador

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 103 de 107.

challenge icon

Desafio

Fácil

Vamos construir uma interface de linha de comando para o nosso Sistema de Gerenciamento de Biblioteca usando o Command Pattern! Você criará uma CLI que processa comandos de administrador, como adicionar livros, registrar usuários e gerenciar operações de empréstimo — tudo por meio de uma arquitetura limpa e extensível.

Você organizará seu código em seis arquivos:

  • book.go: Sua struct Book com tags JSON para ID, Title, Author, ISBN e Available. Inclua o construtor NewBook.
  • user.go: Sua struct User com tags JSON para ID, Name, Email e BorrowedBooks. Inclua o construtor NewUser.
  • library.go: Sua struct Library com mapas para livros e usuários, juntamente com os métodos AddBook, AddUser, Borrow e Return das lições anteriores.
  • commands.go: É aqui que o Command Pattern ganha vida! Defina uma interface Command com um método Execute que recebe um *Library e argumentos []string, retornando um resultado string. Em seguida, implemente estas structs de comando:
    • AddBookCommand — espera 4 argumentos: id, title, author, isbn. Adiciona o livro e retorna "Book added: " + book.Title
    • AddUserCommand — espera 3 argumentos: id, name, email. Adiciona o usuário e retorna "User added: " + user.Name
    • BorrowCommand — espera 2 argumentos: userID, bookID. Retorna "Borrowed: " + args[1] em caso de sucesso, ou "Error: " + err.Error() em caso de falha
    • ReturnCommand — espera 2 argumentos: userID, bookID. Retorna "Returned: " + args[1] em caso de sucesso, ou "Error: " + err.Error() em caso de falha
    • ListBooksCommand — não recebe argumentos. Retorna o ID e o título de cada livro em linhas separadas no formato [id]: [title], ou "No books" se estiver vazio (liste os livros ordenados por ID)

    Se um comando receber argumentos insuficientes, retorne "Error: insufficient arguments"

  • cli.go: Crie uma struct CLI que contém um ponteiro para uma Library e um mapa de nomes de comandos para implementações de Command. Construa:
    • Construtor NewCLI que inicializa a CLI com uma biblioteca e registra todos os comandos: "addbook", "adduser", "borrow", "return", "listbooks"
    • Método Run que recebe uma string de entrada, analisa-a usando strings.Fields, procura o comando e o executa. Retorne "No command provided" para entrada vazia, ou "Unknown command: " + parts[0] para comandos não reconhecidos
  • main.go: Crie uma biblioteca e uma CLI, depois processe os comandos da entrada. Leia o número de comandos e, em seguida, leia cada string de comando em uma linha separada. Para cada comando, chame Run e imprima o resultado.

As seguintes entradas serão fornecidas:

  • Número de comandos
  • Cada comando como uma string completa em sua própria linha

Por exemplo, dado:

6
addbook B001 Go-Programming Alan-Donovan 978-0134190440
addbook B002 Clean-Code Robert-Martin 978-0132350884
adduser U001 Alice alice@test.com
borrow U001 B001
listbooks
borrow U001 B001

Sua saída deve ser:

Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not available

E dado:

4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd test

Sua saída deve ser:

No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmd

E dado:

5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001

Sua saída deve ser:

User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001

Observe como a CLI não precisa conhecer os detalhes de cada operação — ela simplesmente procura o comando e delega a execução. Isso torna a adição de novos comandos tão simples quanto criar uma nova struct que implementa a interface Command e registrá-la na CLI!

Experimente você mesmo

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// Lê o número de comandos
	var n int
	fmt.Scanln(&n)

	// Cria um scanner para ler linhas completas
	scanner := bufio.NewScanner(os.Stdin)

	// TODO: Cria uma nova Library

	// TODO: Cria uma nova CLI com a biblioteca

	// TODO: Processa cada comando
	// Para cada um dos n comandos:
	// - Lê a linha de comando usando scanner.Scan() e scanner.Text()
	// - Executa o comando através da CLI
	// - Imprime o resultado

	_ = scanner // Remova esta linha quando você usar o scanner
}

Todas as lições de Programação Orientada a Objetos