Генератор файлов на основе шаблонов с вводом данных json

Я ищу инструмент, желательно с лицензией FLOSS, который может делать что-то вроде следующего:

thetool --template mytemplate.c.someformat --data mydata.json --schema myschema.json --out myoutput.c

где thetoolнаходится исполняемый инструмент, который я ищу, mytemplate.c.someformatмой файл шаблона выглядит как файл C, но с разметкой стиля шаблона для замены данных, mydata.jsonсодержит данные для заполнения шаблона, myschema.jsonявляется схемой, объясняющей связи между элементами данных (приятно иметь, но не является строго обязательным) и myoutput.cявляется сгенерированным файлом C.

Есть ли такой инструмент там? Ключевым моментом здесь является встроенная поддержка json, где сообщения об ошибках могут выделять проблемные области в исходном коде json. XML не вариант. Ему не обязательно иметь явную поддержку C. Он должен иметь возможность генерировать файлы в общем формате ASCII/UTF-8.

Он должен работать как инструмент командной строки как в Windows, так и в GNU/Linux. Также хорошо, если его можно слинковать как библиотеку из python или C.

Пример

синтаксис не проверен, так как мне нужен инструмент для этого.

mytemplate.c.someformat

#include <stdio.h>

int main(void) {
  #{{ for person in persons }}
    #{{ if person.likes.length > 0 }}
      printf("#{{ person.name }} likes:\n");
      #{{ for liked in person.likes }}
        printf("  * #{{ likes.name }}\n");
      #{{ endfor }}
    #{{ else }}
      printf("#{{ person.name }} doesn't like anyone.");
    #{{ endif }}
    printf("\n");
  #{{ endfor }}

  return(0);
}

mydata.json

{
  "persons": {
    {
      "id": "10",
      "name": "Mr Mister",
      "likes": {
        "20",
        "22"
      }
    },
    {
      "id": "20",
      "name": "Ms Missy",
      "likes": {
        "10",
      }
    },
    {
      "id": "22",
      "name": "No Body",
      "likes":
      {}
    }
  },
  "schema": "personSchema"
}

myschema.json

{
  "personSchema": {
    {
      "id": {
        "type": "integer",
        "attrib": "unique"
      }
      "name": {
        "type": "string"
      }
      "likes":
      {
        "type": "integer",
        "connection": "personSchema.id"
      }
    }
  }
}

мой вывод.c

#include <stdio.h>

int main(void) {
      printf("Mr Mister likes:\n");
        printf("  * Ms Missy\n");
        printf("  * No Body\n");
    printf("\n");
      printf("Ms Missy likes:\n");
        printf("  * Mr Mister\n");
    printf("\n");
      printf("No Body doesn't like anyone.");
    printf("\n");

    return(0);
}
Почему вы хотите это сделать? Если вы создаете много почти идентичных исходных файлов, это кричит о рефакторинге вашего исходного кода ;-) Я чувствую здесь проблему XY .
@JanDoggen: Какие исходные файлы почти идентичны? Мой пример конечно минимизирован. В реальном мире у меня есть тысячи записей json.
это работает для вашего варианта использования? github.com/mickep76/tf

Ответы (1)

Существует много языков программирования, множество механизмов шаблонов и множество синтаксических анализаторов JSON (и ваш запрос, похоже, находится в контексте программирования), поэтому просто объедините по одному из них, и вы получите то, что хотите.

Например, mustache — это простой формат шаблона с реализациями на многих различных языках, включая модуль Python pystache . (Сам он основан на CTemplate , который поставляется в виде библиотеки C++.)

Super User — это не служба написания сценариев, но вот кое-что для начала .

Спасибо! Я добавил пример в исходное сообщение. Усы кажутся слишком простыми. Думаю, мне нужны более гибкие выражения. В противном случае это кажется хорошим началом.