Мигрировал проект про статистику пулл-реквестов GitHub с Kotlin/JS на multiplatform. На удивление, сама миграция прошла довольно гладко — немного пошаманить с билд-скриптом, переименовать папочки и готово.

Решил заодно попробовать добавить native-реализацию. Проблем было меньше, чем я ожидал:

  1. actual/expect использовал только для тестов: чтобы сделать обертку для запуска корутин и чтобы загрузить ресурсы. Вообще, по-хорошему, обе эти функции должны из коробки идти.
  2. Для работы с файлами в стандартной библиотеке ничего нет. Есть kotlinx-io, но она нормально не завелась из-за проблемы с импортом AutoClosable. Ловя флешбеки от качества библиотек Jetbrains, я в итоге использовал Okio. Не могу сказать, что API великолепно, но хотя бы работает.
  3. Называть платформу native — небольшое лукавство. Это скорее POSIX, если судить по поддерживаемым платформам, и это местами откровенно торчит.
  4. Ktor клиент не смог сам подтянуть из зависимостей себе HttpClientEngine и кинул не очень помогающую ошибку. Оказалось, что для native есть несколько реализаций и надо явно указать нужную. Почему нельзя это сделать на этапе компиляции, не ясно.
  5. Больше всего времени потратил на десериализацию JSON (sic!). Предыдущий костыль перестал работать с унылым ArrayIndexOutOfBoundsException. Я уже раз в четвертый пытался понять великую задумку kotlinx.serialization, даже пробовал сделать изолированный баг-репорт, но ничего толком не вышло. В итоге поменял один костыль на другой: избавился от шаблонных классов и сделал класс-композицию.
  6. Старые проблемы остались по большей части в силе.
  7. Наконец-то использовал по делу \r! Он весьма пригодился для простенького отображения прогресса.

Несмотря на проблемы, в целом получилось норм. Можно улучшить валидацию ввода и добавить альтернативные способы вывода результата, но решил, что там все понятно и не стоит тратить на это время.