import capnp
from typing import Any


def generate_type(type_walker, schema_walker) -> str | list[Any] | dict[str, Any]:
  data_type = next(type_walker)
  if data_type.which() == 'struct':
    return generate_struct(next(schema_walker))
  elif data_type.which() == 'list':
    _ = next(schema_walker)
    return [generate_type(type_walker, schema_walker)]
  elif data_type.which() == 'enum':
    return "text"
  else:
    return str(data_type.which())


def generate_struct(schema: capnp.lib.capnp._StructSchema) -> dict[str, Any]:
  return {field: generate_field(schema.fields[field]) for field in schema.fields if not field.endswith("DEPRECATED")}


def generate_field(field: capnp.lib.capnp._StructSchemaField) -> str | list[Any] | dict[str, Any]:
  def schema_walker(field):
    yield field.schema

    s = field.schema
    while hasattr(s, 'elementType'):
      s = s.elementType
      yield s

  def type_walker(field):
    yield field.proto.slot.type

    t = field.proto.slot.type
    while hasattr(getattr(t, t.which()), 'elementType'):
      t = getattr(t, t.which()).elementType
      yield t

  if field.proto.which() == "slot":
    schema_gen, type_gen = schema_walker(field), type_walker(field)
    return generate_type(type_gen, schema_gen)
  else:
    return generate_struct(field.schema)