An example:
import enum from typing import Union import msgspec import rich class Role(enum.Enum): """A role for a team member""" manager = "manager" lead = "lead" developer = "developer" other = "other" class TeamMember(msgspec.Struct): """A team member in a team""" name: str skills: list[str] = [] email: Union[str, None] = None role: Role class Team(msgspec.Struct): """A team in the organization""" name: str members: list[TeamMember] = [] rich.print(msgspec.json.schema(list[Team]))
And the output:
{
'type': 'array',
'items': {'$ref': '#/$defs/Team'},
'$defs': {
'Team': {
'title': 'Team',
'description': 'A team in the organization',
'type': 'object',
'required': ['name'],
'properties': {
'name': {'title': 'Name', 'type': 'string'},
'members': {
'title': 'Members',
'default': [],
'type': 'array',
'items': {'$ref': '#/$defs/TeamMember'}
}
}
},
'TeamMember': {
'title': 'TeamMember',
'description': 'A team member in a team',
'type': 'object',
'required': ['name', 'role'],
'properties': {
'name': {'title': 'Name', 'type': 'string'},
'role': {'$ref': '#/$defs/Role'},
'skills': {
'title': 'Skills',
'default': [],
'type': 'array',
'items': {'type': 'string'}
},
'email': {
'title': 'Email',
'default': None,
'anyOf': [{'type': 'string'}, {'type': 'null'}]
}
}
},
'Role': {
'title': 'Role',
'description': 'A role for a team member',
'enum': ['developer', 'lead', 'manager', 'other']
}
}
}