refactor(cmd): reuse paged list helper

This commit is contained in:
Peter Steinberger 2026-05-05 08:48:59 +01:00
parent 4a2a72fa4e
commit ad59efba58
No known key found for this signature in database
24 changed files with 97 additions and 434 deletions

View File

@ -58,19 +58,9 @@ func (c *AdminGroupsListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Groups, resp.NextPageToken, nil
}
var groups []*admin.Group
nextPageToken := ""
if c.All {
all, collectErr := collectAllPages(c.Page, fetch)
if collectErr != nil {
return collectErr
}
groups = all
} else {
groups, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
groups, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
@ -176,19 +166,9 @@ func (c *AdminGroupsMembersListCmd) Run(ctx context.Context, flags *RootFlags) e
return resp.Members, resp.NextPageToken, nil
}
var members []*admin.Member
nextPageToken := ""
if c.All {
all, collectErr := collectAllPages(c.Page, fetch)
if collectErr != nil {
return collectErr
}
members = all
} else {
members, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
members, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -60,19 +60,9 @@ func (c *AdminUsersListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Users, resp.NextPageToken, nil
}
var users []*admin.User
nextPageToken := ""
if c.All {
all, collectErr := collectAllPages(c.Page, fetch)
if collectErr != nil {
return collectErr
}
users = all
} else {
users, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
users, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -51,20 +51,9 @@ func listCalendarEvents(ctx context.Context, svc *calendar.Service, calendarID,
return resp.Items, resp.NextPageToken, nil
}
var items []*calendar.Event
nextPageToken := ""
if allPages {
all, err := collectAllPages(page, fetch)
if err != nil {
return err
}
items = all
} else {
var err error
items, nextPageToken, err = fetch(page)
if err != nil {
return err
}
items, nextPageToken, err := loadPagedItems(page, allPages, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
if err := outfmt.WriteJSON(ctx, os.Stdout, map[string]any{
@ -164,21 +153,10 @@ func listCalendarIDsEvents(ctx context.Context, svc *calendar.Service, calendarI
return resp.Items, resp.NextPageToken, nil
}
var events []*calendar.Event
var err error
if allPages {
allEvents, collectErr := collectAllPages(page, fetch)
if collectErr != nil {
u.Err().Printf("calendar %s: %v", calID, collectErr)
continue
}
events = allEvents
} else {
events, _, err = fetch(page)
if err != nil {
u.Err().Printf("calendar %s: %v", calID, err)
continue
}
events, _, err := loadPagedItems(page, allPages, fetch)
if err != nil {
u.Err().Printf("calendar %s: %v", calID, err)
continue
}
for _, e := range events {

View File

@ -43,19 +43,9 @@ func (c *CalendarCalendarsCmd) Run(ctx context.Context, flags *RootFlags) error
return r.Items, r.NextPageToken, nil
}
var items []*calendar.CalendarListEntry
nextPageToken := ""
if c.All {
all, collectErr := collectAllPages(c.Page, fetch)
if collectErr != nil {
return collectErr
}
items = all
} else {
items, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
items, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
if err := outfmt.WriteJSON(ctx, os.Stdout, map[string]any{
@ -173,19 +163,9 @@ func (c *CalendarAclCmd) Run(ctx context.Context, flags *RootFlags) error {
return r.Items, r.NextPageToken, nil
}
var items []*calendar.AclRule
nextPageToken := ""
if c.All {
all, collectErr := collectAllPages(c.Page, fetch)
if collectErr != nil {
return collectErr
}
items = all
} else {
items, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
items, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
if err := outfmt.WriteJSON(ctx, os.Stdout, map[string]any{

View File

@ -61,20 +61,9 @@ func (c *CalendarUsersCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.People, resp.NextPageToken, nil
}
var peopleList []*people.Person
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
peopleList = all
} else {
var err error
peopleList, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
peopleList, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -90,20 +90,9 @@ func (c *ChatMessagesListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Messages, resp.NextPageToken, nil
}
var messages []*chat.Message
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
messages = all
} else {
var err error
messages, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
messages, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -127,20 +127,9 @@ func (c *ChatMessagesReactionsListCmd) Run(ctx context.Context, flags *RootFlags
return resp.Reactions, resp.NextPageToken, nil
}
var reactions []*chat.Reaction
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
reactions = all
} else {
var err error
reactions, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
reactions, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -52,20 +52,9 @@ func (c *ChatSpacesListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Spaces, resp.NextPageToken, nil
}
var spaces []*chat.Space
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
spaces = all
} else {
var err error
spaces, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
spaces, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -59,20 +59,9 @@ func (c *ChatThreadsListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Messages, resp.NextPageToken, nil
}
var messages []*chat.Message
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
messages = all
} else {
var err error
messages, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
messages, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
threads := make([]*chatMessageThreadItem, 0, len(messages))

View File

@ -72,20 +72,9 @@ func (c *ClassroomCoursesListCmd) Run(ctx context.Context, flags *RootFlags) err
return resp.Courses, resp.NextPageToken, nil
}
var courses []*classroom.Course
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
courses = all
} else {
var err error
courses, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
courses, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -71,7 +71,7 @@ func (c *ClassroomCourseworkListCmd) Run(ctx context.Context, flags *RootFlags)
var coursework []*classroom.CourseWork
var nextPageToken string
if c.All {
all, err := collectAllPages(c.Page, fetch)
all, _, err := loadPagedItems(c.Page, true, fetch)
if err != nil {
return wrapClassroomError(err)
}

View File

@ -58,20 +58,9 @@ func (c *ClassroomGuardiansListCmd) Run(ctx context.Context, flags *RootFlags) e
return resp.Guardians, resp.NextPageToken, nil
}
var guardians []*classroom.Guardian
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
guardians = all
} else {
var err error
guardians, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
guardians, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
@ -245,20 +234,9 @@ func (c *ClassroomGuardianInvitesListCmd) Run(ctx context.Context, flags *RootFl
return resp.GuardianInvitations, resp.NextPageToken, nil
}
var invitations []*classroom.GuardianInvitation
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
invitations = all
} else {
var err error
invitations, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
invitations, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -60,20 +60,9 @@ func (c *ClassroomInvitationsListCmd) Run(ctx context.Context, flags *RootFlags)
return resp.Invitations, resp.NextPageToken, nil
}
var invitations []*classroom.Invitation
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
invitations = all
} else {
var err error
invitations, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
invitations, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -10,14 +10,7 @@ import (
)
func fetchClassroomPagedList[T any](all bool, page string, fetch func(string) ([]*T, string, error)) ([]*T, string, error) {
if all {
items, err := collectAllPages(page, fetch)
if err != nil {
return nil, "", err
}
return items, "", nil
}
return fetch(page)
return loadPagedItems(page, all, fetch)
}
func writeClassroomPagedList[T any](

View File

@ -70,7 +70,7 @@ func (c *ClassroomMaterialsListCmd) Run(ctx context.Context, flags *RootFlags) e
var materials []*classroom.CourseWorkMaterial
var nextPageToken string
if c.All {
all, err := collectAllPages(c.Page, fetch)
all, _, err := loadPagedItems(c.Page, true, fetch)
if err != nil {
return wrapClassroomError(err)
}

View File

@ -55,20 +55,9 @@ func (c *ClassroomStudentsListCmd) Run(ctx context.Context, flags *RootFlags) er
return resp.Students, resp.NextPageToken, nil
}
var students []*classroom.Student
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
students = all
} else {
var err error
students, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
students, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
@ -287,20 +276,9 @@ func (c *ClassroomTeachersListCmd) Run(ctx context.Context, flags *RootFlags) er
return resp.Teachers, resp.NextPageToken, nil
}
var teachers []*classroom.Teacher
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
teachers = all
} else {
var err error
teachers, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
teachers, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
@ -514,17 +492,9 @@ func (c *ClassroomRosterCmd) Run(ctx context.Context, flags *RootFlags) error {
}
return resp.Students, resp.NextPageToken, nil
}
if c.All {
all, collectErr := collectAllPages(c.Page, fetch)
if collectErr != nil {
return collectErr
}
students = all
} else {
students, studentsNextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
students, studentsNextPageToken, err = loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
}
if includeTeachers {
@ -539,17 +509,9 @@ func (c *ClassroomRosterCmd) Run(ctx context.Context, flags *RootFlags) error {
}
return resp.Teachers, resp.NextPageToken, nil
}
if c.All {
all, collectErr := collectAllPages(c.Page, fetch)
if collectErr != nil {
return collectErr
}
teachers = all
} else {
teachers, teachersNextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
teachers, teachersNextPageToken, err = loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
}

View File

@ -86,20 +86,9 @@ func (c *ClassroomSubmissionsListCmd) Run(ctx context.Context, flags *RootFlags)
return resp.StudentSubmissions, resp.NextPageToken, nil
}
var submissions []*classroom.StudentSubmission
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
submissions = all
} else {
var err error
submissions, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
submissions, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -62,20 +62,9 @@ func (c *ContactsDirectoryListCmd) Run(ctx context.Context, flags *RootFlags) er
return resp.People, resp.NextPageToken, nil
}
var peopleList []*people.Person
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
peopleList = all
} else {
var err error
peopleList, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
peopleList, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
type item struct {
@ -169,20 +158,9 @@ func (c *ContactsDirectorySearchCmd) Run(ctx context.Context, flags *RootFlags)
return resp.People, resp.NextPageToken, nil
}
var peopleList []*people.Person
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
peopleList = all
} else {
var err error
peopleList, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
peopleList, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
type item struct {
@ -275,20 +253,9 @@ func (c *ContactsOtherListCmd) Run(ctx context.Context, flags *RootFlags) error
return resp.OtherContacts, resp.NextPageToken, nil
}
var contacts []*people.Person
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
contacts = all
} else {
var err error
contacts, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
contacts, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
type item struct {

View File

@ -51,20 +51,9 @@ func (c *GmailHistoryCmd) Run(ctx context.Context, flags *RootFlags) error {
historyIDs := collectHistoryMessageIDs(resp)
return historyIDs.FetchIDs, resp.NextPageToken, nil
}
var ids []string
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
ids = all
} else {
var err error
ids, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
ids, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
if err := outfmt.WriteJSON(ctx, os.Stdout, map[string]any{

View File

@ -67,20 +67,9 @@ func (c *GroupsListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Memberships, resp.NextPageToken, nil
}
var memberships []*cloudidentity.GroupRelation
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
memberships = all
} else {
var err error
memberships, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
memberships, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
@ -219,20 +208,9 @@ func (c *GroupsMembersCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Memberships, resp.NextPageToken, nil
}
var memberships []*cloudidentity.Membership
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
memberships = all
} else {
var err error
memberships, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
memberships, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -60,20 +60,9 @@ func (c *KeepListCmd) Run(ctx context.Context, flags *RootFlags, keep *KeepCmd)
return resp.Notes, resp.NextPageToken, nil
}
var notes []*keepapi.Note
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
notes = all
} else {
var err error
notes, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
notes, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -109,20 +109,9 @@ func (c *PeopleSearchCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.People, resp.NextPageToken, nil
}
var peopleList []*people.Person
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
peopleList = all
} else {
var err error
peopleList, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
peopleList, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -89,20 +89,9 @@ func (c *TasksListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Items, resp.NextPageToken, nil
}
var items []*tasks.Task
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
items = all
} else {
var err error
items, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
items, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {

View File

@ -48,20 +48,9 @@ func (c *TasksListsListCmd) Run(ctx context.Context, flags *RootFlags) error {
return resp.Items, resp.NextPageToken, nil
}
var items []*tasks.TaskList
nextPageToken := ""
if c.All {
all, err := collectAllPages(c.Page, fetch)
if err != nil {
return err
}
items = all
} else {
var err error
items, nextPageToken, err = fetch(c.Page)
if err != nil {
return err
}
items, nextPageToken, err := loadPagedItems(c.Page, c.All, fetch)
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {