use std::{fmt, net, time::Duration}; use crate::tags::{ParseTagError, ParseTagsError}; #[derive(Debug)] pub enum Error { UnexpectedNoneValue { entity: String, }, SdkError(Box), InvalidResponseError { message: String, }, MultipleMatches { entity: String, }, InvalidTag(ParseTagError), InvalidTags(ParseTagsError), RunInstancesEmptyResponse, InstanceStopExceededMaxWait { max_wait: Duration, instance: super::InstanceId, }, WaitError(Box), RunInstanceNoCapacity, InvalidTimestampError { value: String, message: String, }, } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Self::InvalidTag(ref inner) => { write!(f, "{inner}") } Self::InvalidTags(ref inner) => { write!(f, "{inner}") } Self::UnexpectedNoneValue { ref entity } => { write!(f, "entity \"{entity}\" was empty") } Self::SdkError(ref e) => write!(f, "sdk error: {e}"), Self::InvalidResponseError { ref message } => { write!(f, "invalid api response: {message}") } Self::MultipleMatches { ref entity } => { write!(f, "multiple matches for {entity} found") } Self::RunInstancesEmptyResponse => { write!(f, "empty instance response of RunInstances") } Self::InstanceStopExceededMaxWait { ref max_wait, ref instance, } => { write!( f, "instance {instance} did not wait in {} seconds", max_wait.as_secs() ) } Self::WaitError(ref e) => write!(f, "waiter error: {e}"), Self::RunInstanceNoCapacity => { write!(f, "no capacity for rnu instance operation") } Self::InvalidTimestampError { ref value, ref message, } => { write!(f, "failed parsing \"{value}\" as timestamp: {message}") } } } } impl std::error::Error for Error {} impl From> for Error { fn from(value: aws_sdk_ec2::error::SdkError) -> Self { Self::SdkError(Box::new(value)) } } impl From for Error { fn from(value: aws_sdk_ec2::waiters::instance_stopped::WaitUntilInstanceStoppedError) -> Self { Self::WaitError(Box::new(value)) } } impl From for Error { fn from(value: net::AddrParseError) -> Self { Self::InvalidResponseError { message: value.to_string(), } } } impl From for Error { fn from(value: ParseTagError) -> Self { Self::InvalidTag(value) } } impl From for Error { fn from(value: ParseTagsError) -> Self { Self::InvalidTags(value) } }