dtolnay / serde-untagged

Serde Visitor for deserializing untagged enums
Apache License 2.0
60 stars 1 forks source link

Don't convert deserializer erros into custom errors #2

Open epage opened 1 year ago

epage commented 1 year ago

rust-lang/cargo#12581 originally included updating some of the code paths to use this package but ran into error problems.

Originally, the following error was reported

  TOML parse error at line 7, column 41
    |
  7 |             description = { workspace = false }
    |                                         ^^^^^
  `workspace` cannot be false

and now

  TOML parse error at line 7, column 27
    |
  7 |             description = { workspace = false }
    |                           ^^^^^^^^^^^^^^^^^^^^^
  `workspace` cannot be false
  in `workspace`

This is because the deserializer reports

  `workspace` cannot be false
  in `workspace`

and then gets passed through Error::custom, capturing that as-is. The deserializer sees this error, captures the span as of Error::custom, and then bubbles that up the stack. At the top, the rest of the context is added so the following gets prefixed to it

  TOML parse error at line 7, column 27
    |
  7 |             description = { workspace = false }
    |                           ^^^^^^^^^^^^^^^^^^^^^

Another "in ..." isn't added because that is only rendered when the source context isn't there to render the line.

epage commented 1 year ago

One potential solution is to not provide a custom error type that sits inbetween the deserializer and itself but to instead be generic over E. Im assuming that was originally considered and there are drawbacks.