Недавно при создании 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!