diff --git a/internal/cmd/calendar.go b/internal/cmd/calendar.go index f51bb227..86d896d7 100644 --- a/internal/cmd/calendar.go +++ b/internal/cmd/calendar.go @@ -3,6 +3,7 @@ package cmd type CalendarCmd struct { Calendars CalendarCalendarsCmd `cmd:"" name:"calendars" help:"List calendars"` Subscribe CalendarSubscribeCmd `cmd:"" name:"subscribe" aliases:"sub,add-calendar" help:"Add a calendar to your calendar list"` + CreateCalendar CalendarCreateCalendarCmd `cmd:"" name:"create-calendar" aliases:"new-calendar" help:"Create a new secondary calendar"` ACL CalendarAclCmd `cmd:"" name:"acl" aliases:"permissions,perms" help:"List calendar ACL"` Alias CalendarAliasCmd `cmd:"" name:"alias" help:"Manage calendar aliases"` Events CalendarEventsCmd `cmd:"" name:"events" aliases:"list,ls" help:"List events from a calendar or all calendars"` diff --git a/internal/cmd/calendar_create_calendar.go b/internal/cmd/calendar_create_calendar.go new file mode 100644 index 00000000..6c27ca95 --- /dev/null +++ b/internal/cmd/calendar_create_calendar.go @@ -0,0 +1,70 @@ +package cmd + +import ( + "context" + "fmt" + "os" + "strings" + + "google.golang.org/api/calendar/v3" + + "github.com/steipete/gogcli/internal/outfmt" + "github.com/steipete/gogcli/internal/ui" +) + +type CalendarCreateCalendarCmd struct { + Summary string `arg:"" name:"summary" help:"Calendar display name"` + Description string `name:"description" help:"Calendar description"` + TimeZone string `name:"timezone" aliases:"tz" help:"IANA timezone (e.g., America/New_York)"` + Location string `name:"location" help:"Calendar location"` +} + +func (c *CalendarCreateCalendarCmd) Run(ctx context.Context, flags *RootFlags) error { + u := ui.FromContext(ctx) + summary := strings.TrimSpace(c.Summary) + if summary == "" { + return usage("required: calendar name (positional argument)") + } + + account, err := requireAccount(flags) + if err != nil { + return err + } + + svc, err := newCalendarService(ctx, account) + if err != nil { + return err + } + + cal := &calendar.Calendar{ + Summary: summary, + Description: strings.TrimSpace(c.Description), + TimeZone: strings.TrimSpace(c.TimeZone), + Location: strings.TrimSpace(c.Location), + } + + if dryRunErr := dryRunExit(ctx, flags, "calendar.create-calendar", map[string]any{ + "calendar": cal, + }); dryRunErr != nil { + return dryRunErr + } + + created, err := svc.Calendars.Insert(cal).Context(ctx).Do() + if err != nil { + return fmt.Errorf("create calendar: %w", err) + } + + if outfmt.IsJSON(ctx) { + return outfmt.WriteJSON(ctx, os.Stdout, map[string]any{"calendar": created}) + } + + u.Out().Printf("id\t%s", created.Id) + u.Out().Printf("summary\t%s", created.Summary) + if created.TimeZone != "" { + u.Out().Printf("timezone\t%s", created.TimeZone) + } + if created.Description != "" { + u.Out().Printf("description\t%s", created.Description) + } + return nil +}