1use serde::Serialize;
15use std::{
16 borrow::{Borrow, Cow},
17 fmt,
18};
19
20#[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd, Serialize)]
22pub struct Key(Cow<'static, str>);
23
24impl Key {
25 pub fn new(s: &'static str) -> Self {
26 Self(Cow::Borrowed(s))
27 }
28
29 pub fn new_owned(s: String) -> Self {
30 Self(Cow::Owned(s))
31 }
32
33 pub fn as_str(&self) -> &'_ Self {
34 self.borrow()
35 }
36}
37
38#[derive(Clone, Copy)]
40pub enum Value<'v> {
41 Debug(&'v (dyn fmt::Debug)),
42 Display(&'v (dyn fmt::Display)),
43 Serde(&'v (dyn erased_serde::Serialize)),
44}
45
46impl<'v> fmt::Debug for Value<'v> {
47 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48 match &self {
49 Value::Debug(d) => fmt::Debug::fmt(d, f),
50 Value::Display(d) => fmt::Display::fmt(d, f),
51 Value::Serde(s) => {
52 fmt::Debug::fmt(&serde_json::to_value(s).map_err(|_| fmt::Error)?, f)
53 }
54 }
55 }
56}
57
58impl<'v> Value<'v> {
59 pub fn from_serde<T: serde::Serialize>(value: &'v T) -> Self {
61 Value::Serde(value)
62 }
63
64 pub fn from_debug<T: fmt::Debug>(value: &'v T) -> Self {
66 Value::Debug(value)
67 }
68
69 pub fn from_display<T: fmt::Display>(value: &'v T) -> Self {
71 Value::Display(value)
72 }
73}
74
75#[derive(Clone, Debug)]
77pub struct KeyValue<'v> {
78 key: Key,
79 value: Value<'v>,
80}
81
82impl<'v> KeyValue<'v> {
83 pub fn new(key: &'static str, value: Value<'v>) -> Self {
84 Self {
85 key: Key::new(key),
86 value,
87 }
88 }
89}
90
91impl<'v> Schema for KeyValue<'v> {
92 fn visit(&self, visitor: &mut dyn Visitor) {
93 visitor.visit_pair(self.key.clone(), self.value)
94 }
95}
96
97pub trait Schema {
103 fn visit(&self, visitor: &mut dyn Visitor);
105}
106
107pub trait Visitor {
109 fn visit_pair(&mut self, key: Key, value: Value<'_>);
111}
112
113impl<'a, 'b: 'a> Visitor for fmt::DebugMap<'a, 'b> {
114 fn visit_pair(&mut self, key: Key, value: Value<'_>) {
115 self.entry(&key, &value);
116 }
117}