mod convert;
use super::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InterfaceDcl {
pub annotations: Vec<Annotation>,
pub decl: InterfaceDclInner,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum InterfaceDclInner {
InterfaceForwardDcl(InterfaceForwardDcl),
InterfaceDef(InterfaceDef),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InterfaceForwardDcl {
pub ident: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InterfaceDef {
pub header: InterfaceHeader,
pub interface_body: Option<InterfaceBody>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InterfaceHeader {
pub ident: String,
pub parent: Option<InterfaceInheritanceSpec>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InterfaceInheritanceSpec(pub Vec<InterfaceName>);
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InterfaceName(pub ScopedName);
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InterfaceBody(pub Vec<Export>);
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum Export {
OpDcl(OpDcl),
AttrDcl(AttrDcl),
TypeDcl(TypeDcl),
ConstDcl(ConstDcl),
ExceptDcl(ExceptDcl),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct OpDcl {
pub annotations: Vec<Annotation>,
pub ty: OpTypeSpec,
pub ident: String,
pub parameter: Option<ParameterDcls>,
pub raises: Option<RaisesExpr>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[allow(clippy::large_enum_variant)]
pub enum OpTypeSpec {
Void,
TypeSpec(TypeSpec),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ParameterDcls(pub Vec<ParamDcl>);
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ParamDcl {
pub annotations: Vec<Annotation>,
pub attr: Option<ParamAttribute>,
pub ty: TypeSpec,
pub declarator: SimpleDeclarator,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ParamAttribute(pub String);
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RaisesExpr(pub Vec<ScopedName>);
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AttrDcl {
pub annotations: Vec<Annotation>,
pub decl: AttrDclInner,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum AttrDclInner {
ReadonlyAttrSpec(ReadonlyAttrSpec),
AttrSpec(AttrSpec),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ReadonlyAttrSpec {
pub ty: TypeSpec,
pub declarator: ReadonlyAttrDeclarator,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum ReadonlyAttrDeclarator {
SimpleDeclarator(Vec<SimpleDeclarator>),
WithRaises {
declarator: SimpleDeclarator,
raises: RaisesExpr,
},
}
impl ReadonlyAttrDeclarator {
pub fn declarators(&self) -> &[SimpleDeclarator] {
match self {
Self::SimpleDeclarator(names) => names,
Self::WithRaises { declarator, .. } => std::slice::from_ref(declarator),
}
}
pub fn raises(&self) -> Option<&RaisesExpr> {
match self {
Self::SimpleDeclarator(_) => None,
Self::WithRaises { raises, .. } => Some(raises),
}
}
pub fn raises_mut(&mut self) -> Option<&mut RaisesExpr> {
match self {
Self::SimpleDeclarator(_) => None,
Self::WithRaises { raises, .. } => Some(raises),
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AttrSpec {
pub ty: TypeSpec,
pub declarator: AttrDeclarator,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum AttrDeclarator {
SimpleDeclarator(Vec<SimpleDeclarator>),
WithRaises {
declarator: SimpleDeclarator,
raises: AttrRaisesExpr,
},
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum AttrRaisesExpr {
Case1(GetExcepExpr, Option<SetExcepExpr>),
SetExcepExpr(SetExcepExpr),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct GetExcepExpr {
pub expr: ExceptionList,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct SetExcepExpr {
pub expr: ExceptionList,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ExceptionList(pub Vec<ScopedName>);