interstice_sdk_core/host_calls/
core.rs1use interstice_abi::{
2 CallQueryRequest, CallQueryResponse, CallReducerRequest, CallReducerResponse, DeleteRowRequest,
3 DeleteRowResponse, DeterministicRandomRequest, DeterministicRandomResponse, HostCall, IndexKey,
4 IndexQuery, InsertRowRequest, InsertRowResponse, IntersticeValue, LogRequest, ModuleSelection,
5 NodeSelection, Row, TableGetByPrimaryKeyRequest, TableGetByPrimaryKeyResponse,
6 TableIndexScanRequest, TableIndexScanResponse, TableScanRequest, TableScanResponse,
7 TimeRequest, TimeResponse, UpdateRowRequest, UpdateRowResponse,
8};
9
10pub fn log(message: &str) {
11 let call = HostCall::Log(LogRequest {
12 message: message.to_string(),
13 });
14 host_call(call);
15}
16
17pub fn call_reducer(
18 node_selection: NodeSelection,
19 module_selection: ModuleSelection,
20 reducer_name: String,
21 input: IntersticeValue,
22) -> Result<(), String> {
23 let call = HostCall::CallReducer(CallReducerRequest {
24 node_selection,
25 module_selection,
26 reducer_name,
27 input,
28 });
29
30 let pack = host_call(call);
31 let response: CallReducerResponse = unpack(pack);
32 match response {
33 CallReducerResponse::Ok => Ok(()),
34 CallReducerResponse::Err(err) => Err(err),
35 }
36}
37
38pub fn call_query(
39 node_selection: NodeSelection,
40 module_selection: ModuleSelection,
41 query_name: String,
42 input: IntersticeValue,
43) -> Result<IntersticeValue, String> {
44 let call = HostCall::CallQuery(CallQueryRequest {
45 node_selection,
46 module_selection,
47 query_name,
48 input,
49 });
50
51 let pack = host_call(call);
52 let response: CallQueryResponse = unpack(pack);
53 match response {
54 CallQueryResponse::Ok(value) => Ok(value),
55 CallQueryResponse::Err(err) => Err(err),
56 }
57}
58
59pub fn deterministic_random_u64() -> Result<u64, String> {
60 let call = HostCall::DeterministicRandom(DeterministicRandomRequest {});
61 let pack = host_call(call);
62 let response: DeterministicRandomResponse = unpack(pack);
63 match response {
64 DeterministicRandomResponse::Ok(value) => Ok(value),
65 DeterministicRandomResponse::Err(err) => Err(err),
66 }
67}
68
69pub fn time_now_ms() -> Result<u64, String> {
70 let call = HostCall::Time(TimeRequest {});
71 let pack = host_call(call);
72 let response: TimeResponse = unpack(pack);
73 match response {
74 TimeResponse::Ok { unix_ms } => Ok(unix_ms),
75 TimeResponse::Err(err) => Err(err),
76 }
77}
78
79pub fn insert_row(
80 module_selection: ModuleSelection,
81 table_name: String,
82 row: Row,
83) -> Result<Row, String> {
84 let call = HostCall::InsertRow(InsertRowRequest {
85 module_selection,
86 table_name,
87 row,
88 });
89
90 let pack = host_call(call);
91 let response: InsertRowResponse = unpack(pack);
92 match response {
93 InsertRowResponse::Ok(row) => Ok(row),
94 InsertRowResponse::Err(err) => Err(err),
95 }
96}
97
98pub fn update_row(
99 module_selection: ModuleSelection,
100 table_name: String,
101 row: Row,
102) -> Result<(), String> {
103 let call = HostCall::UpdateRow(UpdateRowRequest {
104 module_selection,
105 table_name,
106 row,
107 });
108
109 let pack = host_call(call);
110 let response: UpdateRowResponse = unpack(pack);
111 match response {
112 UpdateRowResponse::Ok => Ok(()),
113 UpdateRowResponse::Err(err) => Err(err),
114 }
115}
116
117pub fn delete_row(
118 module_selection: ModuleSelection,
119 table_name: String,
120 primary_key: IndexKey,
121) -> Result<(), String> {
122 let call = HostCall::DeleteRow(DeleteRowRequest {
123 module_selection,
124 table_name,
125 primary_key,
126 });
127
128 let pack = host_call(call);
129 let response: DeleteRowResponse = unpack(pack);
130 match response {
131 DeleteRowResponse::Ok => Ok(()),
132 DeleteRowResponse::Err(err) => Err(err),
133 }
134}
135
136pub fn scan(module_selection: ModuleSelection, table_name: String) -> Result<Vec<Row>, String> {
137 let call = HostCall::TableScan(TableScanRequest {
138 module_selection,
139 table_name,
140 });
141
142 let pack = host_call(call);
143 let response: TableScanResponse = unpack(pack);
144 match response {
145 TableScanResponse::Ok { rows } => Ok(rows),
146 TableScanResponse::Err(err) => Err(err),
147 }
148}
149
150pub fn get_by_primary_key(
151 module_selection: ModuleSelection,
152 table_name: String,
153 primary_key: IndexKey,
154) -> Result<Option<Row>, String> {
155 let call = HostCall::TableGetByPrimaryKey(TableGetByPrimaryKeyRequest {
156 module_selection,
157 table_name,
158 primary_key,
159 });
160
161 let pack = host_call(call);
162 let response: TableGetByPrimaryKeyResponse = unpack(pack);
163 match response {
164 TableGetByPrimaryKeyResponse::Ok(row) => Ok(row),
165 TableGetByPrimaryKeyResponse::Err(err) => Err(err),
166 }
167}
168
169pub fn scan_index(
170 module_selection: ModuleSelection,
171 table_name: String,
172 field_name: String,
173 query: IndexQuery,
174) -> Result<Vec<Row>, String> {
175 let call = HostCall::TableIndexScan(TableIndexScanRequest {
176 module_selection,
177 table_name,
178 field_name,
179 query,
180 });
181
182 let pack = host_call(call);
183 let response: TableIndexScanResponse = unpack(pack);
184 match response {
185 TableIndexScanResponse::Ok { rows } => Ok(rows),
186 TableIndexScanResponse::Err(err) => Err(err),
187 }
188}
189
190use interstice_abi::{QueryContext, ReducerContext};
191
192use crate::host_calls::{host_call, unpack};
193
194pub trait HostLog {
195 fn log(&self, message: &str);
196}
197
198pub trait HostTime {
199 fn time_now_ms(&self) -> Result<u64, String>;
200}
201
202pub trait HostDeterministicRandom {
203 fn deterministic_random_u64(&self) -> Result<u64, String>;
204}
205
206impl HostLog for ReducerContext {
207 fn log(&self, message: &str) {
208 log(message);
209 }
210}
211
212impl HostLog for QueryContext {
213 fn log(&self, message: &str) {
214 log(message);
215 }
216}
217
218impl HostTime for ReducerContext {
219 fn time_now_ms(&self) -> Result<u64, String> {
220 time_now_ms()
221 }
222}
223
224impl HostTime for QueryContext {
225 fn time_now_ms(&self) -> Result<u64, String> {
226 time_now_ms()
227 }
228}
229
230impl HostDeterministicRandom for ReducerContext {
231 fn deterministic_random_u64(&self) -> Result<u64, String> {
232 deterministic_random_u64()
233 }
234}
235
236impl HostDeterministicRandom for QueryContext {
237 fn deterministic_random_u64(&self) -> Result<u64, String> {
238 deterministic_random_u64()
239 }
240}