[О блоге]
[наверх]
[пред]
[2019-11-12 16:05:32+03:00]
[1d492807e6d48a3c5fd29d37970dfdf33e91cbad]
Темы: [nncp]
NNCP переехал на Hjson формат конфигов
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
[оставить комментарий]