use crate::ser::part::{PartSerializer, Sink}; use crate::ser::Error; use form_urlencoded::Serializer as UrlEncodedSerializer; use form_urlencoded::Target as UrlEncodedTarget; use serde::ser::Serialize; use std::str; pub struct ValueSink<'input, 'key, 'target, Target> where Target: UrlEncodedTarget, { urlencoder: &'target mut UrlEncodedSerializer<'input, Target>, key: &'key str, } impl<'input, 'key, 'target, Target> ValueSink<'input, 'key, 'target, Target> where Target: 'target + UrlEncodedTarget, { pub fn new( urlencoder: &'target mut UrlEncodedSerializer<'input, Target>, key: &'key str, ) -> Self { ValueSink { urlencoder, key } } } impl<'input, 'key, 'target, Target> Sink for ValueSink<'input, 'key, 'target, Target> where Target: 'target + UrlEncodedTarget, { type Ok = (); fn serialize_str(self, value: &str) -> Result<(), Error> { self.urlencoder.append_pair(self.key, value); Ok(()) } fn serialize_static_str(self, value: &'static str) -> Result<(), Error> { self.serialize_str(value) } fn serialize_string(self, value: String) -> Result<(), Error> { self.serialize_str(&value) } fn serialize_none(self) -> Result { Ok(()) } fn serialize_some( self, value: &T, ) -> Result { value.serialize(PartSerializer::new(self)) } fn unsupported(self) -> Error { Error::Custom("unsupported value".into()) } }