diff options
Diffstat (limited to 'serde_v8/ser.rs')
-rw-r--r-- | serde_v8/ser.rs | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/serde_v8/ser.rs b/serde_v8/ser.rs index 22235ddd9..3bd71a02d 100644 --- a/serde_v8/ser.rs +++ b/serde_v8/ser.rs @@ -419,19 +419,20 @@ impl<'a, 'b, 'c> ser::Serializer for Serializer<'a, 'b, 'c> { Ok(v8::Boolean::new(&mut self.scope.borrow_mut(), v).into()) } - fn serialize_char(self, _v: char) -> JsResult<'a> { - unimplemented!(); + fn serialize_char(self, v: char) -> JsResult<'a> { + self.serialize_str(&v.to_string()) } fn serialize_str(self, v: &str) -> JsResult<'a> { - v8::String::new(&mut self.scope.borrow_mut(), v) - .map(|v| v.into()) - .ok_or(Error::ExpectedString) + Ok( + v8::String::new(&mut self.scope.borrow_mut(), v) + .unwrap() + .into(), + ) } - fn serialize_bytes(self, _v: &[u8]) -> JsResult<'a> { - // TODO: investigate using Uint8Arrays - unimplemented!() + fn serialize_bytes(self, v: &[u8]) -> JsResult<'a> { + Ok(slice_to_uint8array(&mut self.scope.borrow_mut(), v).into()) } fn serialize_none(self) -> JsResult<'a> { @@ -570,3 +571,26 @@ impl<'a, 'b, 'c> ser::Serializer for Serializer<'a, 'b, 'c> { Ok(VariantSerializer::new(scope, variant, x)) } } + +pub fn slice_to_uint8array<'a>( + scope: &mut v8::HandleScope<'a>, + buf: &[u8], +) -> v8::Local<'a, v8::Uint8Array> { + let buffer = if buf.is_empty() { + v8::ArrayBuffer::new(scope, 0) + } else { + let store: v8::UniqueRef<_> = + v8::ArrayBuffer::new_backing_store(scope, buf.len()); + // SAFETY: raw memory copy into the v8 ArrayBuffer allocated above + unsafe { + std::ptr::copy_nonoverlapping( + buf.as_ptr(), + store.data().unwrap().as_ptr() as *mut u8, + buf.len(), + ) + } + v8::ArrayBuffer::with_backing_store(scope, &store.make_shared()) + }; + v8::Uint8Array::new(scope, buffer, 0, buf.len()) + .expect("Failed to create UintArray8") +} |