dpscript/dpscript/ast/node/
import.rs

1use crate::{util::Spanned, AddSpan};
2use miette::SourceSpan;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Import {
7    /// This would be the `std/some/` part of `import std/some/{abc, def, ghi}`.
8    pub base: Vec<Spanned<String>>,
9    pub imports: Vec<ImportNode>,
10    pub span: SourceSpan,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub enum ImportNode {
15    Object(Spanned<String>),
16    Module(Import),
17}
18
19impl Import {
20    /// Get the ID of the module we are importing from
21    pub fn module(&self) -> String {
22        self.base
23            .iter()
24            .map(|(v, _)| v.clone())
25            .collect::<Vec<_>>()
26            .join("/")
27    }
28
29    pub fn module_span(&self) -> SourceSpan {
30        let parts = self.base.clone();
31        let Some((_, mut span)) = parts.first() else {
32            panic!("Achievement Unlocked: How did we get here?")
33        };
34
35        for (_, item) in parts {
36            span = span.add(item);
37        }
38
39        span
40    }
41}