diff --git a/libs/proxy/json/src/lib.rs b/libs/proxy/json/src/lib.rs index a8b2e6b509..2d9750b5c0 100644 --- a/libs/proxy/json/src/lib.rs +++ b/libs/proxy/json/src/lib.rs @@ -81,7 +81,7 @@ mod macros; mod str; mod value; -pub use value::{Null, ValueEncoder}; +pub use value::{KeyEncoder, Null, ValueEncoder}; #[must_use] /// Serialize a single json value. @@ -164,7 +164,9 @@ impl<'buf> ObjectSer<'buf> { /// Start a new object entry with the given string key, returning a [`ValueSer`] for the associated value. #[inline] pub fn key(&mut self, key: impl KeyEncoder) -> ValueSer<'_> { - key.write_key(self) + // we create a psuedo value to write the key into. + let start = self.start; + self.entry_inner(|buf| key.encode(ValueSer { buf, start })) } /// Write an entry (key-value pair) to the object. @@ -211,10 +213,6 @@ impl<'buf> ObjectSer<'buf> { } } -pub trait KeyEncoder { - fn write_key<'a>(self, obj: &'a mut ObjectSer) -> ValueSer<'a>; -} - #[must_use] /// Serialize a json object. pub struct ListSer<'buf> { diff --git a/libs/proxy/json/src/value.rs b/libs/proxy/json/src/value.rs index d8dc6068fc..7f28cbc686 100644 --- a/libs/proxy/json/src/value.rs +++ b/libs/proxy/json/src/value.rs @@ -2,10 +2,13 @@ use core::fmt; use std::collections::{BTreeMap, HashMap}; use crate::str::{format_escaped_fmt, format_escaped_str}; -use crate::{KeyEncoder, ObjectSer, ValueSer, value_as_list, value_as_object}; +use crate::{ValueSer, value_as_list, value_as_object}; + +/// Marker trait for values that are valid keys +pub trait KeyEncoder: ValueEncoder {} /// Write a value to the underlying json representation. -pub trait ValueEncoder { +pub trait ValueEncoder: Sized { fn encode(self, v: ValueSer<'_>); } @@ -24,6 +27,7 @@ impl ValueEncoder for &T { } } +impl KeyEncoder for &str {} impl ValueEncoder for &str { #[inline] fn encode(self, v: ValueSer<'_>) { @@ -32,6 +36,7 @@ impl ValueEncoder for &str { } } +impl KeyEncoder for String {} impl ValueEncoder for String { #[inline] fn encode(self, v: ValueSer<'_>) { @@ -39,6 +44,7 @@ impl ValueEncoder for String { } } +impl KeyEncoder for fmt::Arguments<'_> {} impl ValueEncoder for fmt::Arguments<'_> { #[inline] fn encode(self, v: ValueSer<'_>) { @@ -101,32 +107,6 @@ impl ValueEncoder for Option { } } -impl KeyEncoder for &str { - #[inline] - fn write_key<'a>(self, obj: &'a mut ObjectSer) -> ValueSer<'a> { - let obj = &mut *obj; - obj.entry_inner(|b| format_escaped_str(b, self)) - } -} - -impl KeyEncoder for String { - #[inline] - fn write_key<'a>(self, obj: &'a mut ObjectSer) -> ValueSer<'a> { - self.as_str().write_key(obj) - } -} - -impl KeyEncoder for fmt::Arguments<'_> { - #[inline] - fn write_key<'a>(self, obj: &'a mut ObjectSer) -> ValueSer<'a> { - if let Some(key) = self.as_str() { - obj.entry_inner(|b| format_escaped_str(b, key)) - } else { - obj.entry_inner(|b| format_escaped_fmt(b, self)) - } - } -} - /// Represents the JSON null value. pub struct Null;