| 1 | use std::{io, str::Utf8Error, string::FromUtf8Error}; |
| 2 | |
| 3 | /// Custom result type for `cargo_metadata::Error` |
| 4 | pub type Result<T> = ::std::result::Result<T, Error>; |
| 5 | |
| 6 | /// Error returned when executing/parsing `cargo metadata` fails. |
| 7 | /// |
| 8 | /// # Note about Backtraces |
| 9 | /// |
| 10 | /// This error type does not contain backtraces, but each error variant |
| 11 | /// comes from _one_ specific place, so it's not really needed for the |
| 12 | /// inside of this crate. If you need a backtrace down to, but not inside |
| 13 | /// of, a failed call of `cargo_metadata` you can do one of multiple thinks: |
| 14 | /// |
| 15 | /// 1. Convert it to a `failure::Error` (possible using the `?` operator), |
| 16 | /// which is similar to a `Box<::std::error::Error + 'static + Send + Sync>`. |
| 17 | /// 2. Have appropriate variants in your own error type. E.g. you could wrap |
| 18 | /// a `failure::Context<Error>` or add a `failure::Backtrace` field (which |
| 19 | /// is empty if `RUST_BACKTRACE` is not set, so it's simple to use). |
| 20 | /// 3. You still can place a failure based error into a `error_chain` if you |
| 21 | /// really want to. (Either through foreign_links or by making it a field |
| 22 | /// value of a `ErrorKind` variant). |
| 23 | /// |
| 24 | #[derive (Debug, thiserror::Error)] |
| 25 | pub enum Error { |
| 26 | /// Error during execution of `cargo metadata` |
| 27 | #[error("`cargo metadata` exited with an error: {stderr}" )] |
| 28 | CargoMetadata { |
| 29 | /// stderr returned by the `cargo metadata` command |
| 30 | stderr: String, |
| 31 | }, |
| 32 | |
| 33 | /// IO Error during execution of `cargo metadata` |
| 34 | #[error("failed to start `cargo metadata`: {0}" )] |
| 35 | Io(#[from] io::Error), |
| 36 | |
| 37 | /// Output of `cargo metadata` was not valid utf8 |
| 38 | #[error("cannot convert the stdout of `cargo metadata`: {0}" )] |
| 39 | Utf8(#[from] Utf8Error), |
| 40 | |
| 41 | /// Error output of `cargo metadata` was not valid utf8 |
| 42 | #[error("cannot convert the stderr of `cargo metadata`: {0}" )] |
| 43 | ErrUtf8(#[from] FromUtf8Error), |
| 44 | |
| 45 | /// Deserialization error (structure of json did not match expected structure) |
| 46 | #[error("failed to interpret `cargo metadata`'s json: {0}" )] |
| 47 | Json(#[from] ::serde_json::Error), |
| 48 | |
| 49 | /// The output did not contain any json |
| 50 | #[error("could not find any json in the output of `cargo metadata`" )] |
| 51 | NoJson, |
| 52 | } |
| 53 | |