diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2021-10-20 15:40:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-20 15:40:20 +0200 |
commit | 783b4da48a457818aac174e0b9b0d6b8f1579778 (patch) | |
tree | 152e4d188f4c7ad253f0bfd4ed23b4f4284cb176 /serde_v8/src/magic/string_or_buffer.rs | |
parent | 6a9656098671d19b2cbfedfef4db0df6f84735d1 (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.rs | 38 |
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, + } + } +} |