Недавно при создании Podify я столкнулся с распространенной проблемой: необходимость моделировать HTTP API с нумерацией страниц, не желая, чтобы все части моего приложения знали, как с этим справиться.

В частности, я хотел иметь возможность перебирать результаты, которые могут быть распределены по страницам, не заботясь о загрузке следующей страницы, когда это необходимо.

API Spotify

Возьмем для примера этот, а именно эту конечную точку, которая возвращает треки для данного плейлиста. Первоначально простой запрос GET будет делать:

GET https://api.spotify.com/v1/playlists/{playlist_id}/tracks

Это уже неплохо, но возвращает максимум 100 треков.

Проблема

Чтобы получить следующие 100 треков, вы должны выполнить вызов с параметром смещения:

GET https://api.spotify.com/v1/playlists/{playlist_id}/tracks?offset=100

Это работает хорошо, но, как было сказано ранее, цель состоит в том, чтобы иметь возможность легко перебирать эти результаты из кода Crystal, не беспокоясь о деталях реализации.

Итератор

Я очень новичок в хрустале, и, как и большинство, у меня есть опыт работы с рубином. В Ruby вы можете использовать Enumerator для достижения этой цели, как это описано здесь.

Чтобы выполнить то, что я описал выше как мой идеальный API для итерации, мы должны сначала определить класс и включить модуль Iterator.

На странице итератора документации Crystal говорится следующее:

Чтобы реализовать итератор, вам нужно определить метод #next, который должен возвращать следующий элемент в последовательности, или Iterator::Stop::INSTANCE, который сигнализирует об окончании последовательности (вы можете вызвать #stop внутри итератора как ярлык) .

Затем, как и в ruby, основная задача — определить метод next, который будет проходить по коллекции.

Для этого нам нужно несколько вещей:

  • Следите за элементами коллекции
  • Знайте, когда мы достигли конца коллекции

Ниже приведен полный код, который обеспечит эту функциональность:

Сделанный! Теперь мы можем перебирать треки, используя:

Примечание. Если вам нужен инструмент для создания плейлистов Spotify на основе ваших подкастов, обратите внимание на Podify!