1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2024-12-02 11:03:18 +02:00

No need for thiserror as well as anyhow.

This commit is contained in:
Andrew Walbran 2023-01-16 17:41:17 +00:00
parent 9fa0e89e90
commit e5c97e12cb

View File

@ -7,14 +7,7 @@ custom error types:
```rust,editable,compile_fail
use std::{fs, io};
use std::io::Read;
use thiserror::Error;
use anyhow::{Context, Result};
#[derive(Error, Debug)]
enum ReadUsernameError {
#[error("Found no username in {0}")]
EmptyUsername(String),
}
use anyhow::{Context, Result, bail};
fn read_username(path: &str) -> Result<String> {
let mut username = String::with_capacity(100);
@ -23,7 +16,7 @@ fn read_username(path: &str) -> Result<String> {
.read_to_string(&mut username)
.context("Failed to read")?;
if username.is_empty() {
return Err(ReadUsernameError::EmptyUsername(String::from(path)).into());
bail!("Found no username in {path}");
}
Ok(username)
}
@ -39,7 +32,8 @@ fn main() {
<details>
* `anyhow::Result<T>` is generic and it can hold any `Error` implementation without changing the type signature.
* `anyhow::Result<V>` is a type alias for `Result<V, anyhow::Error>`.
* `anyhow::Error` is generic and it can hold any `Error` implementation without changing the type signature.
* Actual error type inside of it can be extracted for examination if necessary.
* Functionality provided by `anyhow::Result<T>` may be familiar to Go developers, as it provides similar usage patterns and ergonomics
of `(T, error)` from Go.