allow send_json to send any serde::Serialize value

This commit is contained in:
soruh
2021-12-11 15:59:34 +01:00
committed by Martin Algesten
parent 56276c3742
commit 59f1fab4d3
3 changed files with 12 additions and 25 deletions

View File

@@ -7,17 +7,12 @@ use crate::response::DEFAULT_CHARACTER_SET;
#[cfg(feature = "charset")] #[cfg(feature = "charset")]
use encoding_rs::Encoding; use encoding_rs::Encoding;
#[cfg(feature = "json")]
use super::SerdeValue;
/// The different kinds of bodies to send. /// The different kinds of bodies to send.
/// ///
/// *Internal API* /// *Internal API*
pub(crate) enum Payload<'a> { pub(crate) enum Payload<'a> {
Empty, Empty,
Text(&'a str, String), Text(&'a str, String),
#[cfg(feature = "json")]
JSON(SerdeValue),
Reader(Box<dyn Read + 'a>), Reader(Box<dyn Read + 'a>),
Bytes(&'a [u8]), Bytes(&'a [u8]),
} }
@@ -27,8 +22,6 @@ impl fmt::Debug for Payload<'_> {
match self { match self {
Payload::Empty => write!(f, "Empty"), Payload::Empty => write!(f, "Empty"),
Payload::Text(t, _) => write!(f, "{}", t), Payload::Text(t, _) => write!(f, "{}", t),
#[cfg(feature = "json")]
Payload::JSON(_) => write!(f, "JSON"),
Payload::Reader(_) => write!(f, "Reader"), Payload::Reader(_) => write!(f, "Reader"),
Payload::Bytes(v) => write!(f, "{:?}", v), Payload::Bytes(v) => write!(f, "{:?}", v),
} }
@@ -89,13 +82,6 @@ impl<'a> Payload<'a> {
let cursor = Cursor::new(bytes); let cursor = Cursor::new(bytes);
SizedReader::new(BodySize::Known(len as u64), Box::new(cursor)) SizedReader::new(BodySize::Known(len as u64), Box::new(cursor))
} }
#[cfg(feature = "json")]
Payload::JSON(v) => {
let bytes = serde_json::to_vec(&v).expect("Bad JSON in payload");
let len = bytes.len();
let cursor = Cursor::new(bytes);
SizedReader::new(BodySize::Known(len as u64), Box::new(cursor))
}
Payload::Reader(read) => SizedReader::new(BodySize::Unknown, read), Payload::Reader(read) => SizedReader::new(BodySize::Unknown, read),
Payload::Bytes(bytes) => { Payload::Bytes(bytes) => {
let len = bytes.len(); let len = bytes.len();

View File

@@ -9,9 +9,6 @@ use crate::unit::{self, Unit};
use crate::Response; use crate::Response;
use crate::{agent::Agent, error::Error}; use crate::{agent::Agent, error::Error};
#[cfg(feature = "json")]
use super::SerdeValue;
pub type Result<T> = std::result::Result<T, Error>; pub type Result<T> = std::result::Result<T, Error>;
/// Request instances are builders that creates a request. /// Request instances are builders that creates a request.
@@ -140,11 +137,15 @@ impl Request {
/// # } /// # }
/// ``` /// ```
#[cfg(feature = "json")] #[cfg(feature = "json")]
pub fn send_json(mut self, data: SerdeValue) -> Result<Response> { pub fn send_json(mut self, data: impl serde::Serialize) -> Result<Response> {
if self.header("Content-Type").is_none() { if self.header("Content-Type").is_none() {
self = self.set("Content-Type", "application/json"); self = self.set("Content-Type", "application/json");
} }
self.do_call(Payload::JSON(data))
let json_bytes = serde_json::to_vec(&data)
.expect("Failed to serialze data passed to send_json into JSON");
self.do_call(Payload::Bytes(&json_bytes))
} }
/// Send data as bytes. /// Send data as bytes.

View File

@@ -38,10 +38,10 @@ fn content_length_on_json() {
let mut json = SerdeMap::new(); let mut json = SerdeMap::new();
json.insert( json.insert(
"Hello".to_string(), "Hello".to_string(),
SerdeValue::String("World!!!".to_string()), serde_json::Value::String("World!!!".to_string()),
); );
let resp = post("test://host/content_length_on_json") let resp = post("test://host/content_length_on_json")
.send_json(SerdeValue::Object(json)) .send_json(serde_json::Value::Object(json))
.unwrap(); .unwrap();
let vec = resp.as_write_vec(); let vec = resp.as_write_vec();
let s = String::from_utf8_lossy(&vec); let s = String::from_utf8_lossy(&vec);
@@ -90,10 +90,10 @@ fn content_type_on_json() {
let mut json = SerdeMap::new(); let mut json = SerdeMap::new();
json.insert( json.insert(
"Hello".to_string(), "Hello".to_string(),
SerdeValue::String("World!!!".to_string()), serde_json::Value::String("World!!!".to_string()),
); );
let resp = post("test://host/content_type_on_json") let resp = post("test://host/content_type_on_json")
.send_json(SerdeValue::Object(json)) .send_json(serde_json::Value::Object(json))
.unwrap(); .unwrap();
let vec = resp.as_write_vec(); let vec = resp.as_write_vec();
let s = String::from_utf8_lossy(&vec); let s = String::from_utf8_lossy(&vec);
@@ -109,11 +109,11 @@ fn content_type_not_overriden_on_json() {
let mut json = SerdeMap::new(); let mut json = SerdeMap::new();
json.insert( json.insert(
"Hello".to_string(), "Hello".to_string(),
SerdeValue::String("World!!!".to_string()), serde_json::Value::String("World!!!".to_string()),
); );
let resp = post("test://host/content_type_not_overriden_on_json") let resp = post("test://host/content_type_not_overriden_on_json")
.set("content-type", "text/plain") .set("content-type", "text/plain")
.send_json(SerdeValue::Object(json)) .send_json(serde_json::Value::Object(json))
.unwrap(); .unwrap();
let vec = resp.as_write_vec(); let vec = resp.as_write_vec();
let s = String::from_utf8_lossy(&vec); let s = String::from_utf8_lossy(&vec);