use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub enum CoreWrapper {
#[default]
None,
Cow,
Arc,
Bytes,
ArcMutex,
Box,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DefaultValue {
BoolLiteral(bool),
StringLiteral(String),
IntLiteral(i64),
FloatLiteral(f64),
EnumVariant(String),
Empty,
None,
}
#[derive(Debug, Clone, Default, 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>,
#[serde(default)]
pub excluded_type_paths: std::collections::HashMap<String, String>,
#[serde(default)]
pub excluded_trait_names: std::collections::HashSet<String>,
#[serde(default)]
pub services: Vec<ServiceDef>,
#[serde(default)]
pub handler_contracts: Vec<HandlerContractDef>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceDef {
pub name: String,
pub rust_path: String,
pub constructor: MethodDef,
pub configurators: Vec<MethodDef>,
pub registrations: Vec<RegistrationDef>,
pub entrypoints: Vec<EntrypointDef>,
pub doc: String,
pub cfg: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegistrationDef {
pub method: String,
pub callback_param: String,
pub callback_contract: String,
pub metadata_params: Vec<ParamDef>,
pub receiver: Option<ReceiverKind>,
pub return_type: TypeRef,
pub error_type: Option<String>,
pub doc: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EntrypointDef {
pub method: String,
pub kind: EntrypointKind,
pub is_async: bool,
pub params: Vec<ParamDef>,
pub return_type: TypeRef,
pub error_type: Option<String>,
pub doc: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EntrypointKind {
Run,
Finalize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HandlerContractDef {
pub trait_name: String,
pub rust_path: String,
pub dispatch: MethodDef,
pub optional_methods: Vec<MethodDef>,
pub wire_request_type: Option<String>,
pub wire_response_type: Option<String>,
pub doc: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TypeDef {
pub name: String,
pub rust_path: String,
#[serde(default)]
pub original_rust_path: String,
pub fields: Vec<FieldDef>,
pub methods: Vec<MethodDef>,
pub is_opaque: bool,
pub is_clone: bool,
#[serde(default)]
pub is_copy: 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>,
#[serde(default)]
pub has_serde: bool,
#[serde(default)]
pub super_traits: Vec<String>,
#[serde(default)]
pub binding_excluded: bool,
#[serde(default)]
pub binding_exclusion_reason: 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>,
#[serde(default)]
pub serde_rename: Option<String>,
#[serde(default)]
pub serde_flatten: bool,
#[serde(default)]
pub binding_excluded: bool,
#[serde(default)]
pub binding_exclusion_reason: Option<String>,
#[serde(default)]
pub original_type: 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>,
#[serde(default)]
pub has_default_impl: bool,
#[serde(default)]
pub binding_excluded: bool,
#[serde(default)]
pub binding_exclusion_reason: 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,
#[serde(default)]
pub original_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 return_sanitized: bool,
#[serde(default)]
pub returns_ref: bool,
#[serde(default)]
pub returns_cow: bool,
#[serde(default)]
pub return_newtype_wrapper: Option<String>,
#[serde(default)]
pub binding_excluded: bool,
#[serde(default)]
pub binding_exclusion_reason: 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 is_mut: bool,
#[serde(default)]
pub newtype_wrapper: Option<String>,
#[serde(default)]
pub original_type: Option<String>,
#[serde(default)]
pub map_is_ahash: bool,
#[serde(default)]
pub map_key_is_cow: bool,
}
impl Default for ParamDef {
fn default() -> Self {
Self {
name: String::new(),
ty: TypeRef::Unit,
optional: false,
default: None,
sanitized: false,
typed_default: None,
is_ref: false,
is_mut: false,
newtype_wrapper: None,
original_type: None,
map_is_ahash: false,
map_key_is_cow: false,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnumDef {
pub name: String,
pub rust_path: String,
#[serde(default)]
pub original_rust_path: String,
pub variants: Vec<EnumVariant>,
pub doc: String,
#[serde(default)]
pub cfg: Option<String>,
#[serde(default)]
pub is_copy: bool,
#[serde(default)]
pub has_serde: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub serde_tag: Option<String>,
#[serde(default)]
pub serde_untagged: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub serde_rename_all: Option<String>,
#[serde(default)]
pub binding_excluded: bool,
#[serde(default)]
pub binding_exclusion_reason: 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>,
#[serde(default)]
pub is_tuple: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorDef {
pub name: String,
pub rust_path: String,
#[serde(default)]
pub original_rust_path: String,
pub variants: Vec<ErrorVariant>,
pub doc: String,
#[serde(default)]
pub methods: Vec<MethodDef>,
#[serde(default)]
pub binding_excluded: bool,
#[serde(default)]
pub binding_exclusion_reason: Option<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,
}
impl TypeRef {
pub fn references_named(&self, name: &str) -> bool {
match self {
Self::Named(n) => n == name,
Self::Optional(inner) | Self::Vec(inner) => inner.references_named(name),
Self::Map(k, v) => k.references_named(name) || v.references_named(name),
_ => false,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum PrimitiveType {
Bool,
U8,
U16,
U32,
U64,
I8,
I16,
I32,
I64,
F32,
F64,
Usize,
Isize,
}