1//! An error type for [`ArtiEphemeralKeystore`](crate::ArtiEphemeralKeystore).
23use std::sync::Arc;
45use tor_error::{ErrorKind, HasKind};
67use crate::KeystoreError;
89/// An error returned by [`ArtiEphemeralKeystore`](crate::ArtiEphemeralKeystore)'s
10/// [`Keystore`](crate::Keystore) implementation.
11#[derive(thiserror::Error, Debug, Clone)]
12pub(crate) enum ArtiEphemeralKeystoreError {
13/// An error that occurred building an ArtiPath from a KeySpecifier
14#[error("unable to build ArtiPath from KeySpecifier")]
15ArtiPathUnavailableError(#[from] crate::key_specifier::ArtiPathUnavailableError),
16/// An error that occurred serializing a key to OpenSSH text format
17#[error("{0}")]
18SshKeySerialize(#[from] ssh_key::Error),
1920/// An unsupported operation.
21#[error("Operation not supported: {action}")]
22NotSupported {
23/// The action we were trying to perform.
24action: &'static str,
25 },
26}
2728impl KeystoreError for ArtiEphemeralKeystoreError {}
2930impl HasKind for ArtiEphemeralKeystoreError {
31fn kind(&self) -> ErrorKind {
32match self {
33// TODO: These could probably use more specific ErrorKinds. They
34 // are explicitly matched instead of using a default match to
35 // encourage future additions to use the appropriate ErrorKind
36 // rather than letting the default match handle it.
37Self::ArtiPathUnavailableError(_) => ErrorKind::Other,
38Self::SshKeySerialize(_) => ErrorKind::Other,
39Self::NotSupported { .. } => ErrorKind::BadApiUsage,
40 }
41 }
42}
4344impl From<ArtiEphemeralKeystoreError> for crate::Error {
45fn from(e: ArtiEphemeralKeystoreError) -> Self {
46crate::Error::Keystore(Arc::new(e))
47 }
48}