-
Notifications
You must be signed in to change notification settings - Fork 1
/
convert.rs
56 lines (46 loc) · 1.74 KB
/
convert.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use serde_json::map::Map;
use serde_json::value::Value as Json;
use wasm_bindgen::prelude::JsValue;
use gluesql_core::{Payload, Row, Value};
pub fn convert(payloads: Vec<Payload>) -> JsValue {
let payloads = payloads
.into_iter()
.map(convert_payload)
.map(|(query, data)| {
let mut map = Map::new();
map.insert("query".to_owned(), Json::String(query));
map.insert("data".to_owned(), data);
Json::Object(map)
})
.collect();
let payloads = Json::Array(payloads);
JsValue::from_serde(&payloads).unwrap()
}
fn convert_payload(payload: Payload) -> (String, Json) {
match payload {
Payload::Create => ("CREATE".to_owned(), Json::Null),
Payload::Insert(num) => ("INSERT".to_owned(), Json::from(num)),
Payload::Select { rows, .. } => (
"SELECT".to_owned(),
Json::Array(rows.into_iter().map(convert_row).collect()),
),
Payload::Delete(num) => ("DELETE".to_owned(), Json::from(num)),
Payload::Update(num) => ("UPDATE".to_owned(), Json::from(num)),
Payload::DropTable => ("DROP".to_owned(), Json::Null),
Payload::AlterTable => ("ALTER TABLE".to_owned(), Json::Null),
}
}
fn convert_row(row: Row) -> Json {
let Row(values) = row;
Json::Array(values.into_iter().map(convert_value).collect())
}
fn convert_value(value: Value) -> Json {
use Value::*;
match value {
Bool(v) | OptBool(Some(v)) => Json::Bool(v),
I64(v) | OptI64(Some(v)) => Json::from(v),
F64(v) | OptF64(Some(v)) => Json::from(v),
Str(v) | OptStr(Some(v)) => Json::String(v),
OptBool(None) | OptI64(None) | OptF64(None) | OptStr(None) | Empty => Json::Null,
}
}