summaryrefslogtreecommitdiff
path: root/content/posts/2021-02-13-jsonnet.md
diff options
context:
space:
mode:
author2026-01-31 20:38:50 +0300
committer2026-01-31 23:38:53 +0300
commit49458f5ffd5a48c465117ec27f6437683f75acc1 (patch)
treea99ee68116d10c2b2e5a70c442cdadec95ba793c /content/posts/2021-02-13-jsonnet.md
downloadblog-49458f5ffd5a48c465117ec27f6437683f75acc1.tar.gz
blog-49458f5ffd5a48c465117ec27f6437683f75acc1.tar.bz2
blog-49458f5ffd5a48c465117ec27f6437683f75acc1.tar.xz
blog-49458f5ffd5a48c465117ec27f6437683f75acc1.zip
initial
Diffstat (limited to '')
-rw-r--r--content/posts/2021-02-13-jsonnet.md101
1 files changed, 101 insertions, 0 deletions
diff --git a/content/posts/2021-02-13-jsonnet.md b/content/posts/2021-02-13-jsonnet.md
new file mode 100644
index 0000000..e4ea27e
--- /dev/null
+++ b/content/posts/2021-02-13-jsonnet.md
@@ -0,0 +1,101 @@
+---
+categories:
+- Без рубрики
+date: '2021-02-13T22:08:19Z'
+image: files/2021-02-13-jsonnet_logo.webp
+tags:
+- go
+- it
+- разное
+title: Jsonnet
+---
+
+Редко такое бывает, что случайно натыкаешься на какую-то технологию и она
+вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня
+такой технологией стал [Jsonnet](https://jsonnet.org/) от Google.
+
+В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит
+не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык,
+результатом выполнения которого будет сформированый JSON (и не только)
+документ(или несколько документов[^1]).
+[^1]:https://jsonnet.org/learning/getting_started.html#multi
+
+Если интересно, рекомендую сразу переходить к туториалу —
+https://jsonnet.org/learning/tutorial.html.
+
+## Почему же это круто?
+
+Ну, во-первых, он реально мощный и простой. С его помощью можно формировать
+документы любой сложности.
+
+Во-вторых, его можно встроить в свою программу на Go (и не только, но на Go —
+проще всего — https://jsonnet.org/ref/bindings.html), и это даст бесплатно
+мощный DSL для написания очень гибких конфигов.
+
+В третьих, ну камон, приятно же когда компьютер берет на себя рутинную работу по
+формированию больших и сложных JSON’ов!
+
+## Пример
+
+Накидал простенький пример который формирует конфигурацию пайплайна для
+гипотетической CI системы:
+
+```json
+local map(arr, predicate) = // определяем функцию map
+if std.length(arr) == 0 then
+ []
+ else
+ [
+ predicate(arr[0])
+ ] + map(arr[1:], predicate); // функциональненько!
+local tasks = [['go1.14', '1.14-alpine'],['go1.15', '1.15-alpine'],['go1.16-RC', '1.16-rc-alpine']];
+local commands = ['go build', 'go test']; // Общая часть
+{ // Результирующий JSON
+ pipeline: map(tasks, function (task) { // Вызов map от tasks
+ name: task[0],
+ image: "golang:"+task[1],
+ commands: commands,
+ })
+}
+```
+
+Результат:
+
+```json
+{
+ "pipeline": [
+ {
+ "commands": [
+ "go build",
+ "go test"
+ ],
+ "image": "golang:1.14-alpine",
+ "name": "go1.14"
+ },
+ {
+ "commands": [
+ "go build",
+ "go test"
+ ],
+ "image": "golang:1.15-alpine",
+ "name": "go1.15"
+ },
+ {
+ "commands": [
+ "go build",
+ "go test"
+ ],
+ "image": "golang:1.16-rc-alpine",
+ "name": "go1.16-RC"
+ }
+ ]
+}
+```
+
+Круть же!
+
+Да, на небольшом примере не очень показательно, но даже тут, скажем, при добавлении новой цели сборки будет достаточно слегка подправить массив tasks и автоматически сформируется все остальное, а не копипаст целой секции и ручная правка в нужных местах.
+
+Я оставил за скобками то, что этот шаблонизатора позволяет формировать не только JSON но и фактически любой другой текстовый формат. И даже из одного скрипта формировать несколько документов разного формата. При этом локальные переменные будут использоваться общие. Теоретически, если упороться, можно одним скриптом сформировать весь /etc на новом сервере. Почему бы и нет?:)
+
+Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив! \ No newline at end of file