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