let method_type = [| 'GET, 'POST, 'PUT, 'DELETE, 'PATCH |] in
let auth_type   = [| 'None, 'Viewer, 'Bearer, 'Admin |] in
let actor_type  = [| 'Developer, 'Agent, 'Ci, 'Admin |] in

let param_type = {
  name        | String,
  kind        | String,
  constraint  | String | default = "optional",
  description | String | default = "",
} in

let route_type = {
  method      | method_type,
  path        | String,
  description | String        | default = "",
  auth        | auth_type     | default = 'None,
  actors      | Array actor_type | default = [],
  params      | Array param_type | default = [],
  tags        | Array String  | default = [],
  feature     | String        | default = "",
  source_file | String        | default = "",
} in

let catalog_type = {
  crate  | String,
  routes | Array route_type,
} in

{
  Method   = method_type,
  Auth     = auth_type,
  Actor    = actor_type,
  Param    = param_type,
  Route    = route_type,
  Catalog  = catalog_type,
}
