summaryrefslogtreecommitdiffstats
path: root/third_party/rust/serde_urlencoded/src/ser/key.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/serde_urlencoded/src/ser/key.rs')
-rw-r--r--third_party/rust/serde_urlencoded/src/ser/key.rs77
1 files changed, 77 insertions, 0 deletions
diff --git a/third_party/rust/serde_urlencoded/src/ser/key.rs b/third_party/rust/serde_urlencoded/src/ser/key.rs
new file mode 100644
index 0000000000..8128a64ebb
--- /dev/null
+++ b/third_party/rust/serde_urlencoded/src/ser/key.rs
@@ -0,0 +1,77 @@
+use crate::ser::part::Sink;
+use crate::ser::Error;
+use serde::Serialize;
+use std::borrow::Cow;
+use std::ops::Deref;
+
+pub enum Key<'key> {
+ Static(&'static str),
+ Dynamic(Cow<'key, str>),
+}
+
+impl<'key> Deref for Key<'key> {
+ type Target = str;
+
+ fn deref(&self) -> &str {
+ match *self {
+ Key::Static(key) => key,
+ Key::Dynamic(ref key) => key,
+ }
+ }
+}
+
+impl<'key> From<Key<'key>> for Cow<'static, str> {
+ fn from(key: Key<'key>) -> Self {
+ match key {
+ Key::Static(key) => key.into(),
+ Key::Dynamic(key) => key.into_owned().into(),
+ }
+ }
+}
+
+pub struct KeySink<End> {
+ end: End,
+}
+
+impl<End, Ok> KeySink<End>
+where
+ End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>,
+{
+ pub fn new(end: End) -> Self {
+ KeySink { end }
+ }
+}
+
+impl<End, Ok> Sink for KeySink<End>
+where
+ End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>,
+{
+ type Ok = Ok;
+
+ fn serialize_static_str(self, value: &'static str) -> Result<Ok, Error> {
+ (self.end)(Key::Static(value))
+ }
+
+ fn serialize_str(self, value: &str) -> Result<Ok, Error> {
+ (self.end)(Key::Dynamic(value.into()))
+ }
+
+ fn serialize_string(self, value: String) -> Result<Ok, Error> {
+ (self.end)(Key::Dynamic(value.into()))
+ }
+
+ fn serialize_none(self) -> Result<Ok, Error> {
+ Err(self.unsupported())
+ }
+
+ fn serialize_some<T: ?Sized + Serialize>(
+ self,
+ _value: &T,
+ ) -> Result<Ok, Error> {
+ Err(self.unsupported())
+ }
+
+ fn unsupported(self) -> Error {
+ Error::Custom("unsupported key".into())
+ }
+}