From 1ae91c77d34eabb4c0ce544dd1365e15967eb596 Mon Sep 17 00:00:00 2001 From: rchaser53 Date: Mon, 30 Sep 2019 21:44:48 +0900 Subject: [PATCH 1/5] remove clone as far as possible --- src/client/mod.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index c8e54ae..e248898 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -29,13 +29,13 @@ pub struct Meta { impl From for Meta { fn from(meta: MetaRaw) -> Self { - let updated_on = match meta.updated_on { - Some(date) => date, - None => meta.created_on.clone(), + let (created_on, updated_on) = match meta.updated_on { + Some(date) => (meta.created_on, date), + None => (meta.created_on.clone(), meta.created_on), }; Meta { - id: meta.id.clone(), - created_on: meta.created_on.clone(), + id: meta.id, + created_on, updated_on, } } From 0f93424800565751f041d80749f05237b6dc749a Mon Sep 17 00:00:00 2001 From: rchaser53 Date: Fri, 4 Oct 2019 21:41:00 +0900 Subject: [PATCH 2/5] create Response and reconstruct --- src/client/mod.rs | 25 +++++++++++++++++-------- src/client/query_builder.rs | 13 ++++++++++--- src/lib.rs | 2 +- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index e248898..d6d14d7 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -9,8 +9,9 @@ use std::convert::From; use crate::error::{self, Error, Result}; use crate::url; use crate::QueryBuilder; +use crate::Response; -#[derive(Deserialize, Debug)] +#[derive(Debug, Deserialize)] struct MetaRaw { #[serde(rename = "_id")] id: String, @@ -20,7 +21,7 @@ struct MetaRaw { updated_on: Option, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize)] pub struct Meta { pub id: String, pub created_on: String, @@ -64,7 +65,7 @@ impl<'a> Client<'a> { self } - pub fn create(&self, data: &T) -> Result<(T, Meta)> + pub fn create(&self, data: &T) -> Result> where T: Serialize + DeserializeOwned, { @@ -78,7 +79,10 @@ impl<'a> Client<'a> { let raw = res.text().context(error::Network {})?; let data: T = from_str(&raw).context(error::Json { reason: "data" })?; let meta: MetaRaw = from_str(&raw).context(error::Json { reason: "meta" })?; - Ok((data, Meta::from(meta))) + Ok(Response { + data, + meta: Meta::from(meta), + }) } else { let err: ErrorMessage = res.json().context(error::Network {})?; Err(Error::General { @@ -88,7 +92,7 @@ impl<'a> Client<'a> { } } - pub fn create_bulk(&self, data: &Vec) -> Result> + pub fn create_bulk(&self, data: &Vec) -> Result>> where T: Serialize + DeserializeOwned, { @@ -105,6 +109,7 @@ impl<'a> Client<'a> { Ok(data .into_iter() .zip(meta.into_iter().map(|meta| Meta::from(meta))) + .map(|(data, meta)| Response { data, meta }) .collect()) } else { let err: ErrorMessage = res.json().context(error::Network {})?; @@ -119,7 +124,7 @@ impl<'a> Client<'a> { QueryBuilder::new(self) } - fn read_by_id(&self, id: &str) -> Result<(T, Meta)> + fn read_by_id(&self, id: &str) -> Result> where T: DeserializeOwned, { @@ -129,7 +134,10 @@ impl<'a> Client<'a> { let raw = res.text().context(error::Network {})?; let data: T = from_str(&raw).context(error::Json { reason: "data" })?; let meta: MetaRaw = from_str(&raw).context(error::Json { reason: "meta" })?; - Ok((data, Meta::from(meta))) + Ok(Response { + meta: Meta::from(meta), + data, + }) } else { let err: ErrorMessage = res.json().context(error::Network {})?; Err(Error::General { @@ -139,7 +147,7 @@ impl<'a> Client<'a> { } } - fn read_by_query(&self, query: &QueryBuilder) -> Result> + fn read_by_query(&self, query: &QueryBuilder) -> Result>> where T: DeserializeOwned, { @@ -152,6 +160,7 @@ impl<'a> Client<'a> { Ok(data .into_iter() .zip(meta.into_iter().map(|meta| Meta::from(meta))) + .map(|(data, meta)| Response { data, meta }) .collect()) } else { let err: ErrorMessage = res.json().context(error::Network {})?; diff --git a/src/client/query_builder.rs b/src/client/query_builder.rs index ee37533..a00c383 100644 --- a/src/client/query_builder.rs +++ b/src/client/query_builder.rs @@ -1,5 +1,6 @@ use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; use std::fmt; use crate::client::{Client, Meta}; @@ -23,6 +24,12 @@ pub struct QueryBuilder<'a> { q: Vec, } +#[derive(Debug, Deserialize, Serialize)] +pub struct Response { + pub data: T, + pub meta: Meta, +} + impl<'a> QueryBuilder<'a> { pub(in crate::client) fn new(client: &'a Client) -> QueryBuilder<'a> { QueryBuilder { @@ -83,7 +90,7 @@ impl<'a> QueryBuilder<'a> { } /// Get a single record by id. - pub fn id(&self, id: &str) -> Result<(T, Meta)> + pub fn id(&self, id: &str) -> Result> where T: DeserializeOwned, { @@ -91,7 +98,7 @@ impl<'a> QueryBuilder<'a> { } /// Get all records with default query parameters. - pub fn all(&self) -> Result> + pub fn all(&self) -> Result>> where T: DeserializeOwned, { @@ -100,7 +107,7 @@ impl<'a> QueryBuilder<'a> { } /// Run query with configured query parameters. - pub fn run(&self) -> Result> + pub fn run(&self) -> Result>> where T: DeserializeOwned, { diff --git a/src/lib.rs b/src/lib.rs index 33c1fcc..82d3e4d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -115,6 +115,6 @@ mod client; mod error; mod url; -pub use crate::client::query_builder::QueryBuilder; +pub use crate::client::query_builder::{QueryBuilder, Response}; pub use crate::client::Client; pub use crate::error::{Error, Result}; From 2ecdbfdf8ee9eaf5ba59f2eb574705c594c5337a Mon Sep 17 00:00:00 2001 From: rchaser53 Date: Fri, 4 Oct 2019 21:41:07 +0900 Subject: [PATCH 3/5] fix tests --- tests/client.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/client.rs b/tests/client.rs index afd6c4b..cdcd12d 100644 --- a/tests/client.rs +++ b/tests/client.rs @@ -1,4 +1,4 @@ -use jsonbox::{Client, Error}; +use jsonbox::{Client, Error, Response}; use matches::*; use mockito::mock; use serde::{Deserialize, Serialize}; @@ -25,7 +25,7 @@ fn test_create() { let res = client.create(&data); assert!(res.is_ok()); - let (data, meta) = res.unwrap(); + let Response { data, meta } = res.unwrap(); assert_eq!(data.name, "rust"); assert_eq!(data.count, 42); assert_eq!(meta.id, "11111111111111111111"); @@ -58,11 +58,11 @@ fn test_create_bulk() { let bulk = res.unwrap(); assert_eq!(bulk.len(), 2); - let (data, meta) = bulk.first().unwrap(); + let Response { data, meta } = bulk.first().unwrap(); assert_eq!(data.name, "rust"); assert_eq!(meta.id, "11111111111111111111"); - let (data, meta) = bulk.last().unwrap(); + let Response { data, meta } = bulk.last().unwrap(); assert_eq!(data.name, "cargo"); assert_eq!(meta.id, "22222222222222222222"); } @@ -82,11 +82,11 @@ fn test_read_all() { let all = res.unwrap(); assert_eq!(all.len(), 2); - let (data, meta) = all.first().unwrap(); + let Response { data, meta } = all.first().unwrap(); assert_eq!(data.name, "kuy"); assert_eq!(meta.id, "11111111111111111111"); - let (data, meta) = all.last().unwrap(); + let Response { data, meta } = all.last().unwrap(); assert_eq!(data.name, "github"); assert_eq!(meta.id, "22222222222222222222"); } @@ -122,7 +122,7 @@ fn test_read_limit() { let all = res.unwrap(); assert_eq!(all.len(), 1); - let (data, meta) = all.first().unwrap(); + let Response { data, meta } = all.first().unwrap(); assert_eq!(data.name, "kuy"); assert_eq!(meta.id, "11111111111111111111"); } @@ -142,7 +142,7 @@ fn test_read_skip() { let all = res.unwrap(); assert_eq!(all.len(), 1); - let (data, meta) = all.first().unwrap(); + let Response { data, meta } = all.first().unwrap(); assert_eq!(data.name, "github"); assert_eq!(meta.id, "22222222222222222222"); } @@ -162,12 +162,12 @@ fn test_read_sort() { let all = res.unwrap(); assert_eq!(all.len(), 2); - let (data, meta) = all.first().unwrap(); + let Response { data, meta } = all.first().unwrap(); assert_eq!(data.name, "github"); assert_eq!(data.count, 7); assert_eq!(meta.id, "22222222222222222222"); - let (data, meta) = all.last().unwrap(); + let Response { data, meta } = all.last().unwrap(); assert_eq!(data.name, "kuy"); assert_eq!(data.count, 42); assert_eq!(meta.id, "11111111111111111111"); @@ -185,7 +185,7 @@ fn test_read() { let res = client.read().id::("11111111111111111111"); assert!(res.is_ok()); - let (data, meta) = res.unwrap(); + let Response { data, meta } = res.unwrap(); assert_eq!(data.name, "kuy"); assert_eq!(data.count, 42); assert_eq!(meta.id, "11111111111111111111"); @@ -234,7 +234,7 @@ fn test_update() { let res = client.read().id::("33333333333333333333"); assert!(res.is_ok()); - let (data, meta) = res.unwrap(); + let Response { data, meta } = res.unwrap(); assert_eq!(data.name, "cargo"); assert_eq!(data.count, 42); assert_eq!(meta.id, "33333333333333333333"); From 2d8ebb1ad441bed628cbe90dbeb8326ab9f0de51 Mon Sep 17 00:00:00 2001 From: rchaser53 Date: Fri, 4 Oct 2019 21:41:13 +0900 Subject: [PATCH 4/5] fix examples --- examples/basic.rs | 18 +++++++++--------- examples/hello.rs | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/basic.rs b/examples/basic.rs index 6d5181a..69fbf3a 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -24,11 +24,11 @@ fn main() -> Result<(), Error> { let client = Client::new("box_8ed82aef3f93176996145"); let mut data = Data::new("kuy", 42, false); - let (record, meta1) = client.create(&data)?; - println!("CREATE: data={:?}, meta={:?}", record, meta1); + let res = client.create(&data)?; + println!("CREATE: data={:?}, meta={:?}", res.data, res.meta); - let (record, meta1) = client.read().id::(&meta1.id)?; - println!("READ single: data={:?}, meta={:?}", record, meta1); + let res = client.read().id::(&res.meta.id)?; + println!("READ single: data={:?}, meta={:?}", res.data, res.meta); let list = vec![Data::new("jsonbox", 21, false), Data::new("io", 16, true)]; let bulk = client.create_bulk(&list)?; @@ -43,8 +43,8 @@ fn main() -> Result<(), Error> { let few = client.read().limit(1).run::()?; println!("READ: len={}, few={:?}", few.len(), few); - data.name = format!("kuy {}", meta1.id); - client.update(&meta1.id, &data)?; + data.name = format!("kuy {}", res.meta.id); + client.update(&res.meta.id, &data)?; println!("UPDATE: OK"); let filtered = client @@ -58,12 +58,12 @@ fn main() -> Result<(), Error> { let filtered = client .read() - .filter_by("name:*{}", &meta1.id) + .filter_by("name:*{}", &res.meta.id) .run::()?; println!("READ: len={}, filtered={:?}", filtered.len(), filtered); data.age = 8; - client.update(&meta1.id, &data)?; + client.update(&res.meta.id, &data)?; println!("UPDATE: OK"); let filtered = client @@ -73,7 +73,7 @@ fn main() -> Result<(), Error> { .run::()?; println!("READ: len={}, filtered={:?}", filtered.len(), filtered); - client.delete(&meta1.id)?; + client.delete(&res.meta.id)?; println!("DELETE: OK"); Ok(()) diff --git a/examples/hello.rs b/examples/hello.rs index e1b2172..958b9e6 100644 --- a/examples/hello.rs +++ b/examples/hello.rs @@ -14,12 +14,12 @@ fn main() -> Result<(), Error> { let client = Client::new("kuy_ed82aef3f93176996146"); let all = client.read().all::()?; - if let Some((record, meta)) = all.first() { + if let Some(res) = all.first() { println!( "Greeting from {} at {}: {}", - record.name.trim(), - meta.created_on.trim(), - record.message.trim(), + res.data.name.trim(), + res.meta.created_on.trim(), + res.data.message.trim(), ); } else { println!("No message left, you're the first."); From 88c3b871df77a5fd8c290fc48b5be31ae4a947ef Mon Sep 17 00:00:00 2001 From: rchaser53 Date: Fri, 4 Oct 2019 21:43:49 +0900 Subject: [PATCH 5/5] fix documents --- src/lib.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 82d3e4d..a130166 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,8 +23,8 @@ //! name: "kuy".into(), //! message: "Hello, Jsonbox!".into(), //! }; -//! let (record, meta) = client.create(&data)?; -//! println!("CREATE: data={:?}, meta={:?}", record, meta); +//! let res = client.create(&data)?; +//! println!("CREATE: data={:?}, meta={:?}", res.data, res.meta); //! //! Ok(()) //! } @@ -37,8 +37,8 @@ //! name: "kuy".into(), //! message: "Hello, Jsonbox!".into(), //! }; -//! let (record, meta) = client.create(&data)?; -//! println!("CREATE: data={:?}, meta={:?}", record, meta); +//! let res = client.create(&data)?; +//! println!("CREATE: data={:?}, meta={:?}", res.data, res.meta); //! ``` //! //! ### READ @@ -53,8 +53,8 @@ //! #### with specific id //! //! ```ignore -//! let (record, meta) = client.read().id("5d876d852a780700177c0557")?; -//! println!("READ: data={:?}, meta={:?}", record, meta); +//! let res = client.read().id("5d876d852a780700177c0557")?; +//! println!("READ: data={:?}, meta={:?}", res.data, res.meta); //! ``` //! //! #### with limit