One pattern is to use your own crate-level Error type and then Result::map_err to bubble up other error types into your own thing. Example:
https://play.rust-lang.org/?version=stable&mode=debug&editio...
This makes error handling a little more verbose but you can use some quick and dirty macros for that.