tetsy_wasm/builder/
export.rs1use alloc::{borrow::ToOwned, string::String};
2use super::invoke::{Invoke, Identity};
3use crate::elements;
4
5pub struct ExportBuilder<F=Identity> {
7 callback: F,
8 field: String,
9 binding: elements::Internal,
10}
11
12impl ExportBuilder {
13 pub fn new() -> Self {
15 ExportBuilder::with_callback(Identity)
16 }
17}
18
19impl<F> ExportBuilder<F> {
20
21 pub fn with_callback(callback: F) -> Self {
23 ExportBuilder {
24 callback: callback,
25 field: String::new(),
26 binding: elements::Internal::Function(0),
27 }
28 }
29
30 pub fn field(mut self, field: &str) -> Self {
32 self.field = field.to_owned();
33 self
34 }
35
36 pub fn with_internal(mut self, external: elements::Internal) -> Self {
38 self.binding = external;
39 self
40 }
41
42 pub fn internal(self) -> ExportInternalBuilder<Self> {
44 ExportInternalBuilder::with_callback(self)
45 }
46}
47
48impl<F> ExportBuilder<F> where F: Invoke<elements::ExportEntry> {
49 pub fn build(self) -> F::Result {
51 self.callback.invoke(elements::ExportEntry::new(self.field, self.binding))
52 }
53}
54
55impl<F> Invoke<elements::Internal> for ExportBuilder<F> {
56 type Result = Self;
57 fn invoke(self, val: elements::Internal) -> Self {
58 self.with_internal(val)
59 }
60}
61
62pub struct ExportInternalBuilder<F=Identity> {
64 callback: F,
65 binding: elements::Internal,
66}
67
68impl<F> ExportInternalBuilder<F> where F: Invoke<elements::Internal> {
69 pub fn with_callback(callback: F) -> Self {
71 ExportInternalBuilder{
72 callback: callback,
73 binding: elements::Internal::Function(0),
74 }
75 }
76
77 pub fn func(mut self, index: u32) -> F::Result {
79 self.binding = elements::Internal::Function(index);
80 self.callback.invoke(self.binding)
81 }
82
83 pub fn memory(mut self, index: u32) -> F::Result {
85 self.binding = elements::Internal::Memory(index);
86 self.callback.invoke(self.binding)
87 }
88
89 pub fn table(mut self, index: u32) -> F::Result {
91 self.binding = elements::Internal::Table(index);
92 self.callback.invoke(self.binding)
93 }
94
95 pub fn global(mut self, index: u32) -> F::Result {
97 self.binding = elements::Internal::Global(index);
98 self.callback.invoke(self.binding)
99 }
100}
101
102pub fn export() -> ExportBuilder {
104 ExportBuilder::new()
105}
106
107#[cfg(test)]
108mod tests {
109 use super::export;
110
111 #[test]
112 fn example() {
113 let entry = export().field("memory").internal().memory(0).build();
114 assert_eq!(entry.field(), "memory");
115 }
116}