use std::fmt::{self, Display, Formatter};
use super::*;
impl Display for CSS {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
for rule in &self.0 {
writeln!(f, "{rule}")?;
}
Ok(())
}
}
impl Display for Rule {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
writeln!(f, "{} {{", self.selector)?;
for decl in &self.declarations {
writeln!(f, "\t{decl}")?;
}
write!(f, "}}")
}
}
impl Display for Selector {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::Simple { ty, class, id } => {
if let Some(ty) = ty {
write!(f, "{ty}")?;
}
if let Some(class) = class {
write!(f, ".{class}")?;
}
if let Some(id) = id {
write!(f, "#{id}")?;
}
Ok(())
},
Self::Colon { name, arg: Some(arg) } => write!(f, ":{name}({arg})"),
Self::Colon { name, arg: None } => write!(f, ":{name}"),
Self::Sub { left, right } if matches!(right.as_ref(), Self::Colon { .. }) => write!(f, "{left}{right}"),
Self::Sub { left, right } => write!(f, "{left} {right}"),
Self::Gt { left, right } => write!(f, "{left} > {right}"),
Self::Plus { left, right } => write!(f, "{left} + {right}"),
Self::Tilde { left, right } => write!(f, "{left} ~ {right}"),
Self::Comma { left, right } => write!(f, "{left}, {right}"),
}
}
}
impl Display for Declaration {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}:", self.name)?;
for v in &self.value {
write!(f, " {v}")?;
}
write!(f, ";")
}
}
impl Display for Value {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::ColorCode(cc) => write!(f, "#{cc:06x}"),
Self::Ident(i) => write!(f, "{i}"),
Self::Int(i, s) => write!(f,"{i}{s}"),
Self::Float(x, s) => write!(f,"{x}{s}"),
Self::Function { name, args } => {
let mut args = args.iter();
write!(f, "{name}(")?;
if let Some(first) = args.next() {
write!(f, "{first}")?;
for arg in args {
write!(f, ", {arg}")?;
}
}
write!(f, ")")
}
}
}
}