serde_html_form/ser/
value.rs

1use std::str;
2
3use form_urlencoded::{Serializer as UrlEncodedSerializer, Target as UrlEncodedTarget};
4use serde::ser::{Serialize, SerializeSeq};
5
6use super::{
7    part::{PartSerializer, Sink},
8    Error,
9};
10
11pub struct ValueSink<'input, 'key, 'target, Target>
12where
13    Target: UrlEncodedTarget,
14{
15    urlencoder: &'target mut UrlEncodedSerializer<'input, Target>,
16    key: &'key str,
17    nested: bool,
18}
19
20impl<'input, 'key, 'target, Target> ValueSink<'input, 'key, 'target, Target>
21where
22    Target: 'target + UrlEncodedTarget,
23{
24    pub fn new(
25        urlencoder: &'target mut UrlEncodedSerializer<'input, Target>,
26        key: &'key str,
27    ) -> Self {
28        ValueSink { urlencoder, key, nested: false }
29    }
30}
31
32impl<'target, Target> Sink for ValueSink<'_, '_, 'target, Target>
33where
34    Target: 'target + UrlEncodedTarget,
35{
36    type Ok = ();
37    type SerializeSeq = Self;
38
39    fn serialize_str(self, value: &str) -> Result<(), Error> {
40        self.urlencoder.append_pair(self.key, value);
41        Ok(())
42    }
43
44    fn serialize_static_str(self, value: &'static str) -> Result<(), Error> {
45        self.serialize_str(value)
46    }
47
48    fn serialize_string(self, value: String) -> Result<(), Error> {
49        self.serialize_str(&value)
50    }
51
52    fn serialize_none(self) -> Result<Self::Ok, Error> {
53        Ok(())
54    }
55
56    fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Error> {
57        value.serialize(PartSerializer::new(self))
58    }
59
60    fn serialize_seq(self) -> Result<Self, Error> {
61        if self.nested {
62            Err(self.unsupported())
63        } else {
64            Ok(self)
65        }
66    }
67
68    fn unsupported(self) -> Error {
69        Error::unsupported_value()
70    }
71}
72
73impl<'target, Target> SerializeSeq for ValueSink<'_, '_, 'target, Target>
74where
75    Target: 'target + UrlEncodedTarget,
76{
77    type Ok = ();
78    type Error = Error;
79
80    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
81    where
82        T: Serialize + ?Sized,
83    {
84        value.serialize(PartSerializer::new(ValueSink {
85            urlencoder: self.urlencoder,
86            key: self.key,
87            nested: true,
88        }))
89    }
90
91    fn end(self) -> Result<Self::Ok, Self::Error> {
92        Ok(())
93    }
94}