pub(super) mod types;
pub use types::{RustPrimitive, TypeRef};
#[derive(Debug, Clone)]
pub struct DiscriminatedVariant {
pub discriminator_value: String,
pub variant_name: String,
pub type_name: String,
}
#[derive(Debug, Clone)]
pub struct DiscriminatedEnumDef {
pub name: String,
pub docs: Vec<String>,
pub discriminator_field: String,
pub variants: Vec<DiscriminatedVariant>,
pub fallback: Option<DiscriminatedVariant>,
}
#[derive(Debug, Clone)]
pub enum RustType {
Struct(StructDef),
Enum(EnumDef),
TypeAlias(TypeAliasDef),
DiscriminatedEnum(DiscriminatedEnumDef),
}
impl RustType {
pub fn type_name(&self) -> &str {
match self {
RustType::Struct(def) => &def.name,
RustType::Enum(def) => &def.name,
RustType::TypeAlias(def) => &def.name,
RustType::DiscriminatedEnum(def) => &def.name,
}
}
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub struct OperationInfo {
pub operation_id: String,
pub method: String,
pub path: String,
pub summary: Option<String>,
pub description: Option<String>,
pub request_type: Option<String>,
pub response_type: Option<String>,
pub request_body_types: Vec<String>,
pub success_response_types: Vec<String>,
pub error_response_types: Vec<String>,
pub warnings: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum StructKind {
#[default]
Schema,
OperationRequest,
RequestBody,
}
#[derive(Debug, Clone)]
pub struct StructDef {
pub name: String,
pub docs: Vec<String>,
pub fields: Vec<FieldDef>,
pub derives: Vec<String>,
pub serde_attrs: Vec<String>,
pub outer_attrs: Vec<String>,
pub methods: Vec<StructMethod>,
pub kind: StructKind,
}
#[derive(Debug, Clone)]
pub struct StructMethod {
pub name: String,
pub docs: Vec<String>,
pub kind: StructMethodKind,
pub attrs: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct QueryParameter {
pub field: String,
pub encoded_name: String,
pub explode: bool,
pub optional: bool,
pub is_array: bool,
}
#[derive(Debug, Clone)]
pub enum StructMethodKind {
RenderPath {
segments: Vec<PathSegment>,
query_params: Vec<QueryParameter>,
},
}
#[derive(Debug, Clone)]
pub enum PathSegment {
Literal(String),
Parameter { field: String },
}
#[derive(Debug, Clone, Default)]
pub struct FieldDef {
pub name: String,
pub docs: Vec<String>,
pub rust_type: TypeRef,
pub serde_attrs: Vec<String>,
pub extra_attrs: Vec<String>,
pub validation_attrs: Vec<String>,
pub regex_validation: Option<String>,
pub default_value: Option<serde_json::Value>,
pub read_only: bool,
pub write_only: bool,
pub deprecated: bool,
pub multiple_of: Option<serde_json::Number>,
}
#[derive(Debug, Clone)]
pub struct EnumDef {
pub name: String,
pub docs: Vec<String>,
pub variants: Vec<VariantDef>,
pub discriminator: Option<String>,
pub derives: Vec<String>,
pub serde_attrs: Vec<String>,
pub outer_attrs: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct VariantDef {
pub name: String,
pub docs: Vec<String>,
pub content: VariantContent,
pub serde_attrs: Vec<String>,
pub deprecated: bool,
}
#[derive(Debug, Clone)]
pub enum VariantContent {
Unit,
Tuple(Vec<TypeRef>),
}
#[derive(Debug, Clone)]
pub struct TypeAliasDef {
pub name: String,
pub docs: Vec<String>,
pub target: TypeRef,
}