domrs/css/
group.rs

1use crate::common::get_indentation;
2use crate::{CssAtRule, CssRuleset, ToText, DEFAULT_CSS_INDENT, DEFAULT_CSS_OFFSET};
3use std::fmt;
4use std::fmt::{Display, Write};
5
6#[derive(Debug, Clone)]
7pub struct CssGroup {
8  rule: CssAtRule,
9  query: String,
10  rulesets: Vec<CssRuleset>,
11}
12
13impl CssGroup {
14  pub fn media_print() -> Self {
15    Self {
16      rule: CssAtRule::Media,
17      query: "print".to_string(),
18      rulesets: vec![],
19    }
20  }
21
22  pub fn media_screen() -> Self {
23    Self {
24      rule: CssAtRule::Media,
25      query: "screen".to_string(),
26      rulesets: vec![],
27    }
28  }
29
30  pub fn media<T: ToString>(query: T) -> Self {
31    Self {
32      rule: CssAtRule::Media,
33      query: query.to_string(),
34      rulesets: vec![],
35    }
36  }
37
38  /// Adds a new ruleset to this group.
39  pub fn ruleset(mut self, ruleset: CssRuleset) -> Self {
40    self.rulesets.push(ruleset);
41    self
42  }
43}
44
45impl ToText for CssGroup {
46  /// Converts [CssGroup] to a textual representation using provided offset and indent.
47  fn to_text(&self, offset: usize, indent: usize) -> String {
48    let mut style = String::new();
49    let _ = writeln!(&mut style, "{}{} {} {{", get_indentation(false, offset), self.rule, self.query);
50    for ruleset in &self.rulesets {
51      let _ = write!(&mut style, "{}", ruleset.to_text(offset + indent, indent));
52    }
53    let _ = writeln!(&mut style, "{}}}", get_indentation(false, offset));
54    style
55  }
56}
57
58impl Display for CssGroup {
59  /// Implements [Display] for [CssGroup].
60  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61    write!(f, "{}", self.to_text(DEFAULT_CSS_OFFSET, DEFAULT_CSS_INDENT))
62  }
63}