rust-errkit 0.1.1

Idiomatic Rust error handling kit
Documentation
  • Coverage
  • 0%
    0 out of 55 items documented0 out of 20 items with examples
  • Size
  • Source code size: 17.77 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 824.17 kB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 24s Average build duration of successful builds.
  • all releases: 24s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • robby031/rust-errkit
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • robby031

rust-errkit

rust-errkit adalah library error handling idiomatik untuk Rust yang memudahkan pembuatan, mapping, dan penanganan error secara terstruktur dan konsisten.

Fitur Utama

  • Definisi error domain dan reason yang jelas
  • Konversi error eksternal ke error aplikasi
  • Penambahan context pada error
  • Trait untuk konversi Result ke AppResult
  • Mudah diintegrasikan pada aplikasi dan service async

Instalasi

Tambahkan ke Cargo.toml Anda:

[dependencies]
rust-errkit = "0.1.1"

Penggunaan Dasar

Membuat Error

use rust_errkit::{AppError, kind::{ErrorKind, ErrorReason}};

let err: AppError = ErrorKind::network(ErrorReason::Timeout).into();

println!("{}", err);

Menambah Context pada Error

use rust_errkit::{AppError, kind::{ErrorKind, ErrorReason}};

let err = AppError::from(ErrorKind::db(ErrorReason::ConnectionFailed))
    .with_context("sqlx", Some("connection refused".to_string()));

println!("{}", err);

if let Some(ctx) = &err.context {
    println!("SOURCE: {}", ctx.source);
    println!("DETAILS: {:?}", ctx.details);
}

Mapping Error Eksternal

use rust_errkit::{AppError, kind::{ErrorKind, ErrorReason}};

fn map_db_error(e: &str) -> AppError {
    AppError::from(ErrorKind::db(ErrorReason::Unexpected))
        .with_context("sqlx", Some(e.to_string()))
}

Menggunakan AppResult dan ResultExt

use rust_errkit::{AppResult, AppError, kind::{ErrorKind, ErrorReason}};

fn might_fail(success: bool) -> Result<String, &'static str> {
    if success {
        Ok("OK".to_string())
    } else {
        Err("something went wrong")
    }
}

fn main() -> AppResult<()> {
    let value = might_fail(false)
        .map_err(|e| {
            AppError::from(ErrorKind::core(ErrorReason::Unexpected))
                .with_context("might_fail", Some(e.to_string()))
        })?;

    println!("{}", value);
    Ok(())
}

Flow pada Async Service

use rust_errkit::{AppError, AppResult, kind::{ErrorKind, ErrorReason}};

async fn fetch_remote() -> Result<String, &'static str> {
    Err("timeout")
}

async fn service_layer() -> AppResult<String> {
    let data = fetch_remote().await
        .map_err(|_| ErrorKind::network(ErrorReason::Timeout).into())?;
    Ok(data)
}

Struktur Error

  • AppError : Error utama aplikasi
  • ErrorKind : Kombinasi domain dan reason
  • ErrorDomain : Kategori error (Core, Network, Database, IO, Auth, External)
  • ErrorReason : Penyebab error (Timeout, NotFound, Unauthorized, dsb)
  • ErrorContext : Informasi tambahan (source, details)

Kontribusi

Pull request dan issue sangat diterima!

Lisensi

Lihat LICENSE untuk detail lisensi.