Skip to main content

geam_core/frontend/
module.rs

1use camino::Utf8PathBuf;
2use ecow::EcoString;
3
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct ModuleSource {
6    module: EcoString,
7    path: Utf8PathBuf,
8    source: String,
9}
10
11impl ModuleSource {
12    pub fn new(
13        module: impl Into<EcoString>,
14        path: impl Into<Utf8PathBuf>,
15        source: impl Into<String>,
16    ) -> Self {
17        Self {
18            module: module.into(),
19            path: path.into(),
20            source: source.into(),
21        }
22    }
23
24    pub fn module(&self) -> &EcoString {
25        &self.module
26    }
27
28    pub fn path(&self) -> &Utf8PathBuf {
29        &self.path
30    }
31
32    pub fn source(&self) -> &str {
33        &self.source
34    }
35
36    pub(super) fn into_parts(self) -> (EcoString, Utf8PathBuf, String) {
37        (self.module, self.path, self.source)
38    }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq)]
42pub struct PackageSource {
43    package: EcoString,
44    direct_dependencies: Box<[EcoString]>,
45    modules: Box<[ModuleSource]>,
46}
47
48impl PackageSource {
49    pub fn new<Dependency>(
50        package: impl Into<EcoString>,
51        direct_dependencies: impl IntoIterator<Item = Dependency>,
52        modules: impl IntoIterator<Item = ModuleSource>,
53    ) -> Self
54    where
55        Dependency: Into<EcoString>,
56    {
57        Self {
58            package: package.into(),
59            direct_dependencies: direct_dependencies.into_iter().map(Into::into).collect(),
60            modules: modules.into_iter().collect(),
61        }
62    }
63
64    pub fn package(&self) -> &EcoString {
65        &self.package
66    }
67
68    pub fn direct_dependencies(&self) -> &[EcoString] {
69        &self.direct_dependencies
70    }
71
72    pub fn modules(&self) -> &[ModuleSource] {
73        &self.modules
74    }
75
76    pub(super) fn into_parts(self) -> (EcoString, Box<[EcoString]>, Box<[ModuleSource]>) {
77        (self.package, self.direct_dependencies, self.modules)
78    }
79}
80
81#[cfg(test)]
82mod tests {
83    use super::{ModuleSource, PackageSource};
84
85    #[test]
86    fn module_source_exposes_owned_source_parts() {
87        let source = ModuleSource::new("main", "src/main.gleam", "pub fn main() { 1 }");
88
89        assert_eq!(source.module(), "main");
90        assert_eq!(source.path().as_str(), "src/main.gleam");
91        assert_eq!(source.source(), "pub fn main() { 1 }");
92    }
93
94    #[test]
95    fn package_source_exposes_package_dependencies_and_modules() {
96        let source = PackageSource::new(
97            "application",
98            ["library"],
99            [ModuleSource::new(
100                "main",
101                "src/main.gleam",
102                "pub fn main() { 1 }",
103            )],
104        );
105
106        assert_eq!(source.package(), "application");
107        assert_eq!(source.direct_dependencies(), ["library"]);
108        assert_eq!(source.modules().len(), 1);
109        assert_eq!(source.modules()[0].module(), "main");
110    }
111}