// Package app owns application orchestration and top-level use cases. package app import ( "context" "fmt" "time" "gitea.maximumdirect.net/eric/weatherreporter/internal/adapters/weatherapi" "gitea.maximumdirect.net/eric/weatherreporter/internal/config" "gitea.maximumdirect.net/eric/weatherreporter/internal/forecast" ) type ReportKind string const ( ReportDaily ReportKind = "daily" ReportTomorrow ReportKind = "tomorrow" ReportThreeDay ReportKind = "three-day" ReportWeekend ReportKind = "weekend" ReportStorm ReportKind = "storm" ) type BatchKind string const ( BatchMorning BatchKind = "morning" BatchEvening BatchKind = "evening" ) type GenerateRequest struct { Config config.Config Report ReportKind OutputPath string Date time.Time StormStart time.Time StormEnd time.Time } type BatchRequest struct { Config config.Config Batch BatchKind } type FetchBundleRequest struct { Config config.Config OutputPath string } func Generate(ctx context.Context, req GenerateRequest) error { _ = ctx _ = req return fmt.Errorf("generate is not implemented") } func RunBatch(ctx context.Context, req BatchRequest) error { _ = ctx _ = req return fmt.Errorf("run is not implemented") } func FetchBundle(ctx context.Context, req FetchBundleRequest) (*forecast.Bundle, error) { client, err := weatherapi.New(req.Config) if err != nil { return nil, err } bundle, err := client.FetchBundle(ctx) if err != nil { return nil, err } return bundle, nil } func FetchAndSaveBundle(ctx context.Context, req FetchBundleRequest) (*forecast.Bundle, error) { if req.OutputPath == "" { return nil, fmt.Errorf("output path is required") } bundle, err := FetchBundle(ctx, req) if err != nil { return nil, err } if err := weatherapi.SaveBundle(req.OutputPath, bundle); err != nil { return nil, err } return bundle, nil }