diff --git a/swordfish/src/katana.rs b/swordfish/src/katana.rs index 2b17778..23152dd 100644 --- a/swordfish/src/katana.rs +++ b/swordfish/src/katana.rs @@ -338,7 +338,14 @@ pub async fn analyze_card_libtesseract( let name_thread = task::spawn_blocking(move || { // let mut leptess = // libtesseract::init_tesseract(false).expect("Failed to initialize Tesseract"); - let binding = unsafe { libtesseract::get_tesseract() }; + let binding = unsafe { + match libtesseract::get_tesseract() { + Ok(b) => b, + Err(why) => { + panic!("{}", format!("Failed to get Tesseract: {:?}", why)); + } + } + }; let mut leptess = binding.lock().unwrap(); let name_img = image_with_white_padding(card_clone.crop_imm( CARD_NAME_X_OFFSET, @@ -366,7 +373,14 @@ pub async fn analyze_card_libtesseract( let series_thread = task::spawn_blocking(move || { // let mut leptess = // libtesseract::init_tesseract(false).expect("Failed to initialize Tesseract"); - let binding = unsafe { libtesseract::get_tesseract() }; + let binding = unsafe { + match libtesseract::get_tesseract() { + Ok(b) => b, + Err(why) => { + panic!("{}", format!("Failed to get Tesseract: {:?}", why)); + } + } + }; let mut leptess = binding.lock().unwrap(); let series_img = image_with_white_padding(card_clone.crop_imm( CARD_SERIES_X_OFFSET, @@ -572,8 +586,7 @@ pub async fn analyze_drop_message(message: &Message) -> Result, (i, execute_analyze_drop(card_img, i).await) }); } - let mut handles: Vec)>> = - Vec::new(); + let mut handles: Vec)>> = Vec::new(); for job in jobs { let handle = task::spawn(job); handles.push(handle); diff --git a/swordfish/src/tesseract/libtesseract.rs b/swordfish/src/tesseract/libtesseract.rs index 53ff912..ae2eece 100644 --- a/swordfish/src/tesseract/libtesseract.rs +++ b/swordfish/src/tesseract/libtesseract.rs @@ -1,21 +1,29 @@ pub use leptess::{LepTess, Variable}; use std::{ + panic::catch_unwind, sync::{Arc, Mutex}, thread, }; +use swordfish_common::error; use tokio::task; static mut TESSERACT_VEC: Vec>> = Vec::new(); static mut TESSERACT_NUMERIC_VEC: Vec>> = Vec::new(); -pub unsafe fn get_tesseract() -> Arc> { +pub unsafe fn get_tesseract() -> Result>, String> { let lep_tess: Arc>; if TESSERACT_VEC.len() == 0 { - lep_tess = Arc::new(Mutex::new(create_tesseract(false).unwrap())); + let ocr = match create_tesseract(false) { + Ok(ocr) => ocr, + Err(why) => { + return Err(format!("Failed to create Tesseract: {:?}", why)); + } + }; + lep_tess = Arc::new(Mutex::new(ocr)); } else { lep_tess = TESSERACT_VEC.pop().unwrap(); } - lep_tess + Ok(lep_tess) } pub unsafe fn get_tesseract_numeric() -> Arc> { @@ -72,12 +80,38 @@ pub async fn init() { task::spawn_blocking(|| loop { unsafe { if TESSERACT_VEC.len() < 9 { - let ocr = create_tesseract(false).unwrap(); - TESSERACT_VEC.push(Arc::new(Mutex::new(ocr))); + match catch_unwind(|| { + let ocr = match create_tesseract(false) { + Ok(ocr) => ocr, + Err(why) => { + error!("Failed to create Tesseract: {:?}", why); + return; + } + }; + TESSERACT_VEC.push(Arc::new(Mutex::new(ocr))); + }) { + Ok(_) => (), + Err(why) => { + error!("Failed to create Tesseract: {:?}", why); + } + } } if TESSERACT_NUMERIC_VEC.len() < 9 { - let ocr = create_tesseract(true).unwrap(); - TESSERACT_NUMERIC_VEC.push(Arc::new(Mutex::new(ocr))); + match catch_unwind(|| { + let ocr = match create_tesseract(true) { + Ok(ocr) => ocr, + Err(why) => { + error!("Failed to create Tesseract: {:?}", why); + return; + } + }; + TESSERACT_NUMERIC_VEC.push(Arc::new(Mutex::new(ocr))); + }) { + Ok(_) => (), + Err(why) => { + error!("Failed to create Tesseract (numeric): {:?}", why); + } + } } } thread::sleep(tokio::time::Duration::from_millis(500));