use serde::{Deserialize, Serialize};
use super::SourceSpan;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Model {
pub docs: Vec<String>,
pub name: String,
pub name_span: SourceSpan,
pub fields: Vec<Field>,
pub attributes: Vec<Attribute>,
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MixinDecl {
pub docs: Vec<String>,
pub name: String,
pub name_span: SourceSpan,
pub fields: Vec<Field>,
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TypeDecl {
pub docs: Vec<String>,
pub name: String,
pub name_span: SourceSpan,
pub fields: Vec<Field>,
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumDecl {
pub docs: Vec<String>,
pub name: String,
pub name_span: SourceSpan,
pub variants: Vec<EnumVariant>,
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumVariant {
pub docs: Vec<String>,
pub name: String,
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Field {
pub docs: Vec<String>,
pub name: String,
pub name_span: SourceSpan,
pub ty: TypeRef,
pub attributes: Vec<Attribute>,
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TypeRef {
pub name: String,
pub name_span: SourceSpan,
pub arity: TypeArity,
pub generic_args: Vec<TypeRef>,
#[serde(default)]
pub int_args: Vec<u32>,
}
impl TypeRef {
pub fn is_page(&self) -> bool {
self.name == "Page"
}
pub fn page_item(&self) -> Option<&TypeRef> {
if self.is_page() {
self.generic_args.first()
} else {
None
}
}
pub fn is_page_input(&self) -> bool {
self.name == "PageInput"
}
pub fn is_find_many(&self) -> bool {
self.name == "FindMany"
}
pub fn find_many_item(&self) -> Option<&TypeRef> {
if self.is_find_many() {
self.generic_args.first()
} else {
None
}
}
pub fn is_vector(&self) -> bool {
self.name == "Vector"
}
pub fn vector_dim(&self) -> Option<u32> {
if self.is_vector() {
self.int_args.first().copied()
} else {
None
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TypeArity {
Required,
Optional,
List,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Attribute {
pub raw: String,
pub span: SourceSpan,
}