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