Pular para o conteúdo principal

victorstein.dev

45/100 Dias de Golang - Aplicação para buscar previsão do tempo - Parte 2

Table of Contents

# Aplicação para buscar previsão do tempo - Parte 2

Vamos começar criando o projeto Golang:

go mod init cidadeTempo

E instalar as depêndências. Para CLI vamos usar o Cobra. Já vimos sobre o Cobra no dia 40

go get -u github.com/spf13/cobra@latest

E iniciar o projeto:

cobra-cli init

A estrutura do projeto deve ficar assim:

.
├── cmd
│   └── root.go
├── go.mod
├── go.sum
├── LICENSE
└── main.go

E vamos adicionar nossos comando principais, cidade e tempo

cobra-cli add cidade
cobra-cli add tempo

Com esse comando dois arquivos serão criados dentro da pasta cmd, cidade.go e tempo.go. Já podemos rodar esses comando com: go run main.go cidade!

# Comando cidade

A ideia desse comando é encontrar o ID da cidade que você busca, então temos que receber uma string e fazer o request para a API com esse valor. Mas antes vamos alterar algumas coisas nesse arquivo.

var cidadeCmd = &cobra.Command{
	Use:   "cidade",
	Short: "Retorna uma listagem de cidades",
	Long: `Retorna dados das cidades candidatas que possuem a string passada como parâmetro
	exemplo de uso: cidadetempo --cidade Curitiba
	`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("cidade called")
	},
}

Os campos Short e Long são uma descrição do comando. O cobra já cria um help para cada comando, go run main.go cidade -h

Retorna dados das cidades candidatas que possuem a string passada como parâmetro
	exemplo de uso: cidadetempo --cidade Curitiba

Usage:
  cidadeTempo cidade [flags]

Flags:
  -h, --help   help for cidade`

Agora vamos adicionar a flag cidade e exibir o valor na saída do comando. Primeiro tempos que criar uma variável

var cidade string

E no init adicionar essa variável como uma flag

func init() {
	rootCmd.AddCommand(cidadeCmd)
	cidadeCmd.Flags().StringVarP(&cidade, "cidade", "c", "Curitiba", "Cidade que você quer o ID")

}

E vamos alterar a função do Run para imprimir essa flag:

Run: func(cmd *cobra.Command, args []string) {
		fmt.Printf("Comando cidade chamando com a flag %s", cidade)
	},

Agora temos que montar o request e imprimir os dados para o usuário, para a realização dos requests vamos usar a lib padrão do golang. A função vai ficar assim:

func requestCidade(cidade string) {
	url := fmt.Sprintf("https://brasilapi.com.br/api/cptec/v1/cidade/%s", cidade)

	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		log.Fatalf("Erro ao criar request: %v", err)
	}

	client := &http.Client{}

	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Erro ao fazer request: %v", err)
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("Erro ao ler resposta: %v", err)
	}

	fmt.Println("Status Code:", resp.StatusCode)
	fmt.Println("Body:", string(body))
}

Agora basta chamar o a função do request no Init:

Run: func(cmd *cobra.Command, args []string) {
		fmt.Printf("Comando cidade chamando com a flag %s", cidade)
		requestCidade(cidade)
	}

Já temos nosso primeira chamada real agora: go run main.go cidade --cidade Curitiba

Comando cidade chamando com a flag CuritibaStatus Code: 200
Body: [{"nome":"Curitiba","id":227,"estado":"PR"},{"nome":"Curitibanos","id":1728,"estado":"SC"}]

O código completo do arquivo cidade.go:

package cmd

import (
	"fmt"
	"io"
	"log"
	"net/http"

	"github.com/spf13/cobra"
)

var cidade string

// cidadeCmd represents the cidade command
var cidadeCmd = &cobra.Command{
	Use:   "cidade",
	Short: "Retorna uma listagem de cidades",
	Long: `Retorna dados das cidades candidatas que possuem a string passada como parâmetro
	exemplo de uso: cidadetempo --cidade Curitiba
	`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Printf("Comando cidade chamando com a flag %s", cidade)
		requestCidade(cidade)
	},
}

func init() {
	rootCmd.AddCommand(cidadeCmd)
	cidadeCmd.Flags().StringVarP(&cidade, "cidade", "c", "Curitiba", "Cidade que você quer o ID")

}

func requestCidade(cidade string) {
	url := fmt.Sprintf("https://brasilapi.com.br/api/cptec/v1/cidade/%s", cidade)

	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		log.Fatalf("Erro ao criar request: %v", err)
	}

	client := &http.Client{}

	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Erro ao fazer request: %v", err)
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("Erro ao ler resposta: %v", err)
	}

	fmt.Println("Status Code:", resp.StatusCode)
	fmt.Println("Body:", string(body))
}