geam_core/frontend/
module.rs1use 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}