Skip to main content

geam_core/plan/
host.rs

1mod function;
2mod implementation;
3mod module;
4
5use super::{FunctionTemplateId, ModuleId};
6use crate::host::HostProfile;
7
8pub use function::HostFunctionTemplate;
9pub(crate) use implementation::HostImplementationBinding;
10pub(crate) use module::HostedPlannedModuleParts;
11pub use module::{HostedFunctionTemplate, HostedPlannedModule};
12
13pub struct HostedModulePlan<Profile: HostProfile> {
14    root: ModuleId,
15    entry: FunctionTemplateId,
16    modules: Vec<HostedPlannedModule>,
17    implementation_bindings: Vec<HostImplementationBinding<Profile>>,
18}
19
20pub(crate) struct HostedLibraryModulePlan<Profile: HostProfile> {
21    root: ModuleId,
22    modules: Vec<HostedPlannedModule>,
23    implementation_bindings: Vec<HostImplementationBinding<Profile>>,
24}
25
26pub(crate) struct HostedModulePlanParts<Profile: HostProfile> {
27    pub(crate) root: ModuleId,
28    pub(crate) entry: FunctionTemplateId,
29    pub(crate) modules: Vec<HostedPlannedModule>,
30    pub(crate) implementation_bindings: Vec<HostImplementationBinding<Profile>>,
31}
32
33pub(crate) struct HostedLibraryModulePlanParts<Profile: HostProfile> {
34    pub(crate) root: ModuleId,
35    pub(crate) modules: Vec<HostedPlannedModule>,
36    pub(crate) implementation_bindings: Vec<HostImplementationBinding<Profile>>,
37}
38
39impl<Profile: HostProfile> HostedModulePlan<Profile> {
40    pub(crate) fn new(
41        root: ModuleId,
42        entry: FunctionTemplateId,
43        modules: Vec<HostedPlannedModule>,
44        implementation_bindings: Vec<HostImplementationBinding<Profile>>,
45    ) -> Self {
46        Self {
47            root,
48            entry,
49            modules,
50            implementation_bindings,
51        }
52    }
53
54    pub fn root(&self) -> ModuleId {
55        self.root
56    }
57
58    pub fn entry(&self) -> FunctionTemplateId {
59        self.entry
60    }
61
62    pub fn modules(&self) -> &[HostedPlannedModule] {
63        &self.modules
64    }
65
66    pub(crate) fn into_parts(self) -> HostedModulePlanParts<Profile> {
67        HostedModulePlanParts {
68            root: self.root,
69            entry: self.entry,
70            modules: self.modules,
71            implementation_bindings: self.implementation_bindings,
72        }
73    }
74}
75
76impl<Profile: HostProfile> HostedLibraryModulePlan<Profile> {
77    pub(crate) fn new(
78        root: ModuleId,
79        modules: Vec<HostedPlannedModule>,
80        implementation_bindings: Vec<HostImplementationBinding<Profile>>,
81    ) -> Self {
82        Self {
83            root,
84            modules,
85            implementation_bindings,
86        }
87    }
88
89    pub(crate) fn functions(&self) -> &[HostedFunctionTemplate] {
90        self.modules[self.root.index()].functions()
91    }
92
93    pub(crate) fn custom_type(
94        &self,
95        name: &super::CustomTypeName,
96    ) -> Option<&super::CustomTypeDefinition> {
97        self.modules
98            .iter()
99            .flat_map(HostedPlannedModule::custom_types)
100            .find(|definition| definition.name() == name)
101    }
102
103    pub(crate) fn into_parts(self) -> HostedLibraryModulePlanParts<Profile> {
104        HostedLibraryModulePlanParts {
105            root: self.root,
106            modules: self.modules,
107            implementation_bindings: self.implementation_bindings,
108        }
109    }
110}