diff options
Diffstat (limited to 'serde_v8/src')
-rw-r--r-- | serde_v8/src/de.rs | 10 | ||||
-rw-r--r-- | serde_v8/src/lib.rs | 1 | ||||
-rw-r--r-- | serde_v8/src/magic/mod.rs | 1 | ||||
-rw-r--r-- | serde_v8/src/magic/string_or_buffer.rs | 38 | ||||
-rw-r--r-- | serde_v8/src/payload.rs | 4 |
5 files changed, 54 insertions, 0 deletions
diff --git a/serde_v8/src/de.rs b/serde_v8/src/de.rs index 3668a4fd5..d4338a37f 100644 --- a/serde_v8/src/de.rs +++ b/serde_v8/src/de.rs @@ -132,6 +132,16 @@ impl<'de, 'a, 'b, 's, 'x> de::Deserializer<'de> ValueType::String => self.deserialize_string(visitor), ValueType::Array => self.deserialize_seq(visitor), ValueType::Object => self.deserialize_map(visitor), + // Map to Vec<u8> when deserialized via deserialize_any + // e.g: for untagged enums or StringOrBuffer + ValueType::ArrayBufferView => { + v8::Local::<v8::ArrayBufferView>::try_from(self.input) + .and_then(|view| { + magic::zero_copy_buf::ZeroCopyBuf::try_new(self.scope, view) + }) + .map_err(|_| Error::ExpectedInteger) + .and_then(|zb| visitor.visit_byte_buf(Vec::from(&*zb))) + } } } diff --git a/serde_v8/src/lib.rs b/serde_v8/src/lib.rs index 374a27ce2..d97b1f1af 100644 --- a/serde_v8/src/lib.rs +++ b/serde_v8/src/lib.rs @@ -13,6 +13,7 @@ pub use error::{Error, Result}; pub use keys::KeyCache; pub use magic::buffer::MagicBuffer as Buffer; pub use magic::bytestring::ByteString; +pub use magic::string_or_buffer::StringOrBuffer; pub use magic::Value; pub use ser::{to_v8, Serializer}; pub use serializable::{Serializable, SerializablePkg}; diff --git a/serde_v8/src/magic/mod.rs b/serde_v8/src/magic/mod.rs index 00c06fd4c..91a09e2f4 100644 --- a/serde_v8/src/magic/mod.rs +++ b/serde_v8/src/magic/mod.rs @@ -2,6 +2,7 @@ pub mod buffer; pub mod bytestring; mod field; +pub mod string_or_buffer; mod value; pub mod zero_copy_buf; diff --git a/serde_v8/src/magic/string_or_buffer.rs b/serde_v8/src/magic/string_or_buffer.rs new file mode 100644 index 000000000..88a6344c4 --- /dev/null +++ b/serde_v8/src/magic/string_or_buffer.rs @@ -0,0 +1,38 @@ +use std::ops::Deref; + +#[derive(Debug)] +pub struct StringOrBuffer(Vec<u8>); + +impl Deref for StringOrBuffer { + type Target = Vec<u8>; + fn deref(&self) -> &Vec<u8> { + &self.0 + } +} + +impl<'de> serde::Deserialize<'de> for StringOrBuffer { + fn deserialize<D>(deserializer: D) -> Result<StringOrBuffer, D::Error> + where + D: serde::Deserializer<'de>, + { + StringOrBufferInner::deserialize(deserializer) + .map(|x| StringOrBuffer(x.into_bytes())) + } +} + +// TODO(@AaronO): explore if we can make this work with ZeroCopyBuf +#[derive(serde::Deserialize)] +#[serde(untagged)] +enum StringOrBufferInner { + String(String), + Buffer(Vec<u8>), +} + +impl StringOrBufferInner { + fn into_bytes(self) -> Vec<u8> { + match self { + Self::String(s) => s.into_bytes(), + Self::Buffer(b) => b, + } + } +} diff --git a/serde_v8/src/payload.rs b/serde_v8/src/payload.rs index 816158f93..a9fb045e3 100644 --- a/serde_v8/src/payload.rs +++ b/serde_v8/src/payload.rs @@ -5,12 +5,14 @@ use rusty_v8 as v8; // so it can implement Deserialize by itself // Classifies v8::Values into sub-types +#[derive(Debug)] pub enum ValueType { Null, Bool, Number, String, Array, + ArrayBufferView, Object, } @@ -24,6 +26,8 @@ impl ValueType { return Self::String; } else if v.is_array() { return Self::Array; + } else if v.is_array_buffer_view() { + return Self::ArrayBufferView; } else if v.is_object() { return Self::Object; } else if v.is_null_or_undefined() { |