Skip to content

example from documentation does not compile #439

@Nuxssss

Description

@Nuxssss
// 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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions