Skip to content

example from documentation does not compile #439

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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