-- schema.json --
{
  "type": "object",
  "title": "Main schema",

  "properties": {
    "fields" : {
      "type": "object",
      "minProperties": 3,
      "maxProperties": 10,
      "propertyNames": {
        "pattern": "^\\P{Lu}"
      }
    },
    "additional": {
      "type": "object",
      "properties": {
        "foo": { "type": "number" },
        "bar": { "type": "number" }
      },
      "additionalProperties": { "type": "string" }
    },
    "map": {
      "type": "object",
      "additionalProperties": { "type": "string" }
    },
    "patterns": {
      "type": "object",
      "properties": {
        "foo": { "type": "number" },
        "bar": { "type": "number" }
      },
      "patternProperties": {
        "^\\P{Lu}": { "type": "string" },
        "^\\P{Lo}": { "type": "integer" }
      }
    },
    "patternsNoProps": {
      "type": "object",
      "patternProperties": {
        "^\\P{Lu}": { "type": "string" },
        "^\\P{Lo}": { "type": "integer" }
      }
    },
    "complex": {
      "type": "object",
      "properties": {
        "foo": { "type": "number" },
        "bar": { "type": "number" }
      },
      "patternProperties": {
        "^\\P{Lu}": { "type": "string" },
        "^\\P{Lo}": { "type": "integer" }
      },
      "additionalProperties": { "type": "string" }
    },
    "multi": {
      "type": [ "object", "number" ],
      "properties": {
        "foo": { "type": "number" },
        "bar": { "type": "number" }
      },
      "maxProperties": 5,
      "minimum": 7
    }
  },
  "additionalProperties": false
}
-- out/decode/extract --
// Main schema

import "struct"

close({
	fields?: struct.MinFields(3) & struct.MaxFields(10) & {
		[=~"^\\P{Lu}"]: _
	}
	additional?: {
		foo?: number
		bar?: number
		{[!~"^(foo|bar)$"]: string}
	}
	map?: [string]: string
	patterns?: {
		foo?: number
		bar?: number

		{[=~"^\\P{Lu}"]: string}

		{[=~"^\\P{Lo}"]: int}
		...
	}
	patternsNoProps?: {
		{[=~"^\\P{Lu}"]: string}

		{[=~"^\\P{Lo}"]: int}
		...
	}
	complex?: {
		foo?: number
		bar?: number

		{[=~"^\\P{Lu}"]: string}

		{[=~"^\\P{Lo}"]: int}
		{[!~"^\\P{Lu}" & !~"^\\P{Lo}" & !~"^(foo|bar)$"]: string}
	}
	multi?: >=7 | struct.MaxFields(5) & {
		foo?: number
		bar?: number
		...
	}
})
