#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error(transparent)]
Pairing(#[from] crate::primitives::pairing::PairingError),
#[error(transparent)]
Recovery(#[from] crate::primitives::recovery::RecoveryError),
#[error(transparent)]
Discovery(#[from] crate::primitives::discovery::DiscoveryError),
#[error(transparent)]
Sharing(#[from] crate::primitives::sharing::SharingError),
#[error(transparent)]
Verification(#[from] crate::primitives::verification::VerificationError),
#[error(transparent)]
Unpairing(#[from] crate::primitives::unpairing::UnpairingError),
#[error(transparent)]
Restore(#[from] crate::protocol::RestoreError),
#[error(transparent)]
DeRecMessage(#[from] crate::derec_message::DeRecMessageBuilderError),
#[error(transparent)]
SecretStore(#[from] crate::protocol::SecretStoreError),
#[error(transparent)]
ChannelStore(#[from] crate::protocol::ChannelStoreError),
#[error(transparent)]
ShareStore(#[from] crate::protocol::ShareStoreError),
#[error(transparent)]
StateStore(#[from] crate::protocol::StateStoreError),
#[error(transparent)]
Transport(#[from] crate::transport::TransportValidationError),
#[error("invalid input: {0}")]
InvalidInput(&'static str),
#[error("protobuf decode error")]
ProtobufDecode(#[source] prost::DecodeError),
#[error("protobuf encode error")]
ProtobufEncode(#[source] prost::EncodeError),
#[error("internal invariant violated: {0}")]
Invariant(&'static str),
#[error(
"role mismatch on channel {channel_id:?}: expected {expected:?}, got {actual:?}"
)]
RoleMismatch {
channel_id: crate::types::ChannelId,
expected: derec_proto::SenderKind,
actual: derec_proto::SenderKind,
},
#[error("channel {channel_id:?} is already paired")]
ChannelAlreadyPaired { channel_id: crate::types::ChannelId },
#[error("replica id not configured: build the protocol with .with_replica_id(..) to enable replica flows")]
ReplicaIdNotConfigured,
}
impl Error {
pub fn as_non_ok_status(&self) -> Option<(i32, &str)> {
match self {
Error::Pairing(crate::primitives::pairing::PairingError::NonOkStatus {
status,
memo,
}) => Some((*status, memo)),
Error::Sharing(crate::primitives::sharing::SharingError::NonOkStatus {
status,
memo,
}) => Some((*status, memo)),
Error::Verification(
crate::primitives::verification::VerificationError::NonOkStatus { status, memo },
) => Some((*status, memo)),
Error::Discovery(crate::primitives::discovery::DiscoveryError::NonOkStatus {
status,
memo,
}) => Some((*status, memo)),
Error::Recovery(crate::primitives::recovery::RecoveryError::NonOkStatus {
status,
memo,
}) => Some((*status, memo)),
Error::Unpairing(crate::primitives::unpairing::UnpairingError::NonOkStatus {
status,
memo,
}) => Some((*status, memo)),
_ => None,
}
}
}