Various improvments to structs, added godotenv to handle variable info

This commit is contained in:
Andrew Scott 2022-07-08 22:14:35 -04:00
parent 51ffa88fe9
commit c1a53b7e4b
Signed by: a
GPG key ID: 3EB62D0BBB8DB381

View file

@ -7,27 +7,95 @@ import (
"os" "os"
"strings" "strings"
"sync" "sync"
"github.com/joho/godotenv"
) )
const version string = "0.1.0"
type weatherMain struct {
Temp float32 `json:"temp"`
FeelsLike float32 `json:"feels_like"`
HighTemp float32 `json:"temp_max"`
LowTemp float32 `json:"temp_min"`
Pressure uint `json:"pressure"`
Humidity uint `json:"humidity"`
}
type weatherWind struct {
Speed float32 `json:"speed"`
Gust float32 `json:"gust"`
}
type forecast struct {
//Overview weatherOverview `json:"weather"`
Main weatherMain `json:"main"`
Wind weatherWind `json:"wind"`
}
type config struct { type config struct {
Units string `json:"units"` Units string `json:"units"`
Location string `json:"loc"` Location string `json:"loc"`
Longitude string `json:"lat"` Longitude string `json:"lat"`
Latitude string `json:"lon"` Latitude string `json:"lon"`
ApiKey string `json:"appid"`
}
type application struct {
Forecast forecast
Config config
WaitGroup sync.WaitGroup
Version string
}
func printWeather(app *application) {
var unitString string
if app.Config.Units == "imperial" {
unitString = "Farhenheit/mph"
} else {
unitString = "Celsius/kph"
}
fmt.Printf("\nUnits: %s (%s)\n\n", app.Config.Units, unitString)
fmt.Printf("Current temperature: %.2f\n", app.Forecast.Main.Temp)
fmt.Printf("Feels like: %.2f\n", app.Forecast.Main.FeelsLike)
fmt.Printf("High: %.2f\n", app.Forecast.Main.HighTemp)
fmt.Printf("Low: %.2f\n", app.Forecast.Main.LowTemp)
fmt.Printf("Pressure (hPa): %d\n", app.Forecast.Main.Pressure)
fmt.Printf("Humidty (%%): %d\n", app.Forecast.Main.Humidity)
fmt.Printf("Wind speed: %.2f\n", app.Forecast.Wind.Speed)
fmt.Printf("Gust: %.2f\n", app.Forecast.Wind.Gust)
} }
func main() { func main() {
err := godotenv.Load()
if err != nil {
log.Fatalln(err)
}
cfg := config{ cfg := config{
Units: "F", Units: "imperial",
ApiKey: os.Getenv("API_KEY"),
}
fcst := forecast{}
var wg sync.WaitGroup
app := application{
Config: cfg,
Forecast: fcst,
WaitGroup: wg,
Version: version,
} }
var option string var option string
var wg sync.WaitGroup
fmt.Println("\n==============================================") fmt.Println("\n=====================================================")
fmt.Println("| Welcome to the OpenWeatherMap-gRPC Client! |") fmt.Printf("| Welcome to the OpenWeatherMap-gRPC Client! v%s |\n", app.Version)
fmt.Println("==============================================") fmt.Println("=====================================================")
for option != "0" { for option != "0" {
@ -46,13 +114,17 @@ func main() {
option = strings.TrimSuffix(input, "\n") option = strings.TrimSuffix(input, "\n")
if option == "1" || option == "" { if option == "1" || option == "" {
wg.Add(1) app.WaitGroup.Add(1)
go getLocation(&wg, &cfg) go getLocation(&app)
wg.Wait() app.WaitGroup.Wait()
app.WaitGroup.Add(1)
go getCurrent(&app)
app.WaitGroup.Wait()
printWeather(&app)
} else if option == "2" { } else if option == "2" {
wg.Add(1) app.WaitGroup.Add(1)
go advancedMenu(&wg, &cfg) go advancedMenu(&app)
wg.Wait() app.WaitGroup.Wait()
} else if option == "0" { } else if option == "0" {
return return
} else { } else {