parcel_css/rules/
media.rs1use super::Location;
4use super::{CssRuleList, MinifyContext};
5use crate::error::{MinifyError, PrinterError};
6use crate::media_query::MediaList;
7use crate::printer::Printer;
8use crate::rules::{StyleContext, ToCssWithContext};
9use crate::traits::ToCss;
10
11#[derive(Debug, PartialEq, Clone)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct MediaRule<'i> {
15 #[cfg_attr(feature = "serde", serde(borrow))]
17 pub query: MediaList<'i>,
18 pub rules: CssRuleList<'i>,
20 pub loc: Location,
22}
23
24impl<'i> MediaRule<'i> {
25 pub(crate) fn minify(
26 &mut self,
27 context: &mut MinifyContext<'_, 'i>,
28 parent_is_unused: bool,
29 ) -> Result<bool, MinifyError> {
30 self.rules.minify(context, parent_is_unused)?;
31
32 if let Some(custom_media) = &context.custom_media {
33 self.query.transform_custom_media(self.loc, custom_media)?;
34 }
35
36 Ok(self.rules.0.is_empty() || self.query.never_matches())
37 }
38}
39
40impl<'a, 'i> ToCssWithContext<'a, 'i> for MediaRule<'i> {
41 fn to_css_with_context<W>(
42 &self,
43 dest: &mut Printer<W>,
44 context: Option<&StyleContext<'a, 'i>>,
45 ) -> Result<(), PrinterError>
46 where
47 W: std::fmt::Write,
48 {
49 if dest.minify && self.query.always_matches() {
51 self.rules.to_css_with_context(dest, context)?;
52 return Ok(());
53 }
54
55 dest.add_mapping(self.loc);
56 dest.write_str("@media ")?;
57 self.query.to_css(dest)?;
58 dest.whitespace()?;
59 dest.write_char('{')?;
60 dest.indent();
61 dest.newline()?;
62 self.rules.to_css_with_context(dest, context)?;
63 dest.dedent();
64 dest.newline()?;
65 dest.write_char('}')
66 }
67}