Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions examples/basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::<Data>(&meta1.id)?;
println!("READ single: data={:?}, meta={:?}", record, meta1);
let res = client.read().id::<Data>(&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)?;
Expand All @@ -43,8 +43,8 @@ fn main() -> Result<(), Error> {
let few = client.read().limit(1).run::<Data>()?;
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
Expand All @@ -58,12 +58,12 @@ fn main() -> Result<(), Error> {

let filtered = client
.read()
.filter_by("name:*{}", &meta1.id)
.filter_by("name:*{}", &res.meta.id)
.run::<Data>()?;
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
Expand All @@ -73,7 +73,7 @@ fn main() -> Result<(), Error> {
.run::<Data>()?;
println!("READ: len={}, filtered={:?}", filtered.len(), filtered);

client.delete(&meta1.id)?;
client.delete(&res.meta.id)?;
println!("DELETE: OK");

Ok(())
Expand Down
8 changes: 4 additions & 4 deletions examples/hello.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ fn main() -> Result<(), Error> {
let client = Client::new("kuy_ed82aef3f93176996146");

let all = client.read().all::<Greeting>()?;
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.");
Expand Down
35 changes: 22 additions & 13 deletions src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -20,7 +21,7 @@ struct MetaRaw {
updated_on: Option<String>,
}

#[derive(Debug)]
#[derive(Debug, Deserialize, Serialize)]
pub struct Meta {
pub id: String,
pub created_on: String,
Expand All @@ -29,13 +30,13 @@ pub struct Meta {

impl From<MetaRaw> 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,
}
}
Expand Down Expand Up @@ -64,7 +65,7 @@ impl<'a> Client<'a> {
self
}

pub fn create<T>(&self, data: &T) -> Result<(T, Meta)>
pub fn create<T>(&self, data: &T) -> Result<Response<T>>
where
T: Serialize + DeserializeOwned,
{
Expand All @@ -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 {
Expand All @@ -88,7 +92,7 @@ impl<'a> Client<'a> {
}
}

pub fn create_bulk<T>(&self, data: &Vec<T>) -> Result<Vec<(T, Meta)>>
pub fn create_bulk<T>(&self, data: &Vec<T>) -> Result<Vec<Response<T>>>
where
T: Serialize + DeserializeOwned,
{
Expand All @@ -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 {})?;
Expand All @@ -119,7 +124,7 @@ impl<'a> Client<'a> {
QueryBuilder::new(self)
}

fn read_by_id<T>(&self, id: &str) -> Result<(T, Meta)>
fn read_by_id<T>(&self, id: &str) -> Result<Response<T>>
where
T: DeserializeOwned,
{
Expand All @@ -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 {
Expand All @@ -139,7 +147,7 @@ impl<'a> Client<'a> {
}
}

fn read_by_query<T>(&self, query: &QueryBuilder) -> Result<Vec<(T, Meta)>>
fn read_by_query<T>(&self, query: &QueryBuilder) -> Result<Vec<Response<T>>>
where
T: DeserializeOwned,
{
Expand All @@ -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 {})?;
Expand Down
13 changes: 10 additions & 3 deletions src/client/query_builder.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand All @@ -23,6 +24,12 @@ pub struct QueryBuilder<'a> {
q: Vec<String>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct Response<T> {
pub data: T,
pub meta: Meta,
}

impl<'a> QueryBuilder<'a> {
pub(in crate::client) fn new(client: &'a Client) -> QueryBuilder<'a> {
QueryBuilder {
Expand Down Expand Up @@ -83,15 +90,15 @@ impl<'a> QueryBuilder<'a> {
}

/// Get a single record by id.
pub fn id<T>(&self, id: &str) -> Result<(T, Meta)>
pub fn id<T>(&self, id: &str) -> Result<Response<T>>
where
T: DeserializeOwned,
{
self.client.read_by_id(id)
}

/// Get all records with default query parameters.
pub fn all<T>(&self) -> Result<Vec<(T, Meta)>>
pub fn all<T>(&self) -> Result<Vec<Response<T>>>
where
T: DeserializeOwned,
{
Expand All @@ -100,7 +107,7 @@ impl<'a> QueryBuilder<'a> {
}

/// Run query with configured query parameters.
pub fn run<T>(&self) -> Result<Vec<(T, Meta)>>
pub fn run<T>(&self) -> Result<Vec<Response<T>>>
where
T: DeserializeOwned,
{
Expand Down
14 changes: 7 additions & 7 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(())
//! }
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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};
24 changes: 12 additions & 12 deletions tests/client.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use jsonbox::{Client, Error};
use jsonbox::{Client, Error, Response};
use matches::*;
use mockito::mock;
use serde::{Deserialize, Serialize};
Expand All @@ -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");
Expand Down Expand Up @@ -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");
}
Expand All @@ -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");
}
Expand Down Expand Up @@ -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");
}
Expand All @@ -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");
}
Expand All @@ -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");
Expand All @@ -185,7 +185,7 @@ fn test_read() {
let res = client.read().id::<Data>("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");
Expand Down Expand Up @@ -234,7 +234,7 @@ fn test_update() {
let res = client.read().id::<Data>("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");
Expand Down