package cmd import ( "encoding/json" "fmt" "os" "time" "git.sr.ht/~timharek/yr-go/cmd/flags" "git.sr.ht/~timharek/yr-go/internal/nominatim" "git.sr.ht/~timharek/yr-go/yr" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss/table" "github.com/spf13/cobra" ) var forecastCmd = &cobra.Command{ Use: "forecast ", Aliases: []string{"f", "ls"}, Short: "Get forecasted weather", Args: cobra.MaximumNArgs(1), Run: forecast, } func init() { rootCmd.AddCommand(forecastCmd) } func forecast(cmd *cobra.Command, args []string) { isJson, err := cmd.Flags().GetBool(flags.JSON) cobra.CheckErr(err) lon, _ := cmd.Flags().GetFloat64(flags.LON) lat, _ := cmd.Flags().GetFloat64(flags.LAT) c, err := yr.New() cobra.CheckErr(err) if len(args) == 0 && (lon == 0 || lat == 0) { fmt.Fprintln(os.Stderr, "No location or coordinates provided.") os.Exit(1) } var f []yr.Forecast if len(args) == 0 { f, err = c.ForecastCoords(&nominatim.Coordinates{Longitude: lon, Latitude: lat}, nil) cobra.CheckErr(err) } else { location := args[0] f, err = c.Forecast(location) cobra.CheckErr(err) } if isJson { j, err := json.MarshalIndent(f, "", " ") cobra.CheckErr(err) fmt.Printf("%s", j) return } re := lipgloss.NewRenderer(os.Stdout) const ( white = lipgloss.Color("#fff") lightGray = lipgloss.Color("#dedede") ) var ( HeaderStyle = re.NewStyle().Foreground(white).Bold(true).Align(lipgloss.Center) CellStyle = re.NewStyle().Padding(0, 2) EvenRowStyle = CellStyle.Foreground(lightGray) BorderStyle = lipgloss.NewStyle().Foreground(white) ) t := table.New(). Border(lipgloss.NormalBorder()). BorderStyle(BorderStyle). StyleFunc(func(row, col int) lipgloss.Style { switch { case row == 0: return HeaderStyle case row%2 == 0: return EvenRowStyle default: return CellStyle } }). Headers("time", "temp.", "rain", "wind") for _, item := range f { t.Row( item.Time.Format(time.DateTime), fmt.Sprintf("%.1f °C", item.Temperature), fmt.Sprintf("%.1f mm", item.Percipitation), fmt.Sprintf("%.1f m/s %s", item.Wind.Speed, item.Wind.DirectionToString()), ) } fmt.Println(t) }