Generador de archivos basado en plantillas con entrada de datos json

Estoy buscando una herramienta, preferiblemente con una licencia FLOSS, que pueda hacer algo como lo siguiente:

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

¿dónde thetoolestá la herramienta ejecutable que estoy buscando? ¿ mytemplate.c.someformatMi archivo de plantilla parece un archivo C pero con marcado de estilo de plantilla para el reemplazo de datos? mydata.jsonContiene datos para completar la plantilla. myschema.jsonEs un esquema que explica las conexiones entre los elementos de datos (es bueno tenerlo, pero no es estrictamente obligatorio) y myoutput.ces el archivo C generado.

¿Existe tal herramienta por ahí? El soporte json nativo es clave aquí, donde los mensajes de error pueden resaltar áreas problemáticas en la fuente json. XML no es una opción. No necesita tener soporte explícito para C. Debe poder generar archivos en formato genérico ASCII/UTF-8.

Debe poder ejecutarse como una herramienta de línea de comandos tanto en Windows como en GNU/Linux. También es bueno si se puede vincular como una biblioteca desde python o C.

Ejemplo

la sintaxis no se ha verificado, ya que necesito la herramienta para hacerlo.

miplantilla.c.algúnformato

#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);
}

misdatos.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"
}

esquema.json

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

misalida.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);
}
¿ Por qué querrías hacer esto? Si genera muchos archivos fuente casi idénticos, esto le pide a gritos que refactorice su fuente ;-) Huelo un problema XY aquí.
@JanDoggen: ¿Qué archivos fuente son casi idénticos? Mi ejemplo, por supuesto, está minimizado. En el mundo real tengo miles de entradas json.
¿Funciona esto para su caso de uso? github.com/mickep76/tf

Respuestas (1)

Hay muchos lenguajes de programación, muchos motores de plantillas y muchos analizadores JSON (y su solicitud parece estar en un contexto de programación), así que simplemente combine uno de cada uno y obtendrá lo que desea.

Por ejemplo, mustache es un formato de plantilla simple con implementaciones en varios lenguajes, incluido un módulo Pystache de Python. (Se basa en CTemplate , que viene como una biblioteca de C++).

Super User no es un servicio de escritura de guiones, pero aquí hay algo para comenzar .

¡Gracias! He agregado un ejemplo en la publicación original. Bigote parece un poco demasiado simple. Creo que necesito expresiones más flexibles. De lo contrario, parece un buen comienzo.