Commit 3420fe73 authored by Ian Jackson's avatar Ian Jackson
Browse files

Define and use impl_default_via_builder

parent b137be22
Loading
Loading
Loading
Loading
+5 −27
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ use std::collections::HashMap;
use std::path::Path;
use std::path::PathBuf;
use std::time::Duration;
pub use tor_config::impl_default_via_builder;
pub use tor_config::{CfgPath, CfgPathError, ConfigBuildError, Reconfigure};

/// Types for configuring how Tor circuits are built.
@@ -88,15 +89,7 @@ pub struct StreamTimeoutConfig {
    pub(crate) resolve_ptr_timeout: Duration,
}

// NOTE: it seems that `unwrap` may be safe because of builder defaults
// check `derive_builder` documentation for details
// https://docs.rs/derive_builder/0.10.2/derive_builder/#default-values
#[allow(clippy::unwrap_used)]
impl Default for ClientAddrConfig {
    fn default() -> Self {
        ClientAddrConfigBuilder::default().build().unwrap()
    }
}
impl_default_via_builder! { ClientAddrConfig }

impl ClientAddrConfig {
    /// Return a new [`ClientAddrConfigBuilder`].
@@ -105,12 +98,7 @@ impl ClientAddrConfig {
    }
}

#[allow(clippy::unwrap_used)]
impl Default for StreamTimeoutConfig {
    fn default() -> Self {
        StreamTimeoutConfigBuilder::default().build().unwrap()
    }
}
impl_default_via_builder! { StreamTimeoutConfig }

impl StreamTimeoutConfig {
    /// Return a new [`StreamTimeoutConfigBuilder`].
@@ -171,11 +159,7 @@ fn default_state_dir() -> CfgPath {
    CfgPath::new("${ARTI_LOCAL_DATA}".to_owned())
}

impl Default for StorageConfig {
    fn default() -> Self {
        Self::builder().build().expect("Default builder failed")
    }
}
impl_default_via_builder! { StorageConfig }

impl StorageConfig {
    /// Return a new StorageConfigBuilder.
@@ -308,13 +292,7 @@ impl AsRef<tor_guardmgr::fallback::FallbackList> for TorClientConfig {
    }
}

impl Default for TorClientConfig {
    fn default() -> Self {
        Self::builder()
            .build()
            .expect("Could not build TorClientConfig from default configuration.")
    }
}
impl_default_via_builder! { TorClientConfig }

impl TorClientConfig {
    /// Return a new TorClientConfigBuilder.
+25 −0
Original line number Diff line number Diff line
@@ -90,6 +90,31 @@ impl Reconfigure {
    }
}

/// Defines `Default` for a struct with a `Builder`.  Use this, not `derive`.
///
/// Use this.  Do not `#[derive(Builder, Default)]`.  That latter approach would produce
/// wrong answers if builder attributes are used to specify non-`Default` default values.
///
/// `$Config`'s builder must have default values for all the fields,
/// or this macro-generated self-test will fail.
/// This should be OK for all elements of our configuration.
#[macro_export]
macro_rules! impl_default_via_builder { {
    $Config:ty
} => {
    $crate::paste!{
        impl Default for $Config {
            fn default() -> Self {
                // unwrap is good because the test case above checks that it works!
                [< $Config Builder >]::default().build().unwrap()
            }
        }

        #[test]
        fn [< test_impl_Default_for_ $Config >] () { let _ = $Config::default(); }
    }
} }

#[cfg(test)]
mod test {
    use super::*;