@@ -21,14 +21,40 @@ use bindings::*;
21
21
22
22
use flagset:: { flags, FlagSet } ;
23
23
use paste:: paste;
24
- use std:: ffi:: { c_char, c_int, c_uint, c_void, CStr , CString } ;
24
+ use std:: ffi:: { c_char, c_int, c_uint, c_void, CStr , CString , NulError } ;
25
25
use std:: fmt:: { Display , Formatter } ;
26
- use std:: io:: ErrorKind ;
27
26
use std:: marker:: PhantomData ;
28
27
use std:: mem:: transmute;
29
28
use std:: rc:: Rc ;
29
+ use thiserror:: Error ;
30
+
31
+ #[ derive( Error , Debug ) ]
32
+ pub enum Error {
33
+ #[ error( "{0}" ) ]
34
+ InvalidInput ( String ) ,
35
+
36
+ #[ error( "NulError from CString::new" ) ]
37
+ NulError ( #[ from] NulError ) ,
38
+ //
39
+ // #[error("data store disconnected")]
40
+ // IOError(#[from] std::io::Error),
41
+ // #[error("the data for key `{0}` is not available")]
42
+ // Redaction(String),
43
+ // #[error("invalid header (expected {expected:?}, found {found:?})")]
44
+ // InvalidHeader {
45
+ // expected: String,
46
+ // found: String,
47
+ // },
48
+ // #[error("unknown data store error")]
49
+ // Unknown,
50
+ }
30
51
31
- pub type Error = std:: io:: Error ;
52
+ // see https://github.com/dtolnay/thiserror/issues/62
53
+ impl From < std:: convert:: Infallible > for Error {
54
+ fn from ( _: std:: convert:: Infallible ) -> Self {
55
+ unreachable ! ( )
56
+ }
57
+ }
32
58
33
59
fn c2r_str ( str : * mut c_char ) -> String {
34
60
let mut res = String :: new ( ) ;
@@ -51,15 +77,15 @@ fn c2r_vec(buf: *mut u8, len: c_int) -> Vec<u8> {
51
77
fn last_error ( ) -> Error {
52
78
match unsafe { zxing_LastErrorMsg ( ) . as_mut ( ) } {
53
79
None => panic ! ( "Internal error: zxing_LastErrorMsg() returned NULL" ) ,
54
- Some ( error) => Error :: new ( ErrorKind :: InvalidInput , c2r_str ( error) ) ,
80
+ Some ( error) => Error :: InvalidInput ( c2r_str ( error) ) ,
55
81
}
56
82
}
57
83
58
84
macro_rules! last_error_or {
59
85
( $expr: expr) => {
60
86
match unsafe { zxing_LastErrorMsg( ) . as_mut( ) } {
61
87
None => Ok ( $expr) ,
62
- Some ( error) => Err ( Error :: new ( ErrorKind :: InvalidInput , c2r_str( error) ) ) ,
88
+ Some ( error) => Err ( Error :: InvalidInput ( c2r_str( error) ) ) ,
63
89
}
64
90
} ;
65
91
}
@@ -134,8 +160,7 @@ impl<'a> From<&'a ImageView<'a>> for ImageView<'a> {
134
160
135
161
impl < ' a > ImageView < ' a > {
136
162
fn try_into_int < T : TryInto < c_int > > ( val : T ) -> Result < c_int , Error > {
137
- val. try_into ( )
138
- . map_err ( |_| Error :: new ( ErrorKind :: InvalidInput , "Could not convert Integer into c_int." ) )
163
+ val. try_into ( ) . map_err ( |_| Error :: InvalidInput ( "Could not convert Integer into c_int." . to_string ( ) ) )
139
164
}
140
165
141
166
/// Constructs an ImageView from a raw pointer and the width/height (in pixels)
@@ -223,7 +248,7 @@ impl<'a> TryFrom<&'a image::DynamicImage> for ImageView<'a> {
223
248
} ;
224
249
match format {
225
250
Some ( format) => Ok ( ImageView :: from_slice ( img. as_bytes ( ) , img. width ( ) , img. height ( ) , format) ?) ,
226
- None => Err ( Error :: new ( ErrorKind :: InvalidInput , "Invalid image format (must be either luma8|rgb8|rgba8)" ) ) ,
251
+ None => Err ( Error :: InvalidInput ( "Invalid image format (must be either luma8|rgb8|rgba8)" . to_string ( ) ) ) ,
227
252
}
228
253
}
229
254
}
@@ -362,10 +387,13 @@ pub fn barcode_formats_from_string(str: impl AsRef<str>) -> Result<BarcodeFormat
362
387
}
363
388
}
364
389
365
- pub fn read_barcodes < ' a > ( image : impl TryInto < ImageView < ' a > > , opts : impl AsRef < ReaderOptions > ) -> Result < Vec < Barcode > , Error > {
366
- let iv_: ImageView = image
367
- . try_into ( )
368
- . map_err ( |_| Error :: new ( ErrorKind :: InvalidInput , "Failed to image.try_into::<ImageView>()" ) ) ?;
390
+ pub fn read_barcodes < ' a , IV , RO > ( image : IV , opts : RO ) -> Result < Vec < Barcode > , Error >
391
+ where
392
+ IV : TryInto < ImageView < ' a > > ,
393
+ IV :: Error : Into < Error > ,
394
+ RO : AsRef < ReaderOptions > ,
395
+ {
396
+ let iv_: ImageView = image. try_into ( ) . map_err ( Into :: into) ?;
369
397
unsafe {
370
398
let results = zxing_ReadBarcodes ( ( iv_. 0 ) . 0 , opts. as_ref ( ) . 0 ) ;
371
399
if !results. is_null ( ) {
0 commit comments