use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum AstVisibility {
Public,
Private,
Protected,
Internal,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Type {
Named(String),
Generic {
base: String,
params: Vec<Self>,
},
Function {
params: Vec<Self>,
return_type: Box<Self>,
},
Tuple(Vec<Self>),
Array {
element_type: Box<Self>,
size: Option<usize>,
},
Reference {
inner: Box<Self>,
is_mut: bool,
},
Optional(Box<Self>),
Union(Vec<Self>),
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Parameter {
pub name: String,
pub type_annotation: Option<Type>,
pub default_value: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Field {
pub name: String,
pub type_annotation: Option<Type>,
pub visibility: AstVisibility,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct EnumVariant {
pub name: String,
pub value: Option<String>,
pub fields: Vec<Field>,
}