diff --git a/src/lib.rs b/src/lib.rs index 48705c9..f1d0a3e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,31 @@ -use pyo3::exceptions::PyValueError; +use pyo3::exceptions::{PyFileNotFoundError, PyValueError}; use pyo3::prelude::*; use std::error::Error; +use std::fs::File; +use std::io::ErrorKind; + +#[pyfunction] +fn filter_file(py: Python, path: String) -> PyResult { + let file = match File::open(&path) { + Err(e) if e.kind() == ErrorKind::NotFound => { + return Err(PyFileNotFoundError::new_err(format!( + "{}: {}", + e.to_string(), + &path + ))) + } + Err(e) => return Err(PyValueError::new_err(e.to_string())), + Ok(f) => f, + }; + let f = svg_hush::Filter::new(); + let mut out = Vec::new(); + let result = py.allow_threads(|| f.filter(file, &mut out)); + + match result { + Ok(()) => Ok(String::from_utf8_lossy(&out).to_string()), + Err(e) => Err(PyValueError::new_err(e.source().unwrap().to_string())), + } +} #[pyfunction] fn filter(py: Python, input: String) -> PyResult { @@ -18,5 +43,6 @@ fn filter(py: Python, input: String) -> PyResult { #[pymodule] fn svg_hush(_py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(filter, m)?)?; + m.add_function(wrap_pyfunction!(filter_file, m)?)?; Ok(()) }