Go
Пагинация
Одна страница, все страницы или по одному элементу.
Одна страница
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))}Метод List возвращает *openemail.Page с Items, HasMore и NextCursor. Передайте NextCursor обратно через openemail.WithCursor с теми же фильтрами, чтобы прочитать следующую страницу.
Все страницы
failed, err := client.Emails.ListAll(ctx, openemail.WithStatus("failed"))if err != nil { return err} fmt.Println(len(failed), "messages failed")Метод ListAll идёт по курсору до конца и возвращает все элементы в одном срезе. Сбой на любой странице проваливает весь вызов.
По одному элементу
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()Метод Iterate возвращает *openemail.Iterator, который запрашивает следующую страницу, только когда цикл до неё доходит, поэтому break останавливает запросы. Обходите All() через range или вызывайте Next, Item и Err в обычном цикле.
Итератор останавливается, когда API повторяет курсор, по которому он уже прошёл, поэтому обход никогда не может зациклиться.