amethyst / amethyst/serde-diff
Derived "apply" implementation for enums is broken
- 主要語言
- Rust
- 星號
- 127
- 分支
- 21
- PR 合併指標
- 30 天內沒有已合併 PR
描述
When diffing an enum like:
```rust
#[derive(SerdeDiff, Serialize, Deserialize, Debug, PartialEq, Clone)]
enum Value {
Str(String),
Int(i32),
}
```
Let's say we have the diff `Value::Str("A") -> Value::Str("B")`.
The diff implementation will produce the following sequence of commands:
```rust
[{"Enter":{"EnumVariant":"Str"}},{"Enter":{"FieldIndex":0}},{"Value":"B"},"Exit"]
```
However, the apply implementation does not consume the final `Exit` command, causing the rest of the command stream to get out of sync.
This is because of this code:
https://github.com/amethyst/serde-diff/blob/e461da41c9339af3ecadf9f4aa61ae91c1f79e97/serde-diff-derive/src/serde_diff/mod.rs#L362-L379
Specifically it's because `next_path_element` is only called once, instead of being called until it finds an `Exit` command. It makes sense to only call it once because an enum can only have one variant, but since the variant still counts as a path segment, an additional Exit should be consumed.
貢獻指南
這個儲存庫沒有索引到貢獻指南
評估
這個 Issue 還沒有評估資料。