From 94fddc8c474d35728611cc0f5aab152c3b20b681 Mon Sep 17 00:00:00 2001 From: dwrz Date: Fri, 23 Oct 2026 14:10:52 +0000 Subject: [PATCH] Add sun cmd --- cmd/sun/main.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 cmd/sun/main.go diff --git a/cmd/sun/main.go b/cmd/sun/main.go new file mode 100644 index 0000000..bf78d93 --- /dev/null +++ b/cmd/sun/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "flag" + "fmt" + "log" + "time" + + "github.com/nathan-osman/go-sunrise" + + "code.chimeric.al/dwrz/sun/pkg/geo" +) + +var ( + coordinates = flag.String("c", "", "coordinates") + date = flag.String("d", "", "date in YYYY-MM-DD format") + tz = flag.String("z", "", "timezone") + f = flag.String("f", "", "output time format") +) + +func main() { + flag.Parse() + if *coordinates == "" { + log.Fatalf("missing coordinates") + } + + c, err := geo.ParseCoordinates(*coordinates) + if err != nil { + log.Fatalf("failed to parse coordinates: %v", err) + } + + var now = time.Now() + if *date != "" { + var err error + now, err = time.Parse(time.DateOnly, *date) + if err != nil { + log.Fatalf("failed to parse date: %v", err) + } + } + + var loc *time.Location = time.UTC + if *tz != "" { + var err error + loc, err = time.LoadLocation(*tz) + if err != nil { + log.Fatalf("failed to parse timezone: %v", err) + } + } + + // https://en.wikipedia.org/wiki/Sunrise_equation + rise, set := sunrise.SunriseSunset( + c.Latitude, c.Longitude, + now.Year(), now.Month(), now.Day(), + ) + + if *f == "" { + fmt.Println( + rise.In(loc).Format(time.RFC3339), + set.In(loc).Format(time.RFC3339), + set.Sub(rise), + ) + } else { + fmt.Println( + rise.In(loc).Format(*f), + set.In(loc).Format(*f), + set.Sub(rise), + ) + } +}