From 99fc91ad1db6e9cc985711a132dfb66990ba20ba Mon Sep 17 00:00:00 2001 From: Eric Rodrigues Pires Date: Sun, 26 Oct 2025 23:11:08 -0300 Subject: [PATCH] Add jsonSafe option to parsing --- duper-js-wasm/package-lock.json | 4 +-- duper-js-wasm/package.json | 2 +- duper-js-wasm/src/de.rs | 44 ++++++++++++++++++++++++++------- duper-js-wasm/src/lib.rs | 9 +++++-- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/duper-js-wasm/package-lock.json b/duper-js-wasm/package-lock.json index e56210a..6275a85 100644 --- a/duper-js-wasm/package-lock.json +++ b/duper-js-wasm/package-lock.json @@ -1,12 +1,12 @@ { "name": "@duper-js/wasm", - "version": "0.1.0", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@duper-js/wasm", - "version": "0.1.0", + "version": "0.1.2", "license": "MIT" } } diff --git a/duper-js-wasm/package.json b/duper-js-wasm/package.json index 968c882..32dd44f 100644 --- a/duper-js-wasm/package.json +++ b/duper-js-wasm/package.json @@ -1,6 +1,6 @@ { "name": "@duper-js/wasm", - "version": "0.1.1", + "version": "0.1.2", "description": "The format that's super!", "keywords": [ "duper", diff --git a/duper-js-wasm/src/de.rs b/duper-js-wasm/src/de.rs index ada1662..236e36e 100644 --- a/duper-js-wasm/src/de.rs +++ b/duper-js-wasm/src/de.rs @@ -5,7 +5,9 @@ use wasm_bindgen::prelude::*; use crate::{SYMBOL_DUPER_IDENTIFIER, SYMBOL_DUPER_TYPE, SYMBOL_DUPER_VALUE}; #[derive(Clone)] -pub(crate) struct Visitor; +pub(crate) struct Visitor { + pub(crate) json_safe: bool, +} impl DuperVisitor for Visitor { type Value = Result; @@ -108,7 +110,11 @@ impl DuperVisitor for Visitor { string: &duper::DuperString<'a>, ) -> Self::Value { let value = JsValue::from_str(string.as_ref()); - attach_identifier(value, identifier, "string") + if self.json_safe { + Ok(value) + } else { + attach_identifier(value, identifier, "string") + } } fn visit_bytes<'a>( @@ -116,9 +122,13 @@ impl DuperVisitor for Visitor { identifier: Option<&duper::DuperIdentifier<'a>>, bytes: &duper::DuperBytes<'a>, ) -> Self::Value { - let uint8_array = js_sys::Uint8Array::from(bytes.as_ref()); - let value: JsValue = uint8_array.into(); - attach_identifier(value, identifier, "bytes") + if self.json_safe { + Ok(bytes.as_ref().to_vec().into()) + } else { + let uint8_array = js_sys::Uint8Array::from(bytes.as_ref()); + let value: JsValue = uint8_array.into(); + attach_identifier(value, identifier, "bytes") + } } fn visit_integer<'a>( @@ -128,7 +138,11 @@ impl DuperVisitor for Visitor { ) -> Self::Value { // TO-DO: Handle big integers let value = JsValue::from_f64(integer as f64); - attach_identifier(value, identifier, "integer") + if self.json_safe { + Ok(value) + } else { + attach_identifier(value, identifier, "integer") + } } fn visit_float<'a>( @@ -137,7 +151,11 @@ impl DuperVisitor for Visitor { float: f64, ) -> Self::Value { let value = JsValue::from_f64(float); - attach_identifier(value, identifier, "float") + if self.json_safe { + Ok(value) + } else { + attach_identifier(value, identifier, "float") + } } fn visit_boolean<'a>( @@ -146,12 +164,20 @@ impl DuperVisitor for Visitor { boolean: bool, ) -> Self::Value { let value = JsValue::from_bool(boolean); - attach_identifier(value, identifier, "boolean") + if self.json_safe { + Ok(value) + } else { + attach_identifier(value, identifier, "boolean") + } } fn visit_null<'a>(&mut self, identifier: Option<&duper::DuperIdentifier<'a>>) -> Self::Value { let value = JsValue::NULL; - attach_identifier(value, identifier, "null") + if self.json_safe { + Ok(value) + } else { + attach_identifier(value, identifier, "null") + } } } diff --git a/duper-js-wasm/src/lib.rs b/duper-js-wasm/src/lib.rs index f0bce31..c544460 100644 --- a/duper-js-wasm/src/lib.rs +++ b/duper-js-wasm/src/lib.rs @@ -70,8 +70,13 @@ pub fn stringify(value: &JsValue, options: Option) -> Result< } #[wasm_bindgen] -pub fn parse(value: &str) -> Result { +pub fn parse( + value: &str, + #[wasm_bindgen(js_name = "jsonSafe")] json_safe: Option, +) -> Result { let value = DuperParser::parse_duper_value(value) .map_err(|err| JsError::new(&format!("{:?}", miette::Error::new(err.into_miette()))))?; - value.accept(&mut Visitor) + value.accept(&mut Visitor { + json_safe: json_safe.is_some_and(|json_safe| json_safe), + }) } -- 2.51.2