Skip to content

Commit 952adf9

Browse files
committed
serde: serialize dyn Error Values using collect_str
Currently, `valuable-serde` handles `Value::Error` variants incorrectly. When `valuable-serde` encounters a `Value::Error`, it returns the error immediately as a serialization error: https://github.com/tokio-rs/valuable/blob/1fc2ad50fcae7fc0da81dc40a385c235636ba525/valuable-serde/src/lib.rs#L267 This is _not_ correct. If a `serde` serializer returns an error, this means something has gone wrong while serializing a value. Returning an error makes the serialization fail. However, this is *not* what `valuable`'s `Value::Error` means. `Value::Error` represents that we are _recording a value which happens to be an `Error`_, not that something went wrong _while_ recording the value. This means that `valuable-serde` will currently return an `Error` (indicating that serialization failed) any time it attempts to record an `Error` value, and serialization will fail. This commit changes `valuable-serde` to record the error using its `Display` implementation, using `serde`'s `collect_str` method. Now, `Error`s will be serialized by recording their messages as a string, rather than causing the serialization to fail. Using `collect_str` allows the serializer to write the display representation to its own internal buffer, rather than having to format the error to a temporary `String` beforehand. Fixes #88
1 parent 1fc2ad5 commit 952adf9

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

valuable-serde/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ where
264264
#[cfg(feature = "std")]
265265
Value::Path(p) => Serialize::serialize(p, serializer),
266266
#[cfg(feature = "std")]
267-
Value::Error(e) => Err(S::Error::custom(e)),
267+
Value::Error(e) => serializer.collect_str(e),
268268

269269
v => unimplemented!("{:?}", v),
270270
}

0 commit comments

Comments
 (0)