[about] [index] [prev] [2019-11-12 16:05:32+03:00] [1d492807e6d48a3c5fd29d37970dfdf33e91cbad]
Topics: [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

[leave comment]