1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// ┌───────────────────────────────────────────────────────────────────────────┐
// │                                                                           │
// │  ██████╗ ██████╗  ██████╗   Copyright (C) 2022, The Prospective Company   │
// │  ██╔══██╗██╔══██╗██╔═══██╗                                                │
// │  ██████╔╝██████╔╝██║   ██║  This file is part of the Procss library,      │
// │  ██╔═══╝ ██╔══██╗██║   ██║  distributed under the terms of the            │
// │  ██║     ██║  ██║╚██████╔╝  Apache License 2.0.  The full license can     │
// │  ╚═╝     ╚═╝  ╚═╝ ╚═════╝   be found in the LICENSE file.                 │
// │                                                                           │
// └───────────────────────────────────────────────────────────────────────────┘

use std::collections::HashMap;

use super::filter_refs;
use crate::ast::Ruleset::{self};
use crate::ast::*;

pub fn apply_import<'a, 'b>(assets: &'b HashMap<&str, Tree<'a>>) -> impl Fn(&mut Tree<'a>) + 'b {
    |tree| {
        tree.transform(|ruleset| {
            let mut replace = None;
            if let Ruleset::QualRule(QualRule(name, val)) = ruleset {
                if *name == "import" {
                    if let Some(val) = val {
                        if val.starts_with('\"') {
                            replace = assets.get(&val[1..val.len() - 1]).cloned();
                            if replace.is_none() {
                                panic!("File not found: '{}'", &val[1..val.len() - 1])
                            }
                        } else if val.starts_with("url(\"ref://") {
                            replace = assets.get(&val[11..val.len() - 2]).cloned().map(|mut x| {
                                filter_refs(&mut x);
                                x
                            });

                            if replace.is_none() {
                                panic!("File not found: '{}'", &val[1..val.len() - 1])
                            }
                        }
                    }
                }
            }

            if let Some(replace) = replace {
                let rules: Vec<TreeRule<'a>> =
                    replace.iter().cloned().map(TreeRule::Ruleset).collect();

                *ruleset =
                    Ruleset::SelectorRuleset(SelectorRuleset(Selector::default(), rules.clone()))
            }
        });
    }
}