Paginación
Una página, todas las páginas o un elemento cada vez.
Una página
page, err := client.Threads.List(ctx, openemail.WithFolder("inbox"), openemail.WithLimit(25))if err != nil { return err} for _, thread := range page.Items { fmt.Println(thread.ID())} if page.HasMore { next, err := client.Threads.List(ctx, openemail.WithFolder("inbox"), openemail.WithCursor(page.NextCursor)) if err != nil { return err } fmt.Println(len(next.Items))}Un método List devuelve un *openemail.Page con Items, HasMore y NextCursor. Vuelve a pasar NextCursor con openemail.WithCursor, con los mismos filtros, para leer la página siguiente.
Todas las páginas
failed, err := client.Emails.ListAll(ctx, openemail.WithStatus("failed"))if err != nil { return err} fmt.Println(len(failed), "messages failed")Un método ListAll sigue el cursor hasta el final y devuelve todos los elementos en un solo slice. Un fallo en cualquier página hace fallar toda la llamada.
Un elemento cada vez
for contact, err := range client.Contacts.Iterate(ctx, openemail.WithLimit(100)).All() { if err != nil { return err } if contact.String("email") == "[email protected]" { break }} events := client.Emails.IterateEvents(ctx, "msg_3f9a1c07d2b84e6a9c5b1f20") for events.Next() { fmt.Println(events.Item().String("type"))} return events.Err()Un método Iterate devuelve un *openemail.Iterator, que pide la página siguiente solo cuando el bucle llega a ella, así que un break detiene las peticiones. Recorre All() con range, o llama a Next, Item y Err en un bucle normal.
Un iterador se detiene cuando la API repite un cursor que ya ha seguido, así que un recorrido nunca puede entrar en un bucle sin fin.