[
  {
    "namespace": "choices",
    "description": "The choices API.",
    "types": [
      {
        "id": "ChoiceType",
        "type": "object",
        "properties": {
          "integers": {
            "choices": [
               {"type": "array", "items": {"type": "integer", "minimum": 0}},
               {"type": "integer"}
            ]
          },
          "strings": {
            "choices": [
               {"type": "array", "items": {"type": "string", "minimum": 0}},
               {"type": "string"}
            ],
            "optional": true
          }
        }
      },
      {
        "id": "NestedChoice",
        "description": "Tests when some of the choices are choices themselves",
        "choices": [
          {"type": "integer"},
          {"choices": [
            {"type": "string"},
            {"type": "boolean"}
          ]},
          {"choices": [
            {"type": "double"},
            {"$ref": "ChoiceType"},
            {"type": "array", "items": {"$ref": "ChoiceType"}}
          ]}
        ]
      }
    ],
    "functions": [
      {
        "name": "takesIntegers",
        "type": "function",
        "description": "Takes one or more integers.",
        "parameters": [
          {
            "name": "nums",
            "choices": [
               {"type": "array", "items": {"type": "integer", "minimum": 0}},
               {"type": "integer"}
             ]
          },
          {
            "name": "callback",
            "type": "function",
            "parameters": []
          }
        ]
      },
      {
        "name": "takesIntegersOptional",
        "type": "function",
        "description": "Takes one or more integers.",
        "parameters": [
          {
            "name": "nums",
            "choices": [
               {"type": "array", "items": {"type": "integer", "minimum": 0}},
               {"type": "integer"}
            ],
            "optional": true
          },
          {
            "name": "callback",
            "type": "function",
            "parameters": []
          }
        ]
      },
      {
        "name": "objectWithChoices",
        "type": "function",
        "description": "Takes an object with one or more strings and optional integer(s).",
        "parameters": [
          {
            "type": "object",
            "name": "stringInfo",
            "properties": {
               "strings": {
                 "description": "One or more tab indices to highlight.",
                 "choices": [
                   {"type": "array", "items": {"type": "string", "minimum": 0}},
                   {"type": "string"}
                 ]
               },
               "integers": {
                 "description": "One or more tab indices to highlight.",
                 "choices": [
                   {"type": "array", "items": {"type": "integer", "minimum": 0}},
                   {"type": "integer"}
                 ],
                 "optional": true
               }
             }
           },
          {
            "name": "callback",
            "type": "function",
            "parameters": []
          }
        ]
      },
      {
        "name": "returnChoices",
        "type": "function",
        "description": "Gives back a string. Or not.",
        "parameters": [
          {
            "name": "callback",
            "type": "function",
            "parameters": [
              {
                "name": "result",
                "choices": [
                   {"type": "array", "items": {"type": "integer", "minimum": 0}},
                   {"type": "integer"}
                 ],
                "description": "Some integers."
              }
            ]
          }
        ]
      },
      {
        "name": "returnMultipleChoices",
        "type": "function",
        "description": "Gives back two values where each is an integer or a list of integers.",
        "parameters": [
          {
            "name": "callback",
            "type": "function",
            "parameters": [
              {
                "name": "firstResult",
                "choices": [
                   {"type": "array", "items": {"type": "integer", "minimum": 0}},
                   {"type": "integer"}
                 ],
                "description": "Some integers."
              },
              {
                "name": "secondResult",
                "choices": [
                   {"type": "array", "items": {"type": "integer", "minimum": 0}},
                   {"type": "integer"}
                 ],
                "description": "Some integers."
              }
            ]
          }
        ]
      }
    ]
  }
]