diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/errors.rs | 43 | ||||
| -rw-r--r-- | src/lib.rs | 32 | ||||
| -rw-r--r-- | src/main.rs | 2 | 
3 files changed, 64 insertions, 13 deletions
| diff --git a/src/errors.rs b/src/errors.rs new file mode 100644 index 0000000..6ec2ee1 --- /dev/null +++ b/src/errors.rs @@ -0,0 +1,43 @@ +use std::fmt; +use std::error; +use std::str; + +use lopdf; + +pub type Result<T> = ::std::result::Result<T, Error>; + +#[derive(Debug)] +pub enum Error { +    Lopdf(lopdf::Error), +    Utf8(str::Utf8Error), +} + +impl fmt::Display for Error { +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { +        match *self { +            Error::Lopdf(ref err) => write!(f, "pdf error: {}", err), +            Error::Utf8(ref err) => write!(f, "utf8 error: {}", err), +        } +    } +} + +impl error::Error for Error { +    fn source(&self) -> Option<&(dyn error::Error + 'static)> { +        match *self { +            Error::Lopdf(ref err) => Some(err), +            Error::Utf8(ref err) => Some(err), +        } +    } +} + +impl From<lopdf::Error> for Error { +    fn from(err: lopdf::Error) -> Error { +        Error::Lopdf(err) +    } +} + +impl From<str::Utf8Error> for Error { +    fn from(err: str::Utf8Error) -> Error { +        Error::Utf8(err) +    } +} @@ -1,3 +1,5 @@ +mod errors; +  extern crate lopdf;  use std::path::Path; @@ -5,37 +7,43 @@ use std::str;  use lopdf::{Document, Object}; -pub fn get_urls_from_pdf<P: AsRef<Path>>(path: P) { -    let doc = Document::load(path).unwrap(); +use errors::Result; + +pub fn get_urls_from_pdf<P: AsRef<Path>>(path: P) -> Result<()> { +    let doc = Document::load(path)?;      for (_, obj) in doc.objects { -        match obj { +        return match obj {              Object::Dictionary(d) => {                  for (k, v) in d.iter() { -                    let key = str::from_utf8(&k).unwrap(); +                    let key = str::from_utf8(&k)?;                      if key == "A" { -                        for (k, v) in v.as_dict().unwrap() { -                            let key = str::from_utf8(&k).unwrap(); +                        let url_objects = v.as_dict()?; + +                        for (k, v) in url_objects { +                            let key = str::from_utf8(&k)?;                              if key == "URI" { -                                match v { +                                return match v {                                      Object::String(s, _) => { -                                        println!("{}", str::from_utf8(s).unwrap()); +                                        println!("{}", str::from_utf8(s)?); -                                        () +                                        Ok(())                                      }, -                                    _ => (), +                                    _ => Ok(()),                                  }                              }                          }                      }                  } -                () +                Ok(())              }, -            _ => (), +            _ => Ok(()),          }      } + +    Ok(())  } diff --git a/src/main.rs b/src/main.rs index 14eab24..d8bb0d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@  use pdf_urls::get_urls_from_pdf;  fn main() { -    get_urls_from_pdf("example.pdf"); +    get_urls_from_pdf("example.pdf").unwrap();  } | 
