serde_html_form/ser/
key.rs1use 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}