lightningcss/rules/
import.rs

1//! The `@import` rule.
2
3use super::layer::LayerName;
4use super::supports::SupportsCondition;
5use super::Location;
6use crate::dependencies::{Dependency, ImportDependency};
7use crate::error::PrinterError;
8use crate::media_query::MediaList;
9use crate::printer::Printer;
10use crate::traits::ToCss;
11use crate::values::string::CowArcStr;
12#[cfg(feature = "visitor")]
13use crate::visitor::Visit;
14use cssparser::*;
15
16/// A [@import](https://drafts.csswg.org/css-cascade/#at-import) rule.
17#[derive(Debug, PartialEq, Clone)]
18#[cfg_attr(feature = "visitor", derive(Visit))]
19#[cfg_attr(feature = "into_owned", derive(static_self::IntoOwned))]
20#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))]
22pub struct ImportRule<'i> {
23  /// The url to import.
24  #[cfg_attr(feature = "serde", serde(borrow))]
25  #[cfg_attr(feature = "visitor", skip_visit)]
26  pub url: CowArcStr<'i>,
27  /// An optional cascade layer name, or `None` for an anonymous layer.
28  #[cfg_attr(feature = "visitor", skip_visit)]
29  pub layer: Option<Option<LayerName<'i>>>,
30  /// An optional `supports()` condition.
31  pub supports: Option<SupportsCondition<'i>>,
32  /// A media query.
33  #[cfg_attr(feature = "serde", serde(default))]
34  pub media: MediaList<'i>,
35  /// The location of the rule in the source file.
36  #[cfg_attr(feature = "visitor", skip_visit)]
37  pub loc: Location,
38}
39
40impl<'i> ToCss for ImportRule<'i> {
41  fn to_css<W>(&self, dest: &mut Printer<W>) -> Result<(), PrinterError>
42  where
43    W: std::fmt::Write,
44  {
45    let dep = if dest.dependencies.is_some() {
46      Some(ImportDependency::new(self, dest.filename()))
47    } else {
48      None
49    };
50
51    #[cfg(feature = "sourcemap")]
52    dest.add_mapping(self.loc);
53    dest.write_str("@import ")?;
54    if let Some(dep) = dep {
55      serialize_string(&dep.placeholder, dest)?;
56
57      if let Some(dependencies) = &mut dest.dependencies {
58        dependencies.push(Dependency::Import(dep))
59      }
60    } else {
61      serialize_string(&self.url, dest)?;
62    }
63
64    if let Some(layer) = &self.layer {
65      dest.write_str(" layer")?;
66      if let Some(name) = layer {
67        dest.write_char('(')?;
68        name.to_css(dest)?;
69        dest.write_char(')')?;
70      }
71    }
72
73    if let Some(supports) = &self.supports {
74      dest.write_str(" supports")?;
75      if matches!(supports, SupportsCondition::Declaration { .. }) {
76        supports.to_css(dest)?;
77      } else {
78        dest.write_char('(')?;
79        supports.to_css(dest)?;
80        dest.write_char(')')?;
81      }
82    }
83    if !self.media.media_queries.is_empty() {
84      dest.write_char(' ')?;
85      self.media.to_css(dest)?;
86    }
87    dest.write_str(";")
88  }
89}