From dbe16c9001fed3802d724f1aed3c8ad1d39da6ce Mon Sep 17 00:00:00 2001
From: Truman Kilen <t@kilen.me>
Date: Fri, 17 Jan 2025 18:27:22 -0600
Subject: [PATCH] Replace anyhow with thiserror for oodle_loader

---
 Cargo.lock              |  8 +-------
 oodle_loader/Cargo.toml |  2 +-
 oodle_loader/src/lib.rs | 35 +++++++++++++++++++++++++----------
 repak/src/lib.rs        |  2 +-
 4 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index cc3d9d4..c246f27 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -68,12 +68,6 @@ dependencies = [
  "windows-sys 0.59.0",
 ]
 
-[[package]]
-name = "anyhow"
-version = "1.0.95"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
-
 [[package]]
 name = "assert_cmd"
 version = "2.0.16"
@@ -668,10 +662,10 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 name = "oodle_loader"
 version = "0.2.2"
 dependencies = [
- "anyhow",
  "hex",
  "libloading",
  "sha2",
+ "thiserror",
  "ureq",
 ]
 
diff --git a/oodle_loader/Cargo.toml b/oodle_loader/Cargo.toml
index 4dbfff7..c5255eb 100644
--- a/oodle_loader/Cargo.toml
+++ b/oodle_loader/Cargo.toml
@@ -10,5 +10,5 @@ edition.workspace = true
 libloading = "0.8"
 ureq = "2.12"
 hex = { workspace = true }
-anyhow = "1.0.95"
 sha2 = "0.10.8"
+thiserror = "2.0.11"
diff --git a/oodle_loader/src/lib.rs b/oodle_loader/src/lib.rs
index 7066088..753aec8 100644
--- a/oodle_loader/src/lib.rs
+++ b/oodle_loader/src/lib.rs
@@ -1,10 +1,10 @@
-use anyhow::{bail, Result};
-
 use std::{
     io::{Read, Write},
     sync::OnceLock,
 };
 
+type Result<T, E = Error> = std::result::Result<T, E>;
+
 pub use oodle_lz::{CompressionLevel, Compressor};
 
 mod oodle_lz {
@@ -125,6 +125,22 @@ fn url() -> String {
     )
 }
 
+#[derive(thiserror::Error, Debug)]
+pub enum Error {
+    #[error("hash mismatch expected: {expected} got {found}")]
+    HashMismatch { expected: String, found: String },
+    #[error("Oodle compression failed")]
+    CompressionFailed,
+    #[error("Oodle initialization failed previously")]
+    InitializationFailed,
+    #[error("IO error {0:?}")]
+    Io(#[from] std::io::Error),
+    #[error("ureq error {0:?}")]
+    Ureq(#[from] ureq::Error),
+    #[error("libloading error {0:?}")]
+    LibLoading(#[from] libloading::Error),
+}
+
 fn check_hash(buffer: &[u8]) -> Result<()> {
     use sha2::{Digest, Sha256};
 
@@ -132,11 +148,10 @@ fn check_hash(buffer: &[u8]) -> Result<()> {
     hasher.update(buffer);
     let hash = hex::encode(hasher.finalize());
     if hash != OODLE_PLATFORM.hash {
-        anyhow::bail!(
-            "Oodle library hash mismatch: expected {} got {}",
-            OODLE_PLATFORM.hash,
-            hash
-        );
+        return Err(Error::HashMismatch {
+            expected: OODLE_PLATFORM.hash.into(),
+            found: hash,
+        });
     }
 
     Ok(())
@@ -189,7 +204,7 @@ impl Oodle {
             );
 
             if len == -1 {
-                bail!("Oodle compression failed");
+                return Err(Error::CompressionFailed);
             }
             let len = len as usize;
 
@@ -244,7 +259,7 @@ fn load_oodle() -> Result<Oodle> {
     }
 }
 
-pub fn oodle() -> Result<&'static Oodle, Box<dyn std::error::Error>> {
+pub fn oodle() -> Result<&'static Oodle> {
     let mut result = None;
     let oodle = OODLE.get_or_init(|| match load_oodle() {
         Err(err) => {
@@ -259,7 +274,7 @@ pub fn oodle() -> Result<&'static Oodle, Box<dyn std::error::Error>> {
         // error during initialization
         (Some(result), _) => result?,
         // no error because initialization was tried and failed before
-        _ => Err(anyhow::anyhow!("oodle failed to initialized previously").into()),
+        _ => Err(Error::InitializationFailed),
     }
 }
 
diff --git a/repak/src/lib.rs b/repak/src/lib.rs
index 458ea12..fd98618 100644
--- a/repak/src/lib.rs
+++ b/repak/src/lib.rs
@@ -11,7 +11,7 @@ pub const MAGIC: u32 = 0x5A6F12E1;
 
 #[cfg(feature = "oodle")]
 mod oodle {
-    pub type OodleGetter = fn() -> Result<&'static oodle_loader::Oodle, Box<dyn std::error::Error>>;
+    pub type OodleGetter = fn() -> Result<&'static oodle_loader::Oodle, oodle_loader::Error>;
     pub type OodleDecompress = fn(comp_buf: &[u8], raw_buf: &mut [u8]) -> i32;
 }