use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub enum CoreWrapper {
#[default]
None,
Cow,
Arc,
Bytes,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DefaultValue {
BoolLiteral(bool),
StringLiteral(String),
IntLiteral(i64),
FloatLiteral(f64),
EnumVariant(String),
Empty,
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiSurface {
pub crate_name: String,
pub version: String,
pub types: Vec<TypeDef>,
pub functions: Vec<FunctionDef>,
pub enums: Vec<EnumDef>,
pub errors: Vec<ErrorDef>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TypeDef {
pub name: String,
pub rust_path: String,
pub fields: Vec<FieldDef>,
pub methods: Vec<MethodDef>,
pub is_opaque: bool,
pub is_clone: bool,
pub doc: String,
#[serde(default)]
pub cfg: Option<String>,
#[serde(default)]
pub is_trait: bool,
#[serde(default)]
pub has_default: bool,
#[serde(default)]
pub has_stripped_cfg_fields: bool,
#[serde(default)]
pub is_return_type: bool,
#[serde(default)]
pub serde_rename_all: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FieldDef {
pub name: String,
pub ty: TypeRef,
pub optional: bool,
pub default: Option<String>,
pub doc: String,
#[serde(default)]
pub sanitized: bool,
#[serde(default)]
pub is_boxed: bool,
#[serde(default)]
pub type_rust_path: Option<String>,
#[serde(default)]
pub cfg: Option<String>,
#[serde(default)]
pub typed_default: Option<DefaultValue>,
#[serde(default)]
pub core_wrapper: CoreWrapper,
#[serde(default)]
pub vec_inner_core_wrapper: CoreWrapper,
#[serde(default)]
pub newtype_wrapper: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MethodDef {
pub name: String,
pub params: Vec<ParamDef>,
pub return_type: TypeRef,
pub is_async: bool,
pub is_static: bool,
pub error_type: Option<String>,
pub doc: String,
pub receiver: Option<ReceiverKind>,
#[serde(default)]
pub sanitized: bool,
#[serde(default)]
pub trait_source: Option<String>,
#[serde(default)]
pub returns_ref: bool,
#[serde(default)]
pub returns_cow: bool,
#[serde(default)]
pub return_newtype_wrapper: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ReceiverKind {
Ref,
RefMut,
Owned,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionDef {
pub name: String,
pub rust_path: String,
pub params: Vec<ParamDef>,
pub return_type: TypeRef,
pub is_async: bool,
pub error_type: Option<String>,
pub doc: String,
#[serde(default)]
pub cfg: Option<String>,
#[serde(default)]
pub sanitized: bool,
#[serde(default)]
pub returns_ref: bool,
#[serde(default)]
pub return_newtype_wrapper: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParamDef {
pub name: String,
pub ty: TypeRef,
pub optional: bool,
pub default: Option<String>,
#[serde(default)]
pub sanitized: bool,
#[serde(default)]
pub typed_default: Option<DefaultValue>,
#[serde(default)]
pub is_ref: bool,
#[serde(default)]
pub newtype_wrapper: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnumDef {
pub name: String,
pub rust_path: String,
pub variants: Vec<EnumVariant>,
pub doc: String,
#[serde(default)]
pub cfg: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub serde_tag: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub serde_rename_all: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnumVariant {
pub name: String,
pub fields: Vec<FieldDef>,
pub doc: String,
#[serde(default)]
pub is_default: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub serde_rename: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorDef {
pub name: String,
pub rust_path: String,
pub variants: Vec<ErrorVariant>,
pub doc: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorVariant {
pub name: String,
pub message_template: Option<String>,
#[serde(default)]
pub fields: Vec<FieldDef>,
#[serde(default)]
pub has_source: bool,
#[serde(default)]
pub has_from: bool,
#[serde(default)]
pub is_unit: bool,
pub doc: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum TypeRef {
Primitive(PrimitiveType),
String,
Char,
Bytes,
Optional(Box<TypeRef>),
Vec(Box<TypeRef>),
Map(Box<TypeRef>, Box<TypeRef>),
Named(String),
Path,
Unit,
Json,
Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum PrimitiveType {
Bool,
U8,
U16,
U32,
U64,
I8,
I16,
I32,
I64,
F32,
F64,
Usize,
Isize,
}