identity/aziot-identityd/src/error.rs (141 lines of code) (raw):

// Copyright (c) Microsoft. All rights reserved. #[derive(Debug)] pub enum Error { Authentication, Authorization, DeviceNotFound, DpsClient(std::io::Error), DpsNotSupportedInNestedMode, HubClient(std::io::Error), KeyClient(std::io::Error), ModuleNotFound, Internal(InternalError), InvalidParameter(&'static str, Box<dyn std::error::Error + Send + Sync>), } impl Error { pub(crate) fn invalid_parameter<E>(name: &'static str, err: E) -> Self where E: Into<Box<dyn std::error::Error + Send + Sync>>, { Error::InvalidParameter(name, err.into()) } pub(crate) fn is_network(&self) -> bool { match &self { Error::DpsClient(err) | Error::HubClient(err) => matches!( err.kind(), std::io::ErrorKind::TimedOut | std::io::ErrorKind::NotConnected ), _ => false, } } } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Error::Authentication => f.write_str("authentication error"), Error::Authorization => f.write_str("authorization error"), Error::DeviceNotFound => f.write_str("device identity not found"), Error::DpsClient(_) => f.write_str("DPS client error"), Error::DpsNotSupportedInNestedMode => { f.write_str("DPS provisioning is not supported in nested mode") } Error::HubClient(_) => f.write_str("Hub client error"), Error::KeyClient(_) => f.write_str("Key client error"), Error::ModuleNotFound => f.write_str("module identity not found"), Error::Internal(_) => f.write_str("internal error"), Error::InvalidParameter(name, _) => { write!(f, "parameter {name:?} has an invalid value") } } } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match self { Error::Authentication | Error::Authorization | Error::DeviceNotFound | Error::DpsNotSupportedInNestedMode | Error::ModuleNotFound => None, Error::DpsClient(err) | Error::HubClient(err) | Error::KeyClient(err) => Some(err), Error::Internal(err) => Some(err), Error::InvalidParameter(_, err) => Some(&**err), } } } #[allow(clippy::module_name_repetitions)] #[derive(Debug)] pub enum InternalError { BadSettings(std::io::Error), CreateCertificate(Box<dyn std::error::Error + Send + Sync>), CreateHomeDir(std::io::Error), GetModulePath(Box<dyn std::error::Error + Send + Sync>), InvalidProxyUri(Box<dyn std::error::Error + Send + Sync>), InvalidUri(http::uri::InvalidUri), LoadKeyOpensslEngine(openssl2::Error), LoadDeviceInfo(std::io::Error), LoadSettings(std::io::Error), MasterIdentityKey(std::io::Error), ParseDeviceInfo(toml::de::Error), ParseSettings(toml::de::Error), SaveDeviceInfo(std::io::Error), SaveModuleBackup(std::io::Error), SerializeDeviceInfo(toml::ser::Error), SaveSettings(std::io::Error), } impl std::fmt::Display for InternalError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { InternalError::BadSettings(m) => write!(f, "bad settings: {m}"), InternalError::CreateCertificate(_) => f.write_str("could not create certificate"), InternalError::CreateHomeDir(_) => f.write_str("could not create home directory"), InternalError::GetModulePath(_) => f.write_str("could not get module backup file path"), InternalError::InvalidProxyUri(_) => f.write_str("invalid proxy uri"), InternalError::InvalidUri(_) => f.write_str("invalid resource uri"), InternalError::LoadKeyOpensslEngine(_) => { f.write_str("could not load aziot-key-openssl-engine") } InternalError::LoadDeviceInfo(_) => { f.write_str("could not load device information state") } InternalError::LoadSettings(_) => f.write_str("could not load settings"), InternalError::MasterIdentityKey(_) => f.write_str("master identity key error"), InternalError::ParseDeviceInfo(_) => { f.write_str("could not parse device information state") } InternalError::ParseSettings(_) => f.write_str("could not parse settings"), InternalError::SaveDeviceInfo(_) => { f.write_str("could not save device information state") } InternalError::SaveModuleBackup(m) => { write!(f, "could not save module information backup state: {m}") } InternalError::SerializeDeviceInfo(_) => { f.write_str("could not serialize device information state") } InternalError::SaveSettings(_) => f.write_str("could not save settings"), } } } impl std::error::Error for InternalError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { #[allow(clippy::match_same_arms)] match self { InternalError::BadSettings(err) => Some(err), InternalError::CreateCertificate(err) => Some(&**err), InternalError::CreateHomeDir(err) => Some(err), InternalError::GetModulePath(err) => Some(&**err), InternalError::InvalidProxyUri(err) => Some(&**err), InternalError::InvalidUri(err) => Some(err), InternalError::LoadKeyOpensslEngine(err) => Some(err), InternalError::LoadDeviceInfo(err) => Some(err), InternalError::LoadSettings(err) => Some(err), InternalError::MasterIdentityKey(err) => Some(err), InternalError::ParseDeviceInfo(err) => Some(err), InternalError::ParseSettings(err) => Some(err), InternalError::SaveDeviceInfo(err) => Some(err), InternalError::SaveModuleBackup(err) => Some(err), InternalError::SaveSettings(err) => Some(err), InternalError::SerializeDeviceInfo(err) => Some(err), } } }