Skip to content

Commit 3713094

Browse files
committed
Added Value type.
Converted all json::Value to Value (mostly zero allocs). Changed all imports to sorted imports (with some kind of order, at least)
1 parent 4d4eb50 commit 3713094

File tree

13 files changed

+207
-69
lines changed

13 files changed

+207
-69
lines changed

src/connection/unix_socket_connection.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
use crate::{
2+
connection::{BaseConnection, Buffer},
3+
utils::Error,
4+
};
5+
16
use async_std::{io::BufReader, os::unix::net::UnixStream, prelude::*, task};
27
use async_trait::async_trait;
38

@@ -10,11 +15,6 @@ use futures::{
1015
};
1116
use futures_util::SinkExt;
1217

13-
use crate::{
14-
connection::{BaseConnection, Buffer},
15-
utils::Error,
16-
};
17-
1818
pub struct UnixSocketConnection {
1919
connection_setup: bool,
2020
read_data_receiver: Option<UnboundedReceiver<Vec<u8>>>,

src/gotham_module.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::{
22
connection::{BaseConnection, Buffer, UnixSocketConnection},
3-
models::BaseMessage,
3+
models::{BaseMessage, Value},
44
protocol::BaseProtocol,
55
utils::{self, Error, Result},
66
};
7+
use std::collections::HashMap;
78
use async_std::{
89
prelude::*,
910
sync::{Arc, Mutex},
@@ -14,11 +15,9 @@ use futures::channel::{
1415
oneshot::{channel, Sender},
1516
};
1617
use futures_util::sink::SinkExt;
17-
use serde_json::{Map, Value};
18-
use std::collections::HashMap;
1918

2019
type ArcRequestList = Arc<Mutex<HashMap<String, Sender<Result<Value>>>>>;
21-
type ArcFunctionList = Arc<Mutex<HashMap<String, fn(Map<String, Value>) -> Value>>>;
20+
type ArcFunctionList = Arc<Mutex<HashMap<String, fn(HashMap<String, Value>) -> Value>>>;
2221
type ArcHookListenerList = Arc<Mutex<HashMap<String, Vec<fn(Value)>>>>;
2322

2423
pub struct GothamModule {
@@ -74,7 +73,7 @@ impl GothamModule {
7473
pub async fn declare_function(
7574
&mut self,
7675
fn_name: String,
77-
function: fn(Map<String, Value>) -> Value,
76+
function: fn(HashMap<String, Value>) -> Value,
7877
) -> Result<()> {
7978
self.functions
8079
.lock()
@@ -89,7 +88,7 @@ impl GothamModule {
8988
pub async fn call_function(
9089
&mut self,
9190
fn_name: String,
92-
args: Map<String, Value>,
91+
args: HashMap<String, Value>,
9392
) -> Result<Value> {
9493
self.ensure_registered()?;
9594
let request = self.protocol.call_function(fn_name, args);
@@ -172,19 +171,18 @@ impl GothamModule {
172171
}
173172
}
174173

175-
let mut encoded = self.protocol.encode(&request);
176-
if self.registered || request.get_type() == 1 {
174+
let request_type = request.get_type();
175+
let request_id = request.get_request_id().clone();
176+
let mut encoded = self.protocol.encode(request);
177+
if self.registered || request_type == 1 {
177178
self.connection.send(encoded).await;
178179
} else {
179180
self.message_buffer.append(&mut encoded);
180181
}
181182

182183
let (sender, receiver) = channel::<Result<Value>>();
183184

184-
self.requests
185-
.lock()
186-
.await
187-
.insert(request.get_request_id().clone(), sender);
185+
self.requests.lock().await.insert(request_id, sender);
188186

189187
match receiver.await {
190188
Ok(value) => value,
@@ -213,11 +211,11 @@ async fn on_data_listener(
213211
BaseMessage::FunctionCallRequest { .. } => {
214212
let result = execute_function_call(message, &functions).await;
215213
let write_buffer = match result {
216-
Ok(value) => protocol.encode(&BaseMessage::FunctionCallResponse {
214+
Ok(value) => protocol.encode(BaseMessage::FunctionCallResponse {
217215
request_id: request_id.clone(),
218216
data: value,
219217
}),
220-
Err(error) => protocol.encode(&BaseMessage::Error {
218+
Err(error) => protocol.encode(BaseMessage::Error {
221219
request_id: request_id.clone(),
222220
error: match error {
223221
Error::Internal(_) => 0,

src/models/json_value.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
use crate::models::{Number, Value};
2+
use std::{collections::HashMap, convert::From};
3+
4+
impl From<serde_json::Number> for Number {
5+
fn from(value: serde_json::Number) -> Self {
6+
if value.is_f64() {
7+
return Number::Decimal(value.as_f64().unwrap());
8+
} else if value.is_i64() {
9+
return Number::SignedInteger(value.as_i64().unwrap().into());
10+
} else {
11+
return Number::UnsignedInteger(value.as_u64().unwrap().into());
12+
}
13+
}
14+
}
15+
16+
impl Into<serde_json::Number> for Number {
17+
fn into(self) -> serde_json::Number {
18+
match self {
19+
Number::SignedInteger(s) => serde_json::Number::from(s),
20+
Number::UnsignedInteger(u) => serde_json::Number::from(u),
21+
Number::Decimal(d) => serde_json::Number::from_f64(d).unwrap(),
22+
}
23+
}
24+
}
25+
26+
impl From<serde_json::Value> for Value {
27+
fn from(v: serde_json::Value) -> Self {
28+
match v {
29+
serde_json::Value::Null => Value::Null,
30+
serde_json::Value::Bool(b) => Value::Bool(b),
31+
serde_json::Value::Number(n) => Value::Number(n.into()),
32+
serde_json::Value::String(s) => Value::String(s),
33+
serde_json::Value::Array(arr) => {
34+
let mut vec: Vec<Value> = vec![];
35+
for item in arr.into_iter() {
36+
vec.push(item.into());
37+
}
38+
Value::Array(vec)
39+
}
40+
serde_json::Value::Object(map) => {
41+
let mut hashmap: HashMap<String, Value> = HashMap::new();
42+
for item in map.into_iter() {
43+
hashmap.insert(item.0, item.1.into());
44+
}
45+
Value::Object(hashmap)
46+
}
47+
}
48+
}
49+
}
50+
51+
impl Into<serde_json::Value> for Value {
52+
fn into(self) -> serde_json::Value {
53+
match self {
54+
Value::Null => serde_json::Value::Null,
55+
Value::Bool(b) => serde_json::Value::Bool(b),
56+
Value::Number(n) => serde_json::Value::Number(n.into()),
57+
Value::String(s) => serde_json::Value::String(s),
58+
Value::Array(arr) => {
59+
let mut vec: Vec<serde_json::Value> = vec![];
60+
for item in arr.into_iter() {
61+
vec.push(item.into());
62+
}
63+
serde_json::Value::Array(vec)
64+
}
65+
Value::Object(hashmap) => {
66+
let mut map: serde_json::Map<String, serde_json::Value> = serde_json::Map::new();
67+
for item in hashmap.into_iter() {
68+
map.insert(item.0, item.1.into());
69+
}
70+
serde_json::Value::Object(map)
71+
}
72+
}
73+
}
74+
}

src/models/messages.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
use serde_json::{Map, Value};
2-
1+
use crate::{models::Value, utils::request_types};
32
use std::collections::HashMap;
43

54
pub enum BaseMessage {
@@ -15,7 +14,7 @@ pub enum BaseMessage {
1514
FunctionCallRequest {
1615
request_id: String,
1716
function: String,
18-
arguments: Map<String, Value>,
17+
arguments: HashMap<String, Value>,
1918
},
2019
FunctionCallResponse {
2120
request_id: String,
@@ -55,8 +54,8 @@ pub enum BaseMessage {
5554
impl BaseMessage {
5655
pub fn get_type(&self) -> u64 {
5756
match &self {
58-
BaseMessage::Unknown { .. } | BaseMessage::Error { .. } => 0,
59-
BaseMessage::RegisterModuleRequest { .. } => 1,
57+
BaseMessage::Unknown { .. } | BaseMessage::Error { .. } => request_types::ERROR,
58+
BaseMessage::RegisterModuleRequest { .. } => request_types::MODULE_REGISTRATION,
6059
BaseMessage::RegisterModuleResponse { .. } => 2,
6160
BaseMessage::FunctionCallRequest { .. } => 3,
6261
BaseMessage::FunctionCallResponse { .. } => 4,

src/models/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
mod json_value;
12
mod messages;
3+
mod value;
24

35
pub use messages::BaseMessage;
6+
pub use value::{Number, Value};

src/models/value.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use std::collections::HashMap;
2+
3+
#[derive(Debug, Clone, PartialEq)]
4+
pub enum Number {
5+
SignedInteger(i64),
6+
UnsignedInteger(u64),
7+
Decimal(f64),
8+
}
9+
10+
#[derive(Debug, Clone, PartialEq)]
11+
pub enum Value {
12+
Null,
13+
Bool(bool),
14+
Number(Number),
15+
String(String),
16+
Array(Vec<Value>),
17+
Object(HashMap<String, Value>),
18+
}

src/protocol/base_protocol.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1+
use crate::{
2+
connection::Buffer,
3+
models::{BaseMessage, Value},
4+
protocol::json_protocol,
5+
};
6+
17
use std::{
28
collections::HashMap,
39
time::{SystemTime, UNIX_EPOCH},
410
};
511

6-
use crate::{connection::Buffer, models::BaseMessage, protocol::json_protocol};
7-
8-
use serde_json::{Map, Value};
9-
1012
pub enum BaseProtocol {
1113
JsonProtocol { module_id: String },
1214
MsgPackProtocol { module_id: String },
@@ -87,15 +89,19 @@ impl BaseProtocol {
8789
}
8890
}
8991

90-
pub fn call_function(&self, function: String, arguments: Map<String, Value>) -> BaseMessage {
92+
pub fn call_function(
93+
&self,
94+
function: String,
95+
arguments: HashMap<String, Value>,
96+
) -> BaseMessage {
9197
BaseMessage::FunctionCallRequest {
9298
request_id: self.generate_request_id(),
9399
function,
94100
arguments,
95101
}
96102
}
97103

98-
pub fn encode(&self, req: &BaseMessage) -> Buffer {
104+
pub fn encode(&self, req: BaseMessage) -> Buffer {
99105
match self {
100106
BaseProtocol::JsonProtocol { .. } => json_protocol::encode(&self, req),
101107
_ => panic!("Currently, only JsonProtocol is supported"),

0 commit comments

Comments
 (0)