1
//! Configuration elements for the guard manager
2

            
3
use tor_basic_utils::define_accessor_trait;
4

            
5
use crate::bridge::BridgeConfig;
6
use crate::fallback::FallbackList;
7

            
8
define_accessor_trait! {
9
    /// Configuration for a guard manager
10
    ///
11
    /// If the guard manager gains new configurabilities, this trait will gain additional
12
    /// supertraits, as an API break.
13
    ///
14
    /// Prefer to use `TorClientConfig`, which will always implement this trait.
15
    pub trait GuardMgrConfig {
16
        fallbacks: FallbackList,
17
        bridges: [BridgeConfig],
18
        +
19
        /// Should the bridges be used?
20
        ///
21
        /// This is only allowed to return true if `bridges()` is nonempty.
22
        ///
23
        /// Therefore, it also requires `tor-guardmgr` cargo feature `bridge-client`,
24
        /// since without that feature `BridgeConfig` is uninhabited and therefore
25
        /// `bridges` is necessarily empty.
26
        //
27
        // Therefore, it is safe (from a "reject unsupported config" point of view)
28
        // to ctest this only in code which is #[cfg(feature = "bridge-client")].
29
        fn bridges_enabled(&self) -> bool;
30
    }
31
}
32

            
33
/// Helpers for testing configuration
34
#[cfg(any(test, feature = "testing"))]
35
pub(crate) mod testing {
36
    // @@ begin test lint list maintained by maint/add_warning @@
37
    #![allow(clippy::bool_assert_comparison)]
38
    #![allow(clippy::clone_on_copy)]
39
    #![allow(clippy::dbg_macro)]
40
    #![allow(clippy::mixed_attributes_style)]
41
    #![allow(clippy::print_stderr)]
42
    #![allow(clippy::print_stdout)]
43
    #![allow(clippy::single_char_pattern)]
44
    #![allow(clippy::unwrap_used)]
45
    #![allow(clippy::unchecked_duration_subtraction)]
46
    #![allow(clippy::useless_vec)]
47
    #![allow(clippy::needless_pass_by_value)]
48
    //! <!-- @@ end test lint list maintained by maint/add_warning @@ -->
49

            
50
    use super::*;
51
    use derive_more::AsRef;
52

            
53
    /// A dummy test configuration, with transparent fields for testing
54
    #[derive(Default, Debug, AsRef)]
55
    #[allow(clippy::exhaustive_structs)]
56
    #[allow(missing_docs)]
57
    pub struct TestConfig {
58
        #[as_ref]
59
        pub fallbacks: FallbackList,
60
        pub bridges: Vec<BridgeConfig>,
61
    }
62
    impl AsRef<[BridgeConfig]> for TestConfig {
63
        fn as_ref(&self) -> &[BridgeConfig] {
64
            &self.bridges
65
        }
66
    }
67
    impl GuardMgrConfig for TestConfig {
68
        fn bridges_enabled(&self) -> bool {
69
            !self.bridges.is_empty()
70
        }
71
    }
72
}