Skip to main content

interstice_abi/host_calls/
mod.rs

1mod audio;
2mod file;
3mod gpu;
4mod input;
5mod module;
6
7pub use audio::*;
8pub use file::*;
9pub use gpu::*;
10pub use input::*;
11pub use module::*;
12
13use crate::{IndexKey, IntersticeValue, Row};
14use serde::{Deserialize, Serialize};
15
16#[derive(Debug, Deserialize, Serialize)]
17pub enum HostCall {
18    CallReducer(CallReducerRequest),
19    Schedule(ScheduleRequest),
20    CallQuery(CallQueryRequest),
21    TableScan(TableScanRequest),
22    TableGetByPrimaryKey(TableGetByPrimaryKeyRequest),
23    TableIndexScan(TableIndexScanRequest),
24    Gpu(GpuCall),
25    Audio(AudioCall),
26    File(FileCall),
27    Module(ModuleCall),
28    CurrentNodeId,
29}
30
31#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
32pub enum NodeSelection {
33    Current,
34    Other(String),
35}
36
37#[derive(Debug, Serialize, Deserialize)]
38pub enum ModuleSelection {
39    Current,
40    Other(String),
41}
42
43#[derive(Debug, Serialize, Deserialize)]
44pub struct ScheduleRequest {
45    pub reducer_name: String,
46    pub delay_ms: u64,
47}
48
49#[derive(Debug, Serialize, Deserialize)]
50pub enum ScheduleResponse {
51    Ok,
52    Err(String),
53}
54
55#[derive(Debug, Serialize, Deserialize)]
56pub struct CallReducerRequest {
57    pub node_selection: NodeSelection,
58    pub module_selection: ModuleSelection,
59    pub reducer_name: String,
60    pub input: IntersticeValue,
61}
62
63#[derive(Debug, Serialize, Deserialize)]
64pub enum CallReducerResponse {
65    Ok,
66    Err(String),
67}
68
69#[derive(Debug, Serialize, Deserialize)]
70pub struct CallQueryRequest {
71    pub node_selection: NodeSelection,
72    pub module_selection: ModuleSelection,
73    pub query_name: String,
74    pub input: IntersticeValue,
75}
76
77#[derive(Debug, Serialize, Deserialize)]
78pub enum CallQueryResponse {
79    Ok(IntersticeValue),
80    Err(String),
81}
82
83#[derive(Debug, Serialize, Deserialize)]
84pub struct DeterministicRandomRequest {}
85
86#[derive(Debug, Serialize, Deserialize)]
87pub enum DeterministicRandomResponse {
88    Ok(u64),
89    Err(String),
90}
91
92#[derive(Debug, Serialize, Deserialize)]
93pub struct TimeRequest {}
94
95#[derive(Debug, Serialize, Deserialize)]
96pub enum TimeResponse {
97    Ok { unix_ms: u64 },
98    Err(String),
99}
100
101#[derive(Debug, Serialize, Deserialize)]
102pub struct LogRequest {
103    pub message: String,
104}
105
106#[derive(Debug, Deserialize, Serialize)]
107pub struct InsertRowRequest {
108    pub table_name: String,
109    pub row: Row,
110}
111
112/// `Ok(None)` = row was inserted unchanged (no auto-inc fields); caller should use the row it
113/// already has.  `Ok(Some(row))` = auto-inc fields were filled in; caller must use the returned
114/// row.  This avoids serialising + deserialising the full row on the hot path for the common
115/// non-auto-inc case.
116#[derive(Debug, Deserialize, Serialize)]
117pub enum InsertRowResponse {
118    Ok(Option<Row>),
119    Err(String),
120}
121
122#[derive(Debug, Deserialize, Serialize)]
123pub struct UpdateRowRequest {
124    pub table_name: String,
125    pub row: Row,
126}
127
128#[derive(Debug, Deserialize, Serialize)]
129pub enum UpdateRowResponse {
130    Ok,
131    Err(String),
132}
133
134#[derive(Debug, Deserialize, Serialize)]
135pub struct DeleteRowRequest {
136    pub table_name: String,
137    pub primary_key: IndexKey,
138}
139
140#[derive(Debug, Deserialize, Serialize)]
141pub enum DeleteRowResponse {
142    Ok,
143    Err(String),
144}
145
146#[derive(Debug, Deserialize, Serialize)]
147pub struct ClearTableRequest {
148    pub module_selection: ModuleSelection,
149    pub table_name: String,
150}
151
152#[derive(Debug, Deserialize, Serialize)]
153pub enum ClearTableResponse {
154    Ok,
155    Err(String),
156}
157
158#[derive(Debug, Deserialize, Serialize)]
159pub struct TableScanRequest {
160    pub module_selection: ModuleSelection,
161    pub table_name: String,
162}
163
164#[derive(Debug, Deserialize, Serialize)]
165pub enum TableScanResponse {
166    Ok { rows: Vec<Row> },
167    Err(String),
168}
169
170#[derive(Debug, Deserialize, Serialize)]
171pub struct TableGetByPrimaryKeyRequest {
172    pub module_selection: ModuleSelection,
173    pub table_name: String,
174    pub primary_key: IndexKey,
175}
176
177#[derive(Debug, Deserialize, Serialize)]
178pub enum TableGetByPrimaryKeyResponse {
179    Ok(Option<Row>),
180    Err(String),
181}
182
183#[derive(Debug, Deserialize, Serialize)]
184pub enum IndexQuery {
185    Eq(IndexKey),
186    Lt(IndexKey),
187    Lte(IndexKey),
188    Gt(IndexKey),
189    Gte(IndexKey),
190    Range {
191        min: IndexKey,
192        max: IndexKey,
193        include_min: bool,
194        include_max: bool,
195    },
196}
197
198#[derive(Debug, Deserialize, Serialize)]
199pub struct TableIndexScanRequest {
200    pub module_selection: ModuleSelection,
201    pub table_name: String,
202    pub field_name: String,
203    pub query: IndexQuery,
204}
205
206#[derive(Debug, Deserialize, Serialize)]
207pub enum TableIndexScanResponse {
208    Ok { rows: Vec<Row> },
209    Err(String),
210}
211
212pub fn get_reducer_wrapper_name(reducer_name: &str) -> String {
213    format!("__interstice_reducer_wrapper_{}", reducer_name)
214}
215
216pub fn get_query_wrapper_name(query_name: &str) -> String {
217    format!("__interstice_query_wrapper_{}", query_name)
218}