-
-
Notifications
You must be signed in to change notification settings - Fork 198
Open
Description
// Private and free to change across minor version of the crate.
#[derive(thiserror::Error, Debug)] // PublicError is public, but opaque and easy to keep compatible.
#[error(transparent)]
pub struct PublicError(#[from] ErrorRepr);
impl PublicError {
// Accessors for anything we do want to expose publicly.
}
// Private and free to change across minor version of the crate.
#[derive(thiserror::Error, Debug)]
enum ErrorRepr {
#[error("foo")]
Foo(#[from] Foo),
}
#[derive(thiserror::Error, Debug)]
#[error("foo_text")]
struct Foo;
fn throw_foo() -> Result<(), Foo> {
return Err(Foo);
}
fn main() -> Result<(), PublicError> {
throw_foo()?;
println!("Hello, world!");
}error[E0277]: `?` couldn't convert the error to `PublicError`
--> src/main.rs:26:16
|
25 | fn main() -> Result<(), PublicError> {
| ----------------------- expected `PublicError` because of this
26 | throw_foo()?;
| -----------^ the trait `From<Foo>` is not implemented for `PublicError`
| |
| this can't be annotated with `?` because it has type `Result<_, Foo>`
|
note: `PublicError` needs to implement `From<Foo>`
--> src/main.rs:4:1
|
4 | pub struct PublicError(#[from] ErrorRepr);
| ^^^^^^^^^^^^^^^^^^^^^^
note: alternatively, `Foo` needs to implement `Into<PublicError>`
--> src/main.rs:19:1
|
19 | struct Foo;
| ^^^^^^^^^^
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
= help: the trait `From<Foo>` is not implemented for `PublicError`
but trait `From<ErrorRepr>` is implemented for it
= help: for that trait implementation, expected `ErrorRepr`, found `Foo`
error[E0308]: mismatched types
--> src/main.rs:25:14
|
25 | fn main() -> Result<(), PublicError> {
| ---- ^^^^^^^^^^^^^^^^^^^^^^^ expected `Result<(), PublicError>`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
|
= note: expected enum `Result<(), PublicError>`
found unit type `()`
Some errors have detailed explanations: E0277, E0308.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `tetete` (bin "tetete") due to 2 previous errors
Metadata
Metadata
Assignees
Labels
No labels