mirror of
https://github.com/actix/actix-web.git
synced 2025-04-27 20:04:43 +00:00
74 lines
1.6 KiB
Rust
74 lines
1.6 KiB
Rust
use super::super::ser::part::Sink;
|
|
use super::super::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())
|
|
}
|
|
}
|