aboutsummaryrefslogtreecommitdiff
path: root/content/posts/2021-02-13-jsonnet
diff options
context:
space:
mode:
Diffstat (limited to 'content/posts/2021-02-13-jsonnet')
-rw-r--r--content/posts/2021-02-13-jsonnet/index.md53
-rw-r--r--content/posts/2021-02-13-jsonnet/logo.pngbin0 -> 221249 bytes
2 files changed, 48 insertions, 5 deletions
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.
-<figure class="wp-block-image">![Jsonnet logo](/img/jsonnet.svg)</figure>В кратце, это надмножество 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"
+ }
+ ]
+}
```
Круть же!
diff --git a/content/posts/2021-02-13-jsonnet/logo.png b/content/posts/2021-02-13-jsonnet/logo.png
new file mode 100644
index 0000000..c87fd63
--- /dev/null
+++ b/content/posts/2021-02-13-jsonnet/logo.png
Binary files differ