# Summary of MR https://gitlab.com/tezos/tezos/-/merge_requests/2291 - Make traces abstract - prevents empty traces from every being created - paves the way to more structured traces (to `error trace ≠ error list`) - paves the way to never-matching on traces (see long-term goals in conclusion) - Introduce recovery primitives - only matches on top error (in current implementation, may match on all top errors of parallel traces in the future) - `salvage`: partial recovery via a partial function over errors (function returns option) - `recover`: total recovery via a partial function over errors (same as salvage) and a fallback/wildcard function over traces - `_s`, `_e`, and `_es` variants for lwt and error-monad integration - Adapt the parts of the code that matched on traces to use the primitives # Typical use Code that used to look like ```ocaml match foo x y with | Ok v -> Ok v | Error (E1 :: _) -> Ok w | Error (E2 :: _) -> Ok vv | Error trace -> Error trace ``` is now written ```ocaml foo x y |> salvage (function | E1 -> Some w | E2 -> Some vv | _ -> None) ``` and code that looked like ```ocaml match foo x y with | Ok v -> Ok v | Error (E1 :: _) -> Ok w | Error (E2 :: _) -> Ok vv | Error trace -> emit trace; Ok u ``` is now written ```ocaml foo x y |> recover (function | E1 -> Some w | E2 -> Some vv | _ -> None) (fun trace -> emit trace; Ok u) ``` More advanced uses are also possible but the correspondence is less trivial. E.g., when the full trace is also used within an error-specific recovery. # Ideas & Discussions - introduce `salvage` and `recover` already deprecated - to indicate that they are meant to disappear eventually - to encourage people not to use them - order of arguments? labels? # Aims - long term: no matching on tzresult at all - tzresult is fully abstract, not even the `Ok`/`Error` destruction is possible - functions return concrete values for anything that is recoverable - most functions use `trace`/`record_trace` in order to make the eventual dumping of trace more informative - medium term: use the `recover` / `salvage` approach - find a way to heavily discourage their use - via naming (`unsafe_recover`, `do_not_use_recover`)? - via deprecation? (disable warning locally when we use it for now) - add the "proper way" i.e. fully abstract tzresult and new code uses it - organise a "remove your error matching" sprint/hackaton/whatever - short term: improve design of `recover`/`salvage` - naming, parameter order, etc. - more primitives? fewer primitives?