From 47fc02a8c71af4926148beb5d5cc0fc221aa5429 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Sun, 15 Dec 2024 14:37:33 +0300 Subject: Auto-commit 2024-12-15 --- content/posts/2021-02-13-jsonnet/index.md | 53 ++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) (limited to 'content/posts/2021-02-13-jsonnet/index.md') diff --git a/content/posts/2021-02-13-jsonnet/index.md b/content/posts/2021-02-13-jsonnet/index.md index 64a7fcc..7402880 100644 --- a/content/posts/2021-02-13-jsonnet/index.md +++ b/content/posts/2021-02-13-jsonnet/index.md @@ -3,11 +3,12 @@ categories = ['Без рубрики'] date = '2021-02-13T22:08:19Z' tags = ['go', 'it', 'разное'] title = 'Jsonnet' +image = 'logo.png' +++ Редко такое бывает, что случайно натыкаешься на какую-то технологию и она вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня такой технологией стал [Jsonnet](https://jsonnet.org/) от Google. -
![Jsonnet logo](/img/jsonnet.svg)
В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык, результатом выполнения которого будет сформированый JSON (и не только) документ([или несколько документов](https://jsonnet.org/learning/getting_started.html#multi)). +В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык, результатом выполнения которого будет сформированый JSON (и не только) документ([или несколько документов](https://jsonnet.org/learning/getting_started.html#multi)). [Если интересно, рекомендую сразу переходить к туториалу.](https://jsonnet.org/learning/tutorial.html) @@ -23,14 +24,56 @@ title = 'Jsonnet' Накидал простенький пример который формирует конфигурацию пайплайна для гипотетической CI системы: -``` -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 +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, + }) +} ``` Результат: -``` -{ "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" } ]} +```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" + } + ] +} ``` Круть же! -- cgit v1.2.3