serde_html_form/ser/
key.rs

1use std::{borrow::Cow, ops::Deref};
2
3use serde::ser::{self, Serialize};
4
5use super::{part::Sink, Error};
6
7pub enum Key<'key> {
8    Static(&'static str),
9    Dynamic(Cow<'key, str>),
10}
11
12impl Deref for Key<'_> {
13    type Target = str;
14
15    fn deref(&self) -> &str {
16        match *self {
17            Key::Static(key) => key,
18            Key::Dynamic(ref key) => key,
19        }
20    }
21}
22
23impl<'key> From<Key<'key>> for Cow<'static, str> {
24    fn from(key: Key<'key>) -> Self {
25        match key {
26            Key::Static(key) => key.into(),
27            Key::Dynamic(key) => key.into_owned().into(),
28        }
29    }
30}
31
32pub struct KeySink<End> {
33    end: End,
34}
35
36impl<End, Ok> KeySink<End>
37where
38    End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>,
39{
40    pub fn new(end: End) -> Self {
41        KeySink { end }
42    }
43}
44
45impl<End, Ok> Sink for KeySink<End>
46where
47    End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>,
48{
49    type Ok = Ok;
50    type SerializeSeq = ser::Impossible<Self::Ok, Error>;
51
52    fn serialize_static_str(self, value: &'static str) -> Result<Ok, Error> {
53        (self.end)(Key::Static(value))
54    }
55
56    fn serialize_str(self, value: &str) -> Result<Ok, Error> {
57        (self.end)(Key::Dynamic(value.into()))
58    }
59
60    fn serialize_string(self, value: String) -> Result<Ok, Error> {
61        (self.end)(Key::Dynamic(value.into()))
62    }
63
64    fn serialize_none(self) -> Result<Ok, Error> {
65        Err(self.unsupported())
66    }
67
68    fn serialize_some<T: ?Sized + Serialize>(self, _value: &T) -> Result<Ok, Error> {
69        Err(self.unsupported())
70    }
71
72    fn serialize_seq(self) -> Result<Self::SerializeSeq, Error> {
73        Err(self.unsupported())
74    }
75
76    fn unsupported(self) -> Error {
77        Error::unsupported_key()
78    }
79}