1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
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<Key<'key>> 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: End, } impl<End, Ok> KeySink<End> where End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>, { pub fn new(end: End) -> Self { KeySink { end } } } impl<End, Ok> Sink for KeySink<End> where End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>, { type Ok = Ok; fn serialize_static_str(self, value: &'static str) -> Result<Ok, Error> { (self.end)(Key::Static(value)) } fn serialize_str(self, value: &str) -> Result<Ok, Error> { (self.end)(Key::Dynamic(value.into())) } fn serialize_string(self, value: String) -> Result<Ok, Error> { (self.end)(Key::Dynamic(value.into())) } fn serialize_none(self) -> Result<Ok, Error> { Err(self.unsupported()) } fn serialize_some<T: ?Sized + Serialize>( self, _value: &T, ) -> Result<Ok, Error> { Err(self.unsupported()) } fn unsupported(self) -> Error { Error::Custom("unsupported key".into()) } }