Ensure Value::Bytes
serialises correctly (#1757)
This commit is contained in:
parent
3b7a3a5a35
commit
65f1957256
4 changed files with 35 additions and 7 deletions
19
lib/src/sql/bytes.rs
Normal file
19
lib/src/sql/bytes.rs
Normal file
|
@ -0,0 +1,19 @@
|
|||
use crate::sql::serde::is_internal_serialization;
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Deserialize, Hash)]
|
||||
pub struct Bytes(pub(super) Vec<u8>);
|
||||
|
||||
impl Serialize for Bytes {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
if is_internal_serialization() {
|
||||
serializer.serialize_bytes(&self.0)
|
||||
} else {
|
||||
serializer.serialize_none()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ pub(crate) mod algorithm;
|
|||
pub(crate) mod array;
|
||||
pub(crate) mod base;
|
||||
pub(crate) mod block;
|
||||
pub(crate) mod bytes;
|
||||
pub(crate) mod comment;
|
||||
pub(crate) mod common;
|
||||
pub(crate) mod cond;
|
||||
|
@ -72,6 +73,7 @@ pub use self::algorithm::Algorithm;
|
|||
pub use self::array::Array;
|
||||
pub use self::base::Base;
|
||||
pub use self::block::Block;
|
||||
pub use self::bytes::Bytes;
|
||||
pub use self::cond::Cond;
|
||||
pub use self::data::Data;
|
||||
pub use self::datetime::Datetime;
|
||||
|
|
|
@ -10,6 +10,7 @@ use crate::sql::serde::serialize_internal;
|
|||
use crate::sql::value::serde::ser;
|
||||
use crate::sql::value::Value;
|
||||
use crate::sql::Block;
|
||||
use crate::sql::Bytes;
|
||||
use crate::sql::Datetime;
|
||||
use crate::sql::Duration;
|
||||
use crate::sql::Future;
|
||||
|
@ -155,12 +156,8 @@ impl ser::Serializer for Serializer {
|
|||
Ok(value.into())
|
||||
}
|
||||
|
||||
fn serialize_bytes(self, values: &[u8]) -> Result<Self::Ok, Error> {
|
||||
let mut vec = Vec::with_capacity(values.len());
|
||||
for value in values {
|
||||
vec.push(Value::from(*value));
|
||||
}
|
||||
Ok(vec.into())
|
||||
fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Error> {
|
||||
Ok(Value::Bytes(Bytes(value.to_owned())))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -690,6 +687,15 @@ mod tests {
|
|||
assert_eq!(expected, to_value(&expected).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bytes() {
|
||||
let bytes = Bytes("foobar".as_bytes().to_owned());
|
||||
let value = to_value(&bytes).unwrap();
|
||||
let expected = Value::Bytes(bytes);
|
||||
assert_eq!(value, expected);
|
||||
assert_eq!(expected, to_value(&expected).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn param() {
|
||||
let param = Param::default();
|
||||
|
|
|
@ -6,6 +6,7 @@ use crate::dbs::Transaction;
|
|||
use crate::err::Error;
|
||||
use crate::sql::array::{array, Array};
|
||||
use crate::sql::block::{block, Block};
|
||||
use crate::sql::bytes::Bytes;
|
||||
use crate::sql::common::commas;
|
||||
use crate::sql::constant::{constant, Constant};
|
||||
use crate::sql::datetime::{datetime, Datetime};
|
||||
|
@ -114,7 +115,7 @@ pub enum Value {
|
|||
Array(Array),
|
||||
Object(Object),
|
||||
Geometry(Geometry),
|
||||
Bytes(Vec<u8>),
|
||||
Bytes(Bytes),
|
||||
// ---
|
||||
Param(Param),
|
||||
Idiom(Idiom),
|
||||
|
|
Loading…
Reference in a new issue