use super::definitions::Definitions;
use super::{FieldDoc, ShapeNode, VariantDoc};
use crate::schema::{EnumShape, StructShape};
#[derive(Debug, Clone, PartialEq, crate::Schema)]
#[data(tag = "kind")]
pub enum DefinitionDoc {
Struct {
doc: Option<String>,
fields: Vec<FieldDoc>,
},
Enum {
doc: Option<String>,
tag: Option<String>,
variants: Vec<VariantDoc>,
},
}
impl DefinitionDoc {
pub(super) fn define_struct(s: &StructShape, defs: &mut Definitions) -> ShapeNode {
if !defs.has(s.name) {
defs.reserve(s.name);
let fields = FieldDoc::all(&s.fields, defs);
let doc = non_empty(s.doc);
defs.set(s.name, DefinitionDoc::Struct { doc, fields });
}
ShapeNode::Def {
name: s.name.to_owned(),
}
}
pub(super) fn define_enum(e: &EnumShape, defs: &mut Definitions) -> ShapeNode {
if !defs.has(e.name) {
defs.reserve(e.name);
let variants = e
.variants
.iter()
.map(|v| VariantDoc::of(v, e.tag.is_some(), defs))
.collect();
let definition = DefinitionDoc::Enum {
doc: non_empty(e.doc),
tag: e.tag.map(str::to_owned),
variants,
};
defs.set(e.name, definition);
}
ShapeNode::Def {
name: e.name.to_owned(),
}
}
}
pub(super) fn non_empty(doc: &str) -> Option<String> {
(!doc.is_empty()).then(|| doc.to_owned())
}