summaryrefslogtreecommitdiff
path: root/serde_v8/src/magic/string_or_buffer.rs
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2021-10-20 15:40:20 +0200
committerGitHub <noreply@github.com>2021-10-20 15:40:20 +0200
commit783b4da48a457818aac174e0b9b0d6b8f1579778 (patch)
tree152e4d188f4c7ad253f0bfd4ed23b4f4284cb176 /serde_v8/src/magic/string_or_buffer.rs
parent6a9656098671d19b2cbfedfef4db0df6f84735d1 (diff)
feat(serde_v8): StringOrBuffer (#12503)
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,
+ }
+ }
+}