use crate::ser::part::Sink; use crate::ser::Error; use serde::Serialize; use std::borrow::Cow; use std::ops::Deref; pub enum Key<'key> { Static(&'static str), Dynamic(Cow<'key, str>), } impl<'key> Deref for Key<'key> { type Target = str; fn deref(&self) -> &str { match *self { Key::Static(key) => key, Key::Dynamic(ref key) => key, } } } impl<'key> From> for Cow<'static, str> { fn from(key: Key<'key>) -> Self { match key { Key::Static(key) => key.into(), Key::Dynamic(key) => key.into_owned().into(), } } } pub struct KeySink { end: End, } impl KeySink where End: for<'key> FnOnce(Key<'key>) -> Result, { pub fn new(end: End) -> Self { KeySink { end } } } impl Sink for KeySink where End: for<'key> FnOnce(Key<'key>) -> Result, { type Ok = Ok; fn serialize_static_str(self, value: &'static str) -> Result { (self.end)(Key::Static(value)) } fn serialize_str(self, value: &str) -> Result { (self.end)(Key::Dynamic(value.into())) } fn serialize_string(self, value: String) -> Result { (self.end)(Key::Dynamic(value.into())) } fn serialize_none(self) -> Result { Err(self.unsupported()) } fn serialize_some( self, _value: &T, ) -> Result { Err(self.unsupported()) } fn unsupported(self) -> Error { Error::Custom("unsupported key".into()) } }