use std::fmt::Write;
use text_utils::indent;
use super::*;
impl Display for JssSchema {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
self.write_description(f)?;
match self.kind {
JssKind::Scheme => f.write_str("schema "),
JssKind::Property => f.write_str("."),
JssKind::PropertyTop => f.write_str("property "),
JssKind::Definition => f.write_str("define "),
}?;
self.head(f)?;
for (key, value) in &self.attribute {
writeln!(f, "{}", indent(format!("{}: {:#?}", key, value), 4))?;
}
match self.kind {
JssKind::Scheme => {}
_ => {
for (_, value) in &self.property {
writeln!(f, "{}", indent(format!("{:#}", value), 4))?;
writeln!(f)?;
}
}
}
f.write_str("}\n")?;
if let JssKind::Scheme = self.kind {
for (_, value) in &self.definition {
Display::fmt(value, f)?;
writeln!(f)?;
}
for (_, value) in &self.property {
Display::fmt(value, f)?;
writeln!(f)?;
}
}
Ok(())
}
}
impl JssSchema {
#[inline]
fn head(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match &self.name {
None => f.write_char('_')?,
Some(s) => f.write_str(s)?,
}
match &self.typing {
JssType::Undefined => {}
JssType::Anything => {}
JssType::Nothing => {}
JssType::Reference(v) => write!(f, ": \"{}\"", v)?,
JssType::Complex(v) => write!(f, ": \"{}\"", v)?,
_ => write!(f, ": {}", self.typing)?,
}
f.write_str(" {\n")?;
Ok(())
}
#[inline]
fn write_description(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
if self.has_description() {
for line in self.description.lines() {
writeln!(f, "/// {}", line)?
}
}
Ok(())
}
}
impl Display for JssValue {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Null => {
unimplemented!()
}
Self::Boolean(_) => {
unimplemented!()
}
Self::Number(_) => {
unimplemented!()
}
Self::String(v) => Debug::fmt(v, f),
Self::Url(_) => {
unimplemented!()
}
Self::Regex(_) => {
unimplemented!()
}
Self::Array(v) => Debug::fmt(v, f),
Self::Object(_) => {
unimplemented!()
}
}
}
}
impl Display for JssType {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Undefined => f.write_str("undefined"),
Self::Anything => f.write_str("anything"),
Self::Nothing => f.write_str("nothing"),
Self::Number => f.write_str("number"),
JssType::Integer => f.write_str("integer"),
Self::Object => f.write_str("object"),
Self::Reference(v) => f.write_str(&v),
JssType::String => f.write_str("string"),
JssType::Array => f.write_str("array"),
Self::Complex(v) => f.write_str(&v.to_string()),
}
}
}
impl Display for JssComplexType {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.pattern.to_string())
}
}