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}