From 1d492807e6d48a3c5fd29d37970dfdf33e91cbad Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 12 Nov 2019 16:05:32 +0300 Subject: [PATCH] =?utf8?q?NNCP=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B5=D1=85?= =?utf8?q?=D0=B0=D0=BB=20=D0=BD=D0=B0=20Hjson=20=D1=84=D0=BE=D1=80=D0=BC?= =?utf8?q?=D0=B0=D1=82=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit https://hjson.org/ С самого начала меня YAML напрягал своей сложностью. Соответственно, и сложностью библиотек для работы с ним. Но и читать YAML и понимать дело не простое может быть. Изначально для конфигов какой формат можно использовать из библиотек в Go штатно представляемых? JSON, XML. XML сразу нет, без объяснений. JSON в GoVPN был изначально, да и на работе в паре проектов он так и остался, но очень напрягает в нём отсутствие комментариев и возможность оставлять trailing comma. YAML имеет одну мощную штуку в виде ссылок, где можно меньше делать copy-paste. Теоретически в GoVPN или NNCP это могло бы пригождаться. Но я уверен что все инсталляции достаточно малы чтобы чуть-чуть возможного copy-paste не было бы страшным. Посмотрел на TOML: в целом подходит, относительно прост, но его, как ни крути, но может быть очень сложно интерпретировать человеку: [[foo.bar]] baz = 123 [[foo.bar]] abc = 123 на самом деле будет вот такой структурой: { "foo": { "bar": [ {"baz": 123 }, {"abc": 123 } ] } } плюс само по себе задание словаря в TOML может быть разнесено по файлу. TOML в целом мне нравится: он реально хорошо подходит для конфигурации, относительно прост (существенно проще YAML), имеет достаточно возможностей (в отличии от INI, которого формально то и нет, плюс типов данных мало). Но NNCP-шная конфигурация в нём выглядит по-уродски. И тут я вспомнил про Yggdrasil и dnscrypt проекты, где было что-то типа JSON, но с комментариями и меньшим синтаксическим "мусором" для конфига. Hjson прям то, что надо. Даже diff относительно YAML получается маленьким и всякие "foo: bar\nbar: 123" остаются без изменений. github.com/hjson/hjson-go библиотека достаточно компакта чтобы я её посчитал минималистичной. Более того, она штатно предлагает распаковывать Hjson в структуры через пересериализацию в JSON -- накладно, безусловно, но для конфигов это совершенно несущественно (а ведь Hjson для них только будет использован), зато красиво решена проблема с unmarshal с reflect-ом в структуры. A data format for Humans should be lean and simple. Human !== Developer Human != Developer Human <> Developer Human .NE. Developer Human ne Developer Human /= Developer Human '= Developer Human ~= Developer Human -ne Developer -- 2.48.1