{
    "type": "object",
    "properties": {
        "type": {
            "type": "string",
            "description": "A label for the generator API. Currently unused",
            "enum": [
                "client",
                "server",
                "documentation"
            ]
        },
        "name": {
            "type": "string",
            "description": "Name of the config. Currently unused."
        },
        "apache": {
            "type": "boolean",
            "description": "Whether to include the Apache-2.0 license instead of the Unlicense"
        },
        "directories": {
            "type": "array",
            "description": "list of directories to create in output directory",
            "items": {
                "type": "string"
            }
        },
        "defaults": {
            "type": "object",
            "description": "Any settings/overrides to be passed to the adaptor. Required even if empty. May contain 'language' hint"
        },
        "partials": {
            "type": "object",
            "description": "A map containing the partial name as key and the template filename as value",
            "additionalProperties": {
                "type": "string"
            }
        },
        "perModel": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "input": {
                        "type": "string",
                        "description": "The input template filename"
                    },
                    "output": {
                        "type": "string",
                        "description": "The output filename, can be templated"
                    },
                    "defaults": {
                        "type": "object"
                    }
                },
                "additionalProperties": false
            }
        },
        "perOperation": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "input": {
                        "type": "string",
                        "description": "The input template filename"
                    },
                    "output": {
                        "type": "string",
                        "description": "The output filename, can be templated"
                    }
                },
                "additionalProperties": false
            }
        },
        "perApi": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "input": {
                        "type": "string",
                        "description": "The input template filename"
                    },
                    "output": {
                        "type": "string",
                        "description": "The output filename, can be templated"
                    },
                    "defaults": {
                        "type": "object"
                    }
                },
                "additionalProperties": false
            }
        },
        "transformations": {
            "type": "array",
            "minItems": 1,
            "items": {
                "type": "object",
                "description":"Must contain output, one of template or input is also required",
                "properties": {
                    "template": {
                        "type": "string"
                    },
                    "input": {
                        "type": "string"
                    },
                    "output": {
                        "type": "string"
                    }
                },
                "required": [
                    "output"
                ],
                "additionalProperties": false
            }
        },
        "touch": {
            "type": "string",
            "description": "A list of files to touch, separated by newlines, may be templated"
        }
    },
    "required": [
        "defaults",
        "transformations"
    ],
    "additionalProperties": false
}
