tor_persist/
fs_mistrust_error_ext.rs

1//! [`FsMistrustErrorExt`]
2
3use paste::paste;
4
5use tor_error::ErrorKind;
6
7use ErrorKind as EK;
8
9/// Helper; `access_failed` should be `FooAccessFaile` for the appropriate `Foo`
10fn mistrust_error_kind(e: &fs_mistrust::Error, access_failed: ErrorKind) -> ErrorKind {
11    if e.is_bad_permission() {
12        EK::FsPermissions
13    } else {
14        access_failed
15    }
16}
17
18/// Generate the extension trait and its impl
19///
20/// Input is the set of "kinds of thing", each of which corresponds to an `ErrorKind`.
21///
22/// # Input syntax
23///
24/// ```text
25///     thing, "DESCRIPTION";           // Provide thing_error_kind(), using ThingAccessFailed
26///     [Prefix] THING, "DESCRIPTION";  // uses PrefixThingAccessFAiled
27/// ```
28macro_rules! accesses { {
29    $( $([ $prefix:ident ])? $kind:ident, $description:tt; )*
30} => { paste!{
31
32    /// Extension trait for getting a [`tor_error::ErrorKind`] from a [`fs_mistrust::Error`]
33    pub trait FsMistrustErrorExt: Sealed {
34        $(
35
36            #[doc = concat!("The error kind if we were trying to access", $description)]
37            fn [<$kind _error_kind>](&self) -> ErrorKind;
38        )*
39    }
40
41    impl FsMistrustErrorExt for fs_mistrust::Error {
42        $(
43            fn [<$kind _error_kind>](&self) -> tor_error::ErrorKind {
44                mistrust_error_kind(self, EK::[<$($prefix)? $kind:camel AccessFailed>])
45            }
46        )*
47    }
48
49} } }
50
51/// Sealed
52pub trait Sealed {}
53impl Sealed for fs_mistrust::Error {}
54
55accesses! {
56    cache, "a cache directory";
57    [Persistent] state, "a persistent state directory";
58    keystore, "a keystore";
59}