1pub use parity_scale_codec::{Decode, Encode};
2
3#[derive(Decode, Encode, Debug, Clone)]
4pub struct ModuleInit<Params = Vec<u8>> {
5 pub creator: String,
6 pub params: Params,
7}
8
9#[derive(Decode, Encode, Debug, Clone)]
10pub struct IncomingEvent<Payload = Vec<u8>, Params = Vec<u8>> {
11 pub payload: Payload,
12 pub params: Params,
13 pub user: String,
14}
15
16#[derive(Decode, Encode, Debug, Clone)]
17pub struct EventRequest<Payload = Vec<u8>, Params = Vec<u8>, Filter = Vec<u8>> {
18 pub requesting_user: String,
19 pub incoming_event: IncomingEvent<Payload, Params>,
20 pub filter: Option<Filter>,
21}
22
23#[derive(Decode, Encode, Debug, Clone, Default)]
24pub enum Inbound {
25 #[default]
26 Allow,
27 Block {
28 reason: String,
29 },
30}
31
32#[derive(Decode, Encode, Debug, Clone, Default)]
33pub enum Outbound {
34 #[default]
35 Allow,
36 Block,
37}
38
39#[derive(Decode, Encode, Debug, Clone, Default)]
40pub struct Process {
41 pub new_module: Option<[u8; 32]>,
42 pub new_params: Option<Vec<u8>>,
43}
44
45#[derive(Decode, Encode, Debug, Clone, Default)]
46pub struct SqlQuery {
47 pub sql: String,
48 pub params: Vec<(String, SqlValue)>,
49}
50
51#[derive(Decode, Encode, Debug, Clone, Default)]
52pub struct SqlRows {
53 pub rows: Vec<SqlRow>,
54 pub column_names: Vec<String>,
55}
56
57#[derive(Decode, Encode, Debug, Clone, Default)]
58pub struct SqlRow {
59 pub values: Vec<SqlValue>,
60}
61
62#[derive(Decode, Encode, Debug, Clone, Default)]
63pub enum SqlValue {
64 #[default]
65 Null,
66 Integer(i64),
67 Real(f64),
68 Text(String),
69 Blob(Vec<u8>),
70}
71impl From<()> for SqlValue {
72 fn from(_: ()) -> Self {
73 SqlValue::Null
74 }
75}
76impl From<i64> for SqlValue {
77 fn from(value: i64) -> Self {
78 Self::Integer(value)
79 }
80}
81impl From<f64> for SqlValue {
82 fn from(value: f64) -> Self {
83 SqlValue::Real(value)
84 }
85}
86impl From<String> for SqlValue {
87 fn from(value: String) -> Self {
88 SqlValue::Text(value)
89 }
90}
91impl From<Vec<u8>> for SqlValue {
92 fn from(value: Vec<u8>) -> Self {
93 SqlValue::Blob(value)
94 }
95}
96
97#[derive(thiserror::Error, Debug)]
98pub enum SqlError {
99 #[error("Invalid value type")]
100 InvalidValueType,
101 #[error("Invalid column count")]
102 InvalidColumnCount,
103}
104
105pub type SqlResult<T> = Result<T, SqlError>;
106
107pub trait FromValue: Sized {
108 fn from_value(value: SqlValue) -> SqlResult<Self>;
109}
110pub trait FromRow: Sized {
111 fn from_row(row: SqlRow) -> SqlResult<Self>;
112}
113pub trait FromRows: Sized {
114 fn from_rows(rows: SqlRows) -> SqlResult<Self>;
115}
116
117impl SqlValue {
118 pub fn parse_value<T: FromValue>(self) -> SqlResult<T> {
119 T::from_value(self)
120 }
121}
122impl SqlRow {
123 pub fn parse_row<T: FromRow>(self) -> SqlResult<T> {
124 T::from_row(self)
125 }
126}
127impl SqlRows {
128 pub fn parse_rows<T: FromRows>(self) -> SqlResult<T> {
129 T::from_rows(self)
130 }
131}
132
133impl<T: FromValue> FromValue for Option<T> {
134 fn from_value(value: SqlValue) -> SqlResult<Self> {
135 match value {
136 SqlValue::Null => Ok(None),
137 v => Ok(Some(T::from_value(v)?)),
138 }
139 }
140}
141
142impl FromValue for [u8; 32] {
143 fn from_value(value: SqlValue) -> SqlResult<Self> {
144 match value {
145 SqlValue::Blob(blob) => {
146 let bytes: [u8; 32] = blob.try_into().map_err(|_| SqlError::InvalidValueType)?;
147 Ok(bytes)
148 }
149 _ => Err(SqlError::InvalidValueType),
150 }
151 }
152}
153
154impl<T: FromRow> FromRows for Vec<T> {
155 fn from_rows(rows: SqlRows) -> SqlResult<Self> {
156 rows.rows
157 .into_iter()
158 .map(|row| T::from_row(row))
159 .collect::<SqlResult<Vec<_>>>()
160 }
161}
162
163impl FromValue for String {
164 fn from_value(value: SqlValue) -> SqlResult<Self> {
165 if let SqlValue::Text(x) = value {
166 Ok(x)
167 } else {
168 Err(SqlError::InvalidValueType)
169 }
170 }
171}
172impl FromValue for i64 {
173 fn from_value(value: SqlValue) -> SqlResult<Self> {
174 if let SqlValue::Integer(x) = value {
175 Ok(x)
176 } else {
177 Err(SqlError::InvalidValueType)
178 }
179 }
180}
181impl FromValue for f64 {
182 fn from_value(value: SqlValue) -> SqlResult<Self> {
183 if let SqlValue::Real(x) = value {
184 Ok(x)
185 } else {
186 Err(SqlError::InvalidValueType)
187 }
188 }
189}
190impl FromValue for Vec<u8> {
191 fn from_value(value: SqlValue) -> SqlResult<Self> {
192 if let SqlValue::Blob(x) = value {
193 Ok(x)
194 } else {
195 Err(SqlError::InvalidValueType)
196 }
197 }
198}
199
200impl FromValue for SqlValue {
201 fn from_value(value: SqlValue) -> SqlResult<Self> {
202 Ok(value)
203 }
204}
205
206macro_rules! impl_from_row {
207 ($($t:ident),*) => {
208 impl<$($t: FromValue),*> FromRow for ($( $t ),*) {
209 fn from_row(row: SqlRow) -> SqlResult<Self> {
210 let mut values = row.values.into_iter();
211 Ok((
212 $(
213 $t::from_value(values.next().ok_or(SqlError::InvalidColumnCount)?)?
214 ),*
215 ))
216 }
217 }
218 };
219}
220impl<T: FromValue> FromRow for T {
221 fn from_row(row: SqlRow) -> SqlResult<Self> {
222 T::from_value(
223 row.values
224 .into_iter()
225 .next()
226 .ok_or(SqlError::InvalidColumnCount)?,
227 )
228 }
229}
230
231impl_from_row!(A, B);
232impl_from_row!(A, B, C);
233impl_from_row!(A, B, C, D);
234impl_from_row!(A, B, C, D, E);
235impl_from_row!(A, B, C, D, E, F);
236impl_from_row!(A, B, C, D, E, F, G);