pocketpy/ffigen/ffigen/schema.py
2025-12-17 00:03:48 +08:00

58 lines
1.2 KiB
Python

from dataclasses import dataclass
from pycparser import c_ast
@dataclass
class StructField:
type: str
name: str
desc: str | None = None
@dataclass
class EnumValue:
name: str
value: int | None
desc: str | None = None
@dataclass
class Struct:
name: str | None = None
typedef_name: str | None = None
desc: str | None = None
fields: list[StructField] | None = None
@property
def code_name(self):
if self.typedef_name:
return self.typedef_name
assert self.name is not None
return f'struct {self.name}'
@property
def identifier(self):
if self.name:
return self.name
assert self.typedef_name is not None
return self.typedef_name
@dataclass
class Enum:
name: str
values: list[EnumValue]
desc: str | None = None
@dataclass
class FunctionParam:
type: str
name: str
@dataclass
class Function:
name: str
params: list[FunctionParam]
ret_type: str
desc: str | None = None
def signature(self) -> str:
return f'{self.ret_type} {self.name}({", ".join([f"{param.type} {param.name}" for param in self.params])})'