drg 0.11.0

A command line tool to interact with a drogue-cloud instance.
use anyhow::anyhow;
use drogue_client::error::ClientError;
use thiserror::Error;

#[derive(Error, Debug)]
pub enum DrogueError {
    #[error("Invalid input: {0}")]
    InvalidInput(String),
    #[error("The application or device was not found")]
    NotFound,
    #[error("Error from drogue cloud: {0}")]
    Service(String, u16),
    #[error("Unexpected error from the client library: {0}")]
    UnexpectedClient(#[from] anyhow::Error),
    #[error("There is an issue in drg configuration: {0}")]
    ConfigIssue(String),
}

impl From<ClientError> for DrogueError {
    fn from(error: ClientError) -> Self {
        match error {
            ClientError::Client(e) => DrogueError::UnexpectedClient(anyhow!(e)),
            ClientError::Request(msg) => DrogueError::UnexpectedClient(anyhow!("{}", msg)),
            ClientError::Service { error, code } => {
                DrogueError::Service(error.message, code.as_u16())
            }
            ClientError::Response(code) => {
                DrogueError::Service(format!("Unexpected error HTTP {}", code), code.as_u16())
            }
            ClientError::Token(e) => DrogueError::UnexpectedClient(anyhow!(e)),
            ClientError::Url(e) => DrogueError::ConfigIssue(format!("Invalid url: {}", e)),
            ClientError::Syntax(e) => {
                DrogueError::UnexpectedClient(anyhow!("JSON parsing error: {}", e))
            }
            ClientError::UnexpectedResponse(e) => {
                DrogueError::UnexpectedClient(anyhow!("Unexpected response: {}", e))
            }
        }
    }
}

impl From<serde_json::Error> for DrogueError {
    fn from(e: serde_json::Error) -> Self {
        DrogueError::InvalidInput(format!("JSON Deserialization error: {}", e))
    }
}

impl From<serde_yaml::Error> for DrogueError {
    fn from(e: serde_yaml::Error) -> Self {
        DrogueError::InvalidInput(format!("YAML Deserialization error: {}", e))
    }
}

impl From<std::io::Error> for DrogueError {
    fn from(e: std::io::Error) -> Self {
        DrogueError::InvalidInput(format!("Filesystem error: {}", e))
    }
}