Skip to content

Commit 6df1658

Browse files
authored
Merge pull request #112 from domMayhew/add-type-error-info
Add type info to 'unsupported' error messages
2 parents e6ae7ca + 80b6a84 commit 6df1658

File tree

4 files changed

+45
-16
lines changed

4 files changed

+45
-16
lines changed

src/ser/key.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,17 @@ where
6161
}
6262

6363
fn serialize_none(self) -> Result<Ok, Error> {
64-
Err(self.unsupported())
64+
Err(self.unsupported("none"))
6565
}
6666

6767
fn serialize_some<T: ?Sized + Serialize>(
6868
self,
6969
_value: &T,
7070
) -> Result<Ok, Error> {
71-
Err(self.unsupported())
71+
Err(self.unsupported("some"))
7272
}
7373

74-
fn unsupported(self) -> Error {
75-
Error::Custom("unsupported key".into())
74+
fn unsupported(self, type_str: &'static str) -> Error {
75+
Error::Custom(format!("unsupported key type: {type_str}").into())
7676
}
7777
}

src/ser/part.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub trait Sink: Sized {
2929
value: &T,
3030
) -> Result<Self::Ok, Error>;
3131

32-
fn unsupported(self) -> Error;
32+
fn unsupported(self, type_str: &'static str) -> Error;
3333
}
3434

3535
impl<S: Sink> ser::Serializer for PartSerializer<S> {
@@ -112,7 +112,7 @@ impl<S: Sink> ser::Serializer for PartSerializer<S> {
112112
}
113113

114114
fn serialize_unit(self) -> Result<S::Ok, Error> {
115-
Err(self.sink.unsupported())
115+
Err(self.sink.unsupported("unit"))
116116
}
117117

118118
fn serialize_unit_struct(self, name: &'static str) -> Result<S::Ok, Error> {
@@ -143,7 +143,7 @@ impl<S: Sink> ser::Serializer for PartSerializer<S> {
143143
_variant: &'static str,
144144
_value: &T,
145145
) -> Result<S::Ok, Error> {
146-
Err(self.sink.unsupported())
146+
Err(self.sink.unsupported("newtype variant"))
147147
}
148148

149149
fn serialize_none(self) -> Result<S::Ok, Error> {
@@ -161,22 +161,22 @@ impl<S: Sink> ser::Serializer for PartSerializer<S> {
161161
self,
162162
_len: Option<usize>,
163163
) -> Result<Self::SerializeSeq, Error> {
164-
Err(self.sink.unsupported())
164+
Err(self.sink.unsupported("sequence"))
165165
}
166166

167167
fn serialize_tuple(
168168
self,
169169
_len: usize,
170170
) -> Result<Self::SerializeTuple, Error> {
171-
Err(self.sink.unsupported())
171+
Err(self.sink.unsupported("tuple"))
172172
}
173173

174174
fn serialize_tuple_struct(
175175
self,
176176
_name: &'static str,
177177
_len: usize,
178178
) -> Result<Self::SerializeTuple, Error> {
179-
Err(self.sink.unsupported())
179+
Err(self.sink.unsupported("tuple struct"))
180180
}
181181

182182
fn serialize_tuple_variant(
@@ -186,22 +186,22 @@ impl<S: Sink> ser::Serializer for PartSerializer<S> {
186186
_variant: &'static str,
187187
_len: usize,
188188
) -> Result<Self::SerializeTupleVariant, Error> {
189-
Err(self.sink.unsupported())
189+
Err(self.sink.unsupported("tuple variant"))
190190
}
191191

192192
fn serialize_map(
193193
self,
194194
_len: Option<usize>,
195195
) -> Result<Self::SerializeMap, Error> {
196-
Err(self.sink.unsupported())
196+
Err(self.sink.unsupported("map"))
197197
}
198198

199199
fn serialize_struct(
200200
self,
201201
_name: &'static str,
202202
_len: usize,
203203
) -> Result<Self::SerializeStruct, Error> {
204-
Err(self.sink.unsupported())
204+
Err(self.sink.unsupported("struct"))
205205
}
206206

207207
fn serialize_struct_variant(
@@ -211,7 +211,7 @@ impl<S: Sink> ser::Serializer for PartSerializer<S> {
211211
_variant: &'static str,
212212
_len: usize,
213213
) -> Result<Self::SerializeStructVariant, Error> {
214-
Err(self.sink.unsupported())
214+
Err(self.sink.unsupported("struct variant"))
215215
}
216216
}
217217

src/ser/value.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ where
5656
value.serialize(PartSerializer::new(self))
5757
}
5858

59-
fn unsupported(self) -> Error {
60-
Error::Custom("unsupported value".into())
59+
fn unsupported(self, type_str: &'static str) -> Error {
60+
Error::Custom(format!("unsupported value type: {type_str}").into())
6161
}
6262
}

tests/test_serialize.rs

+29
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,32 @@ fn serialize_unit_struct() {
102102
fn serialize_unit_type() {
103103
assert_eq!(serde_urlencoded::to_string(()), Ok("".to_owned()));
104104
}
105+
106+
#[derive(Serialize)]
107+
struct ListStruct<T> {
108+
x: Vec<T>,
109+
y: Vec<T>,
110+
}
111+
112+
#[test]
113+
#[should_panic(
114+
expected = r#"called `Result::unwrap()` on an `Err` value: Custom("unsupported value type: sequence")"#
115+
)]
116+
fn value_type_error_msg() {
117+
let list_struct = ListStruct {
118+
x: vec![1, 2, 3],
119+
y: vec![4, 5, 6],
120+
};
121+
let _ = serde_urlencoded::to_string(list_struct).unwrap();
122+
}
123+
124+
#[test]
125+
#[should_panic(
126+
expected = r#"called `Result::unwrap()` on an `Err` value: Custom("unsupported key type: sequence")"#
127+
)]
128+
fn key_type_error_msg() {
129+
use std::collections::HashMap;
130+
131+
let mut map = HashMap::from([(vec![1, 2, 3], "value")]);
132+
let _ = serde_urlencoded::to_string(map).unwrap();
133+
}

0 commit comments

Comments
 (0)