lightningcss/rules/
import.rs1use 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#[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 #[cfg_attr(feature = "serde", serde(borrow))]
25 #[cfg_attr(feature = "visitor", skip_visit)]
26 pub url: CowArcStr<'i>,
27 #[cfg_attr(feature = "visitor", skip_visit)]
29 pub layer: Option<Option<LayerName<'i>>>,
30 pub supports: Option<SupportsCondition<'i>>,
32 #[cfg_attr(feature = "serde", serde(default))]
34 pub media: MediaList<'i>,
35 #[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}