{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "definitions": {
        "DataClass": {
            "properties": {
                "baseClass": {
                    "description": "The base class to inherit from.",
                    "type": "string"
                },
                "deprecationMessage": {
                    "description": "Obsolete message. DataClass is marked as obsolete when specified.",
                    "type": "string"
                },
                "extensionMethods": {
                    "description": "Enables generation of extension methods for modification.",
                    "type": "boolean"
                },
                "name": {
                    "description": "Name of the data class.",
                    "pattern": "^[0-9A-Z][A-Za-z0-9]*$",
                    "type": "string"
                },
                "omitDataClass": {
                    "description": "Omits generation of the data class.",
                    "type": "boolean"
                },
                "properties": {
                    "description": "Properties of the data class.",
                    "items": {
                        "$ref": "#/definitions/Property"
                    },
                    "type": "array"
                }
            },
            "required": [
                "name"
            ],
            "type": "object"
        },
        "Enumeration": {
            "properties": {
                "deprecationMessage": {
                    "description": "Obsolete message. Enumeration is marked as obsolete when specified.",
                    "type": "string"
                },
                "name": {
                    "description": "Name of the enumeration.",
                    "pattern": "^[0-9A-Z][A-Za-z0-9]*$",
                    "type": "string"
                },
                "values": {
                    "description": "The enumeration values.",
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                }
            },
            "required": [
                "name",
                "values"
            ],
            "type": "object"
        },
        "Property": {
            "properties": {
                "createOverload": {
                    "description": "Specifies that an overload for the property should be created.",
                    "type": "boolean"
                },
                "customImpl": {
                    "description": "Custom implementation of the property.",
                    "type": "boolean"
                },
                "customValue": {
                    "description": "Custom implementation of value presentation.",
                    "type": "boolean"
                },
                "default": {
                    "description": "Default value that will be used if no value is given.",
                    "type": "string"
                },
                "delegates": {
                    "description": "Dictionary delegates for named properties.",
                    "items": {
                        "$ref": "#/definitions/Property"
                    },
                    "type": "array"
                },
                "deprecationMessage": {
                    "description": "Obsolete message. Property is marked as obsolete when specified.",
                    "type": "string"
                },
                "disallowedCharacter": {
                    "description": "Character that must be double-quoted.",
                    "type": "string"
                },
                "format": {
                    "description": "Argument formatting for the property. '{value}' is replaced by the value of the property.",
                    "type": "string"
                },
                "help": {
                    "description": "Help text for the property.",
                    "type": "string"
                },
                "itemFormat": {
                    "description": "Item formatting for dictionaries. '{key}' and '{value}' are replaced accordingly.",
                    "type": "string"
                },
                "json": {
                    "description": "Name used when serializing to JSON.",
                    "type": "string"
                },
                "name": {
                    "description": "Name of the property.",
                    "pattern": "^[0-9A-Z][A-Za-z0-9]*$",
                    "type": "string"
                },
                "noArgument": {
                    "description": "Omits argument parsing.",
                    "type": "boolean"
                },
                "onlyDelegates": {
                    "type": "boolean"
                },
                "quoteMultiple": {
                    "description": "Specifies if list items should be double quoted.",
                    "type": "boolean"
                },
                "secret": {
                    "description": "Specifies that the value is secret and should be hidden in output.",
                    "type": "boolean"
                },
                "separator": {
                    "description": "Separator used for items of collection types.",
                    "type": "string"
                },
                "type": {
                    "description": "Type of the property. I.e., bool, int, string, List<int>, Dictionary<string, object>, Lookup<string, int.>",
                    "type": "string"
                }
            },
            "required": [
                "name",
                "type"
            ],
            "type": "object"
        },
        "SettingsClass": {
            "description": "The settings of the task.",
            "properties": {
                "baseClass": {
                    "description": "The base class to inherit from.",
                    "type": "string"
                },
                "deprecationMessage": {
                    "description": "Obsolete message. DataClass is marked as obsolete when specified.",
                    "type": "string"
                },
                "extensionMethods": {
                    "description": "Enables generation of extension methods for modification.",
                    "type": "boolean"
                },
                "name": {
                    "description": "Name of the data class.",
                    "pattern": "^[0-9A-Z][A-Za-z0-9]*$",
                    "type": [
                        "string",
                        "null"
                    ]
                },
                "omitDataClass": {
                    "description": "Omits generation of the data class.",
                    "type": "boolean"
                },
                "properties": {
                    "description": "Properties of the data class.",
                    "items": {
                        "$ref": "#/definitions/Property"
                    },
                    "type": "array"
                }
            },
            "type": "object"
        },
        "Task": {
            "properties": {
                "commonPropertySets": {
                    "description": "Appends the properties of the named property sets.",
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                "customAssertion": {
                    "description": "Custom process assertion implementation.",
                    "type": "boolean"
                },
                "customStart": {
                    "description": "Custom start implementation.",
                    "type": "boolean"
                },
                "definiteArgument": {
                    "description": "Argument that will always be printed independently of any set property.",
                    "type": "string"
                },
                "deprecationMessage": {
                    "description": "Obsolete message. Task is marked as obsolete when specified.",
                    "type": "string"
                },
                "help": {
                    "description": "Help or introduction text to for the tool. Supports 'a-href', 'c', 'em', 'b', 'ul', 'li' and 'para' tags for better formatting.",
                    "type": "string"
                },
                "logLevelParsing": {
                    "description": "Enables log level parsing",
                    "type": "boolean"
                },
                "officialUrl": {
                    "description": "Url of the task. If not specified, the tool url will be used.",
                    "type": "string"
                },
                "omitCommonProperties": {
                    "description": "Skips appending of common task properties.",
                    "type": "boolean"
                },
                "postProcess": {
                    "description": "Generates a post-process hook",
                    "type": "boolean"
                },
                "postfix": {
                    "description": "Postfix for the task alias.",
                    "pattern": "^[0-9A-Z][A-Za-z0-9]*$",
                    "type": "string"
                },
                "preProcess": {
                    "description": "Generates a pre-process hook",
                    "type": "boolean"
                },
                "returnType": {
                    "description": "Return type of the task.",
                    "type": "string"
                },
                "settingsClass": {
                    "$ref": "#/definitions/SettingsClass"
                }
            },
            "type": "object"
        }
    },
    "id": "https://raw.githubusercontent.com/nuke-build/nuke/master/source/Nuke.CodeGeneration/schema.json",
    "properties": {
        "$schema": {
            "type": "string"
        },
        "_metadata": {
            "additionalProperties": {
                "type": [
                    "string",
                    "number",
                    "integer",
                    "boolean",
                    "object",
                    "array"
                ]
            },
            "description": "Can be used to store additional information about the tool.",
            "type": "object"
        },
        "commonTaskProperties": {
            "description": "Common properties for all tasks.",
            "items": {
                "$ref": "#/definitions/Property"
            },
            "type": "array"
        },
        "commonTaskPropertySets": {
            "additionalProperties": {
                "items": {
                    "$ref": "#/definitions/Property"
                },
                "type": "array"
            },
            "description": "Named common property sets which can be used by tasks.",
            "type": "object"
        },
        "customExecutable": {
            "description": "Defines that locating the executable is implemented customly.",
            "type": "boolean"
        },
        "customLogger": {
            "description": "Enables custom logger.",
            "type": "boolean"
        },
        "dataClasses": {
            "description": "Common used data classes.",
            "items": {
                "$ref": "#/definitions/DataClass"
            },
            "type": "array"
        },
        "deprecationMessage": {
            "description": "Obsolete message. Tool is marked as obsolete when specified.",
            "type": "string"
        },
        "enumerations": {
            "description": "Used enumerations.",
            "items": {
                "$ref": "#/definitions/Enumeration"
            },
            "type": "array"
        },
        "help": {
            "description": "Help or introduction text to for the tool. Supports 'a-href', 'c', 'em', 'b', 'ul', 'li' and 'para' tags for better formatting.",
            "type": "string"
        },
        "imports": {
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "name": {
            "description": "Name of the Tool.",
            "pattern": "^[0-9A-Z][A-Za-z0-9]*$",
            "type": "string"
        },
        "officialUrl": {
            "_format": "uri",
            "description": "Url to the official website.",
            "type": "string"
        },
        "packageExecutable": {
            "description": "Exact name of the main executable found in the './tools' folder. Case-sensitive.",
            "type": "string"
        },
        "packageId": {
            "description": "ID for the NuGet package.",
            "type": "string"
        },
        "pathExecutable": {
            "description": "Exact name of the executable that can be found via 'where' or 'which'.",
            "type": "string"
        },
        "references": {
            "description": "Contains all references on which this definition is based on. Allows checking for updates.",
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "tasks": {
            "description": "Help or introduction text to for the tool. Can contain HTML tags for better formatting.",
            "items": {
                "$ref": "#/definitions/Task"
            },
            "type": "array"
        }
    },
    "required": [
        "name",
        "officialUrl"
    ],
    "title": "Tool specification schema file by NUKE",
    "type": "object"
}