Skip to main content

procss/transformers/
apply_import.rs

1// ┌───────────────────────────────────────────────────────────────────────────┐
2// │                                                                           │
3// │  ██████╗ ██████╗  ██████╗   Copyright (C) 2022, The Prospective Company   │
4// │  ██╔══██╗██╔══██╗██╔═══██╗                                                │
5// │  ██████╔╝██████╔╝██║   ██║  This file is part of the Procss library,      │
6// │  ██╔═══╝ ██╔══██╗██║   ██║  distributed under the terms of the            │
7// │  ██║     ██║  ██║╚██████╔╝  Apache License 2.0.  The full license can     │
8// │  ╚═╝     ╚═╝  ╚═╝ ╚═════╝   be found in the LICENSE file.                 │
9// │                                                                           │
10// └───────────────────────────────────────────────────────────────────────────┘
11
12use std::collections::HashMap;
13use std::path::Path;
14
15use super::filter_refs;
16use crate::ast::Ruleset::{self};
17use crate::ast::*;
18
19pub fn apply_import<'a, 'b>(assets: &'b HashMap<&Path, Tree<'a>>) -> impl Fn(&mut Tree<'a>) + 'b {
20    |tree| {
21        tree.transform(|ruleset| {
22            let mut replace = None;
23            if let Ruleset::QualRule(QualRule(name, val)) = ruleset {
24                if *name == "import" {
25                    if let Some(val) = val {
26                        if val.starts_with('\"') {
27                            replace = assets.get(Path::new(&val[1..val.len() - 1])).cloned();
28                            if replace.is_none() {
29                                panic!("File not found: '{}'", &val[1..val.len() - 1])
30                            }
31                        } else if val.starts_with("url(\"ref://") {
32                            replace = assets.get(Path::new(&val[11..val.len() - 2])).cloned().map(
33                                |mut x| {
34                                    filter_refs(&mut x);
35                                    x
36                                },
37                            );
38
39                            if replace.is_none() {
40                                panic!("File not found: '{}'", &val[1..val.len() - 1])
41                            }
42                        }
43                    }
44                }
45            }
46
47            if let Some(replace) = replace {
48                let rules: Vec<TreeRule<'a>> =
49                    replace.iter().cloned().map(TreeRule::Ruleset).collect();
50
51                *ruleset =
52                    Ruleset::SelectorRuleset(SelectorRuleset(Selector::default(), rules.clone()))
53            }
54        });
55    }
56}