zefchain / serde-reflection

Rust libraries and tools to help with interoperability and testing of serialization formats based on Serde.
Apache License 2.0
138 stars 26 forks source link

Fix tracing for NonZero* #38

Closed juntyr closed 5 months ago

juntyr commented 6 months ago

Summary

NonZero* is a fundamentally useful datatype in Rust, which serde models as a newtype around the inner numerical type. That makes tracing any datatype that contains any NonZero* difficult, as the tracer by default always passes zero numeric values, which NonZero* rejects. While giving example data can solve this issue, it is impractical for deeply nested NonZero*s.

This PR fixes this by checking if the traced integer-looking-value is one of the NonZero* types. While the test is ... not pretty ..., it should be optimised out during monomorphisation.

Test Plan

I'm happy to add a few tests for cases you suggest :)

ma2bd commented 6 months ago

Thanks @juntyr for raising the issue. I'm inclined to propose a more basic solution (#39) that doesn't introduce any breaking changes.

juntyr commented 5 months ago

@ma2bd Thanks for the quick reply! #39 would also likely solve the issue (and is much more applicable and general so thumbs up for that in any case) though I wonder if there is any data structure that works better with a zero-based field …

This reminds me of the std::mem::uninitialized implementation which just sets each byte to 0x01 to protects against non-zero-like types, so setting a globally-applicable value seems to be an acceptable solution.

Thus, I think that #39 is a better idea, perhaps with an extra doc comment or helped method to explain that all default integer values can be set to 1 to allow non-zero values to be successfully traced.