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}