thiserror

ΠšΡ€Π΅ΠΉΡ‚ thiserror ΠΌΡ–ΡΡ‚ΠΈΡ‚ΡŒ макроси, які Π΄ΠΎΠΏΠΎΠΌΠ°Π³Π°ΡŽΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ½ΡƒΡ‚ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡŽΠ²Π°Π½ΡŒ ΠΏΡ€ΠΈ Π²ΠΈΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ– Ρ‚ΠΈΠΏΡ–Π² ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ. Π’Ρ–Π½ ΠΌΡ–ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡ…Ρ–Π΄Π½Ρ– макроси, які Π΄ΠΎΠΏΠΎΠΌΠ°Π³Π°ΡŽΡ‚ΡŒ Ρ€Π΅Π°Π»Ρ–Π·ΡƒΠ²Π°Ρ‚ΠΈ From<T>, Display Ρ‚Π° Ρ‚Ρ€Π΅ΠΉΡ‚Error.

use std::io::Read;
use std::{fs, io};
use thiserror::Error;

#[derive(Debug, Error)]
enum ReadUsernameError {
    #[error("I/O ΠΏΠΎΠΌΠΈΠ»ΠΊΠ°: {e}")]
    IoError(#[from] io::Error),
    #[error("НС Π·Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Ρ–ΠΌΠ΅Π½Ρ– користувача Π² {0}")]
    EmptyUsername(String),
}

fn read_username(path: &str) -> Result<String, ReadUsernameError> {
    let mut username = String::with_capacity(100);
    fs::File::open(path)?.read_to_string(&mut username)?;
    if username.is_empty() {
        return Err(ReadUsernameError::EmptyUsername(String::from(path)));
    }
    Ok(username)
}

fn main() {
    //fs::write("config.dat", "").unwrap();
    match read_username("config.dat") {
        Ok(username) => println!("Π†ΠΌ'я користувача: {username}"),
        Err(err) => println!("Помилка: {err:?}"),
    }
}
This slide should take about 5 minutes.
  • ΠŸΠΎΡ…Ρ–Π΄Π½ΠΈΠΉ макрос Error Π½Π°Π΄Π°Ρ”Ρ‚ΡŒΡΡ thiserror Ρ– ΠΌΠ°Ρ” Π±Π°Π³Π°Ρ‚ΠΎ корисних Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ–Π² для ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ³ΠΎ визначСння Ρ‚ΠΈΠΏΡ–Π² ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ.
  • ΠŸΠΎΠ²Ρ–Π΄ΠΎΠΌΠ»Π΅Π½Π½Ρ Π· #[error] Π²ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡ”Ρ‚ΡŒΡΡ для отримання Ρ‚Ρ€Π΅ΠΉΡ‚Ρƒ Display.
  • Π—Π°ΡƒΠ²Π°ΠΆΡ‚Π΅, Ρ‰ΠΎ ΠΏΠΎΡ…Ρ–Π΄Π½ΠΈΠΉ макрос (thiserror::)Error, Ρ…ΠΎΡ‡Π° Ρ– ΠΌΠ°Ρ” Π΅Ρ„Π΅ΠΊΡ‚ Ρ€Π΅Π°Π»Ρ–Π·Π°Ρ†Ρ–Ρ— Ρ‚Ρ€Π΅ΠΉΡ‚Ρƒ (std::error::)Error, Π½Π΅ Ρ” Ρ‚ΠΈΠΌ самим; Ρ‚Ρ€Π΅ΠΉΡ‚ΠΈ Ρ‚Π° макроси Π½Π΅ ΠΌΠ°ΡŽΡ‚ΡŒ ΡΠΏΡ–Π»ΡŒΠ½ΠΎΠ³ΠΎ простору Ρ–ΠΌΠ΅Π½.