summaryrefslogtreecommitdiff
path: root/serde_v8/src/magic/string_or_buffer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'serde_v8/src/magic/string_or_buffer.rs')
-rw-r--r--serde_v8/src/magic/string_or_buffer.rs38
1 files changed, 38 insertions, 0 deletions
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,
+ }
+ }
+}