|  |  |  | 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)
 |