Menu
Coddy logo textTech

Interface CLI de administração

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 criar uma interface de linha de comando para o nosso Sistema de Gerenciamento de Biblioteca usando o Padrão de Comando! Você criará uma CLI que processa comandos administrativos, como adicionar livros, cadastrar 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 Padrão de Comando ganha vida! Defina uma interface Command com um método Execute que receba um *Library e argumentos []string, retornando um resultado do tipo string. Em seguida, implemente estas structs de comando:
    • AddBookCommand: espera 4 argumentos: id, title, author, isbn. Adiciona o livro e retorna Book added: [title]
    • AddUserCommand: espera 3 argumentos: id, name, email. Adiciona o usuário e retorna User added: [name]
    • BorrowCommand: espera 2 argumentos: userID, bookID. Retorna Borrowed: [bookID] em caso de sucesso ou Error: [message] em caso de falha
    • ReturnCommand: espera 2 argumentos: userID, bookID. Retorna Returned: [bookID] em caso de sucesso ou Error: [message] 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 contenha um ponteiro para uma Library e um mapa de nomes de comandos para implementações de Command. Crie:
    • o construtor NewCLI, que inicializa a CLI com uma biblioteca e registra todos os comandos: addbook, adduser, borrow, return, listbooks
    • o 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 uma entrada vazia ou Unknown command: [name] para comandos não reconhecidos
  • main.go: crie uma biblioteca e uma CLI e, em seguida, processe os comandos da entrada. Leia o número de comandos e depois 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, dada a entrada:

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 deverá 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, dada a entrada:

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

Sua saída deverá ser:

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

E, dada a entrada:

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 deverá 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 implemente 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 um novo CLI com a library

	// 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 do CLI
	// - Imprime o resultado

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

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

Pratique por conta própria: Compilador de Go online