turn KeyEncoder into a marker trait

This commit is contained in:
Conrad Ludgate
2025-07-18 09:44:55 +01:00
parent e2bd8e4c61
commit 03522b3434
2 changed files with 12 additions and 34 deletions

View File

@@ -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> {

View File

@@ -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<T: Copy + ValueEncoder> 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<T: ValueEncoder> ValueEncoder for Option<T> {
}
}
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;