Всякий раз, когда мне нужно было распарсить что-то JSON'оподобное, я использовал утилиту jq. В состав дефолтных пакетов она еще входит не во всех линуксовых дистрибутивах, но уж на моем компьютере она точно была всегда с того момента, как я о ней узнал. Я думаю, что сегодня она действительно стала тем, чем видели ее разработчики — sed'ом для данных в формате JSON.

И все же было обидно, что максимум, что я могу сходу написать — это cat file.json | jq .["key"][0]. Поэтому я решил изучить эту штуку поподробнее. Всегда же приятно показать коллегам, как вписываешь в терминал адскую нечитаемую команду, которая, тем не менее, делает ровно то, что требуется. В программную архитектуру сегодня умеет каждый, а вот буквально переложить джейсон — это задача поинтереснее :)

Одним из источников вдохновения для меня стала старая статья про шахматы на sed. Раз уж мы и тут имеем дело с sed (пусть и для данных другого формата), то логичным выбором для учебного проекта тоже становится игра. Но я не шахматист, а больше картежник, поэтому и запрограммировать ради обучения решил карточную игру.

Выбор пал на Scoundrel — это игра-рогалик, в которую можно в одиночку играть, имея на руках стандартную колоду из 54 карт. По сути дела, пасьянс с некоторым rouge-like антуражем. Задумка обалденная, но когда я играл в эту игру реальными картами, мне очень не хватало погружения: все же сложно представлять, что бубновая десятка — это мощнейшее оружие, а трефовый туз — жесткий босс, от которого с высокой вероятностью придется сбегать. К счастью, программирование позволяет запрятать всю внутреннюю карточную логику настолько глубоко, что человек, который впервые столкнется с этой игрой в терминале, вряд ли догадается, что первоисточником стал пасьянс.

Опыта в функциональном программировании у меня до этого проекта, по сути, не было никакого, так что матерые ФП-шники, возможно, посмеются над наивными решениями, которые я ни об кого не валидировал. И все же это полноценная работающая игра на чистой парсилке джейсонов. Вот!

Проект на гитхабе