summaryrefslogtreecommitdiff
path: root/serde_v8/src
diff options
context:
space:
mode:
Diffstat (limited to 'serde_v8/src')
-rw-r--r--serde_v8/src/de.rs10
-rw-r--r--serde_v8/src/lib.rs1
-rw-r--r--serde_v8/src/magic/mod.rs1
-rw-r--r--serde_v8/src/magic/string_or_buffer.rs38
-rw-r--r--serde_v8/src/payload.rs4
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() {