1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright (C) 2023 Benjamin Stürz
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
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, ")")
            }
        }
    }
}