Skip to main content

interstice_sdk_core/host_calls/
core.rs

1use 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}