1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//! The [`ResultExt`] extension trait and its blanket implementation on
//! [`Result<T, E>`].
//!
//! This module is intentionally thin. Its only responsibility is to define
//! the public-facing trait and wire it to [`Error::new`] / [`Error::new_owned`]
//! from [`crate::error`]. All type logic lives in `error.rs`.
use String;
use crateError;
// ── Trait Definition ──────────────────────────────────────────────────────────
/// Extension trait that adds type-preserving error annotation to any
/// [`Result<T, E>`].
///
/// Import this trait to bring `.annotate(...)` and `.annotate_with(...)` into
/// scope on every `Result` in your codebase:
///
/// ```rust
/// use erra::ResultExt;
/// ```
///
/// That single `use` statement is the entire adoption cost.
///
/// # Blanket Implementation
///
/// `ResultExt` is implemented for **all** `Result<T, E>` with no bounds at
/// the trait level. You do not need `E: std::error::Error` to annotate —
/// that bound is only required if you later pass the annotated error to a
/// reporter that requires `std::error::Error`. This means `erra` works on
/// any error type, including plain integers, strings, and custom structs that
/// do not implement `std::error::Error`.
///
/// # No `From<E>` Interaction
///
/// `erra` deliberately does not implement `From<E> for Error<E>`. If it did,
/// the `?` operator would silently wrap errors with no context string —
/// exactly the failure mode this crate exists to prevent. Annotation is
/// always an explicit, authored act.