[
    {
        "type": "enum",
        "name": "Datatype",
        "symbols": [
            "null",
            "boolean",
            "int",
            "long",
            "float",
            "double",
            "bytes",
            "string",
            "record",
            "enum",
            "array",
            "map",
            "File"
        ]
    },

    {
        "type": "record",
        "name": "File",
        "fields": [
            { "name": "path", "type": "string" },
            { "name": "checksum", "type": ["null", "string"] },
            { "name": "size", "type": ["null", "long"] },
            {
                "name": "secondaryFiles",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "File"
                    }
                ]
            }
        ]
    },

    {
        "type": "record",
        "name": "Expression",
        "fields": [
            { "name": "class", "type": "string" }
        ]
    },

    {
        "type": "record",
        "name": "Ref",
        "fields": [
            { "name": "id", "type": "string" }
        ]
    },

    {
        "type": "record",
        "name": "CommandLineBinding",
        "fields": [
            { "name": "position", "type": ["null", "int"] },
            { "name": "prefix", "type": [ "null", "string"] },
            { "name": "separator", "type": ["null", "string"] },
            { "name": "itemSeparator", "type": ["null", "string"] },
            { "name": "valueFrom", "type": ["null", "Expression", "Ref"] },
            { "name": "loadContents", "type": ["null", "boolean"] }
        ]
    },

    {
        "type": "record",
        "name": "OutputBinding",
        "fields": [
            { "name": "valueFrom", "type": ["null", "Expression", "Ref"] },
            { "name": "glob", "type": ["null", "string"] },
            { "name": "loadContents", "type": ["null", "boolean"] }
        ]
    },

    {
        "type": "record",
        "name": "DataLink",
        "fields": [
            { "name": "source", "type": "string" }
        ]
    },

    {
        "type": "record",
        "name": "ExternallyDefinedInput",
        "fields": [
            { "name": "def", "type": "string" },
            {
                "name": "connect",
                "type": [
                    "DataLink",
                    {
                        "type": "array",
                        "items": "DataLink"
                    }
                ]
            },
            { "name": "id", "type": ["null", "string"] }
        ]
    },

    {
        "type": "record",
        "name": "ExternallyDefinedOutput",
        "fields": [
            { "name": "def", "type": "string" },
            { "name": "id", "type": "string" }
        ]
    },

    {
        "type": "record",
        "name": "Schema",
        "fields": [
            { "name": "name", "type": ["null", "string"] },
            { "name": "id", "type": ["null", "string"] },
            {
                "name": "type",
                "type": [
                    "Datatype",
                    "Schema",
                    "string",
                    {
                        "type": "array",
                        "items": [ "Datatype", "Schema", "string" ]
                    }
                ]
            },
            {
                "name": "fields",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "Schema"
                    }
                ]
            },
            {
                "name": "symbols",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "string"
                    }
                ]
            },
            {
                "name": "items",
                "type": [
                    "null",
                    "Datatype",
                    "Schema",
                    "string",
                    {
                        "type": "array",
                        "items": [ "Datatype", "Schema", "string" ]
                    }
                ]
            },
            {
                "name": "values",
                "type": [
                    "null",
                    "Datatype",
                    "Schema",
                    "string",
                    {
                        "type": "array",
                        "items": [ "Datatype", "Schema", "string" ]
                    }
                ]
            },
            {
                "name": "commandLineBinding",
                "type": [ "null", "CommandLineBinding" ]
            },
            {
                "name": "outputBinding",
                "type": [ "null", "OutputBinding" ]
            },
            {
                "name": "connect",
                "type": [
                    "null",
                    "DataLink",
                    {
                        "type": "array",
                        "items": "DataLink"
                    }
                ]
            }
        ]
    },

    {
        "type": "record",
        "name": "ToolDependency",
        "fields": [
            { "name": "class", "type": "string" }
        ]
    },

    {
        "type": "record",
        "name": "FileDef",
        "fields": [
            {"name": "filename", "type": "string"},
            {
                "name": "value",
                "type": ["null", "string", "Expression"]
            }
        ]
    },

    {
        "type": "record",
        "name": "EnvironmentDef",
        "fields": [
            {"name": "env", "type": "string"},
            {
                "name": "value",
                "type": ["null", "string", "Expression"]
            }
        ]
    },

    {
        "type": "record",
        "name": "CommandLineTool",
        "fields": [
            {
                "name": "baseCommand",
                "type": [
                    "string",
                    {
                        "type": "array",
                        "items": "string"
                    }
                ]
            },
            {
                "name": "arguments",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": ["string", "CommandLineBinding"]
                    }
                ]
            },
            {
                "name": "stdin",
                "type": ["null", "Expression", "Ref"]
            },
            {
                "name": "stdout",
                "type": ["null", "string", "Expression", "Ref"]
            },
            {
                "name": "inputs",
                "type": {
                    "type": "array",
                    "items": "Schema"
                }
            },
            {
                "name": "outputs",
                "type": {
                    "type": "array",
                    "items": "Schema"
                }
            },
            {
                "name": "requirements",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "ToolDependency"
                    }
                ]
            },
            {
                "name": "hints",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "ToolDependency"
                    }
                ]
            },
            {
                "name": "schemaDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "Schema"
                    }
                ]
            },
            {
                "name": "expressionDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": ["string", "Ref"]
                    }
                ]
            },
            {
                "name": "fileDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "FileDef"
                    }
                ]
            },
            {
                "name": "environmentDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "EnvironmentDef"
                    }
                ]
            }
        ]
    },

    {
        "type": "record",
        "name": "ExpressionTool",
        "fields": [
            {
                "name": "script",
                "type": "Expression"
            },
            {
                "name": "inputs",
                "type": {
                    "type": "array",
                    "items": "Schema"
                }
            },
            {
                "name": "outputs",
                "type": {
                    "type": "array",
                    "items": "Schema"
                }
            },
            {
                "name": "schemaDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "Schema"
                    }
                ]
            },
            {
                "name": "expressionDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": ["string", "Ref"]
                    }
                ]
            }
        ]
    },

    {
        "type": "record",
        "name": "Process",
        "fields": [
            {
                "name": "inputs",
                "type": {
                    "type": "array",
                    "items": ["Schema", "ExternallyDefinedInput"]
                }
            },
            {
                "name": "outputs",
                "type": {
                    "type": "array",
                    "items": ["Schema", "ExternallyDefinedOutput"]
                }
            },
            {
                "name": "schemaDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "Schema"
                    }
                ]
            }
        ]
    },

    {
        "type": "record",
        "name": "Workflow",
        "fields": [
            {
                "name": "inputs",
                "type": {
                    "type": "array",
                    "items": "Schema"
                }
            },
            {
                "name": "outputs",
                "type": {
                    "type": "array",
                    "items": "Schema"
                }
            },
            {
                "name": "schemaDefs",
                "type": [
                    "null",
                    {
                        "type": "array",
                        "items": "Schema"
                    }
                ]
            },
            {
                "name": "steps",
                "type": [
                    {
                        "type": "array",
                        "items": ["Process"]
                    }
                ]
            }
        ]
    }
]
