tor_guardmgr/
bridge_disabled.rs

1//! Bridges (stub module, bridges disabled in cargo features)
2
3use serde::{Deserialize, Deserializer, Serialize};
4use std::str::FromStr;
5use tor_config::ConfigBuildError;
6
7#[path = "bridge/config/err.rs"]
8mod err;
9pub use err::BridgeParseError;
10
11/// Configuration for a bridge - uninhabited placeholder type
12///
13/// This type appears in configuration APIs as a stand-in,
14/// when the `bridge-client` cargo feature is not enabled.
15///
16/// The type is uninhabited: without this feature, you cannot create a `BridgeConfig`.
17#[derive(Debug, Clone, Eq, PartialEq, Hash)]
18#[non_exhaustive]
19pub enum BridgeConfig {}
20
21/// Configuration builder for a bridge - dummy type
22///
23/// This type appears in configuration APIs as a stand-in,
24/// when the `bridge-client` cargo feature is not enabled.
25///
26/// It can be deserialized, but you cannot actually build a `BridgeConfig` from it.
27//
28// Making this type inhabited significantly improves the error messages
29// when bridges are requested when support isn't enabled.
30#[derive(Debug, Clone, Eq, PartialEq, Hash)]
31#[non_exhaustive]
32#[derive(Serialize)]
33pub struct BridgeConfigBuilder {}
34
35impl<'de> Deserialize<'de> for BridgeConfigBuilder {
36    fn deserialize<D>(_: D) -> Result<Self, D::Error>
37    where
38        D: Deserializer<'de>,
39    {
40        Ok(BridgeConfigBuilder {})
41    }
42}
43
44impl BridgeConfigBuilder {
45    /// Build (dummy function, cannot ever be called)
46    pub fn build(&self) -> Result<BridgeConfig, ConfigBuildError> {
47        Err(ConfigBuildError::Invalid {
48            field: "(bridge)".into(),
49            problem: BridgeParseError::BridgesNotSupported.to_string(),
50        })
51    }
52}
53
54impl FromStr for BridgeConfigBuilder {
55    type Err = BridgeParseError;
56
57    fn from_str(_: &str) -> Result<BridgeConfigBuilder, BridgeParseError> {
58        Err(BridgeParseError::BridgesNotSupported)
59    }
60}