Derive Deserialize for derive-builder-generated config builders
I used git-grep -P '\#\[serde\((?!default|deny_unknown)' to find places where I needed to add additional attributes on the builder method fields. This is currently a bit duplicative, but when #371 is completely done, the validated (non-builder) configs won't need to be Deserialize any more. This is part of #371 and #372.
This commit is contained in:
parent
416b56d852
commit
5203311a97
|
@ -17,6 +17,7 @@ use std::collections::HashMap;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
pub use tor_basic_utils::humantime_serde_option;
|
||||||
pub use tor_config::{CfgPath, ConfigBuildError, Reconfigure};
|
pub use tor_config::{CfgPath, ConfigBuildError, Reconfigure};
|
||||||
|
|
||||||
/// Types for configuring how Tor circuits are built.
|
/// Types for configuring how Tor circuits are built.
|
||||||
|
@ -46,6 +47,7 @@ pub mod dir {
|
||||||
/// and requests.
|
/// and requests.
|
||||||
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct ClientAddrConfig {
|
pub struct ClientAddrConfig {
|
||||||
/// Should we allow attempts to make Tor connections to local addresses?
|
/// Should we allow attempts to make Tor connections to local addresses?
|
||||||
|
@ -67,6 +69,7 @@ pub struct ClientAddrConfig {
|
||||||
/// and requests—even those that are currently waiting.
|
/// and requests—even those that are currently waiting.
|
||||||
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub struct StreamTimeoutConfig {
|
pub struct StreamTimeoutConfig {
|
||||||
|
@ -74,17 +77,20 @@ pub struct StreamTimeoutConfig {
|
||||||
/// to a host?
|
/// to a host?
|
||||||
#[builder(default = "default_connect_timeout()")]
|
#[builder(default = "default_connect_timeout()")]
|
||||||
#[serde(with = "humantime_serde", default = "default_connect_timeout")]
|
#[serde(with = "humantime_serde", default = "default_connect_timeout")]
|
||||||
|
#[builder(attrs(serde(with = "humantime_serde_option")))]
|
||||||
pub(crate) connect_timeout: Duration,
|
pub(crate) connect_timeout: Duration,
|
||||||
|
|
||||||
/// How long should we wait before timing out when resolving a DNS record?
|
/// How long should we wait before timing out when resolving a DNS record?
|
||||||
#[builder(default = "default_dns_resolve_timeout()")]
|
#[builder(default = "default_dns_resolve_timeout()")]
|
||||||
#[serde(with = "humantime_serde", default = "default_dns_resolve_timeout")]
|
#[serde(with = "humantime_serde", default = "default_dns_resolve_timeout")]
|
||||||
|
#[builder(attrs(serde(with = "humantime_serde_option")))]
|
||||||
pub(crate) resolve_timeout: Duration,
|
pub(crate) resolve_timeout: Duration,
|
||||||
|
|
||||||
/// How long should we wait before timing out when resolving a DNS
|
/// How long should we wait before timing out when resolving a DNS
|
||||||
/// PTR record?
|
/// PTR record?
|
||||||
#[builder(default = "default_dns_resolve_ptr_timeout()")]
|
#[builder(default = "default_dns_resolve_ptr_timeout()")]
|
||||||
#[serde(with = "humantime_serde", default = "default_dns_resolve_ptr_timeout")]
|
#[serde(with = "humantime_serde", default = "default_dns_resolve_ptr_timeout")]
|
||||||
|
#[builder(attrs(serde(with = "humantime_serde_option")))]
|
||||||
pub(crate) resolve_ptr_timeout: Duration,
|
pub(crate) resolve_ptr_timeout: Duration,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,6 +178,7 @@ fn default_dns_resolve_ptr_timeout() -> Duration {
|
||||||
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct StorageConfig {
|
pub struct StorageConfig {
|
||||||
/// Location on disk for cached directory information.
|
/// Location on disk for cached directory information.
|
||||||
#[builder(setter(into), default = "default_cache_dir()")]
|
#[builder(setter(into), default = "default_cache_dir()")]
|
||||||
|
@ -239,6 +246,7 @@ impl From<StorageConfig> for StorageConfigBuilder {
|
||||||
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub struct SystemConfig {
|
pub struct SystemConfig {
|
||||||
/// Maximum number of file descriptors we should launch with
|
/// Maximum number of file descriptors we should launch with
|
||||||
|
|
|
@ -20,6 +20,7 @@ pub(crate) const ARTI_DEFAULTS: &str = concat!(include_str!("./arti_defaults.tom
|
||||||
#[derive(Deserialize, Debug, Default, Clone, Builder, Eq, PartialEq)]
|
#[derive(Deserialize, Debug, Default, Clone, Builder, Eq, PartialEq)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct ApplicationConfig {
|
pub struct ApplicationConfig {
|
||||||
/// If true, we should watch our configuration files for changes, and reload
|
/// If true, we should watch our configuration files for changes, and reload
|
||||||
/// our configuration when they change.
|
/// our configuration when they change.
|
||||||
|
@ -53,6 +54,7 @@ impl ApplicationConfig {
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[non_exhaustive] // TODO(nickm) remove public elements when I revise this.
|
#[non_exhaustive] // TODO(nickm) remove public elements when I revise this.
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct LoggingConfig {
|
pub struct LoggingConfig {
|
||||||
/// Filtering directives that determine tracing levels as described at
|
/// Filtering directives that determine tracing levels as described at
|
||||||
/// <https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/targets/struct.Targets.html#impl-FromStr>
|
/// <https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/targets/struct.Targets.html#impl-FromStr>
|
||||||
|
@ -188,6 +190,7 @@ impl LogfileConfig {
|
||||||
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct ProxyConfig {
|
pub struct ProxyConfig {
|
||||||
/// Port to listen on (at localhost) for incoming SOCKS
|
/// Port to listen on (at localhost) for incoming SOCKS
|
||||||
/// connections.
|
/// connections.
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
//!
|
//!
|
||||||
//! Most types in this module are re-exported by `arti-client`.
|
//! Most types in this module are re-exported by `arti-client`.
|
||||||
|
|
||||||
|
use tor_basic_utils::humantime_serde_option;
|
||||||
use tor_config::ConfigBuildError;
|
use tor_config::ConfigBuildError;
|
||||||
|
|
||||||
use derive_builder::Builder;
|
use derive_builder::Builder;
|
||||||
|
@ -22,6 +23,7 @@ use std::time::Duration;
|
||||||
/// restrictive.
|
/// restrictive.
|
||||||
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct PathConfig {
|
pub struct PathConfig {
|
||||||
/// Set the length of a bit-prefix for a default IPv4 subnet-family.
|
/// Set the length of a bit-prefix for a default IPv4 subnet-family.
|
||||||
|
@ -103,6 +105,7 @@ impl From<PathConfig> for PathConfigBuilder {
|
||||||
/// Except as noted, this configuration can be changed on a running Arti client.
|
/// Except as noted, this configuration can be changed on a running Arti client.
|
||||||
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct PreemptiveCircuitConfig {
|
pub struct PreemptiveCircuitConfig {
|
||||||
/// If we have at least this many available circuits, we suspend
|
/// If we have at least this many available circuits, we suspend
|
||||||
|
@ -128,6 +131,7 @@ pub struct PreemptiveCircuitConfig {
|
||||||
/// available for that port?
|
/// available for that port?
|
||||||
#[builder(default = "default_preemptive_duration()")]
|
#[builder(default = "default_preemptive_duration()")]
|
||||||
#[serde(with = "humantime_serde", default = "default_preemptive_duration")]
|
#[serde(with = "humantime_serde", default = "default_preemptive_duration")]
|
||||||
|
#[builder(attrs(serde(with = "humantime_serde_option")))]
|
||||||
pub(crate) prediction_lifetime: Duration,
|
pub(crate) prediction_lifetime: Duration,
|
||||||
|
|
||||||
/// How many available circuits should we try to have, at minimum, for each
|
/// How many available circuits should we try to have, at minimum, for each
|
||||||
|
@ -149,12 +153,14 @@ pub struct PreemptiveCircuitConfig {
|
||||||
/// [#263](https://gitlab.torproject.org/tpo/core/arti/-/issues/263).
|
/// [#263](https://gitlab.torproject.org/tpo/core/arti/-/issues/263).
|
||||||
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
#[derive(Debug, Clone, Builder, Deserialize, Eq, PartialEq)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct CircuitTiming {
|
pub struct CircuitTiming {
|
||||||
/// How long after a circuit has first been used should we give
|
/// How long after a circuit has first been used should we give
|
||||||
/// it out for new requests?
|
/// it out for new requests?
|
||||||
#[builder(default = "default_max_dirtiness()")]
|
#[builder(default = "default_max_dirtiness()")]
|
||||||
#[serde(with = "humantime_serde", default = "default_max_dirtiness")]
|
#[serde(with = "humantime_serde", default = "default_max_dirtiness")]
|
||||||
|
#[builder(attrs(serde(with = "humantime_serde_option")))]
|
||||||
pub(crate) max_dirtiness: Duration,
|
pub(crate) max_dirtiness: Duration,
|
||||||
|
|
||||||
/// When a circuit is requested, we stop retrying new circuits
|
/// When a circuit is requested, we stop retrying new circuits
|
||||||
|
@ -162,6 +168,7 @@ pub struct CircuitTiming {
|
||||||
// TODO: Impose a maximum or minimum?
|
// TODO: Impose a maximum or minimum?
|
||||||
#[builder(default = "default_request_timeout()")]
|
#[builder(default = "default_request_timeout()")]
|
||||||
#[serde(with = "humantime_serde", default = "default_request_timeout")]
|
#[serde(with = "humantime_serde", default = "default_request_timeout")]
|
||||||
|
#[builder(attrs(serde(with = "humantime_serde_option")))]
|
||||||
pub(crate) request_timeout: Duration,
|
pub(crate) request_timeout: Duration,
|
||||||
|
|
||||||
/// When a circuit is requested, we stop retrying new circuits after
|
/// When a circuit is requested, we stop retrying new circuits after
|
||||||
|
@ -176,6 +183,7 @@ pub struct CircuitTiming {
|
||||||
/// request.
|
/// request.
|
||||||
#[builder(default = "default_request_loyalty()")]
|
#[builder(default = "default_request_loyalty()")]
|
||||||
#[serde(with = "humantime_serde", default = "default_request_loyalty")]
|
#[serde(with = "humantime_serde", default = "default_request_loyalty")]
|
||||||
|
#[builder(attrs(serde(with = "humantime_serde_option")))]
|
||||||
pub(crate) request_loyalty: Duration,
|
pub(crate) request_loyalty: Duration,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ use tor_netdoc::doc::authcert::{AuthCert, AuthCertKeyIds};
|
||||||
// we want our authorities format to be future-proof against adding new info
|
// we want our authorities format to be future-proof against adding new info
|
||||||
// about each authority.
|
// about each authority.
|
||||||
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct Authority {
|
pub struct Authority {
|
||||||
/// A memorable nickname for this authority.
|
/// A memorable nickname for this authority.
|
||||||
#[builder(setter(into))]
|
#[builder(setter(into))]
|
||||||
|
|
|
@ -28,6 +28,7 @@ use serde::Deserialize;
|
||||||
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[builder(build_fn(validate = "Self::validate", error = "ConfigBuildError"))]
|
#[builder(build_fn(validate = "Self::validate", error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct NetworkConfig {
|
pub struct NetworkConfig {
|
||||||
/// List of locations to look in when downloading directory information, if
|
/// List of locations to look in when downloading directory information, if
|
||||||
/// we don't actually have a directory yet.
|
/// we don't actually have a directory yet.
|
||||||
|
@ -110,6 +111,7 @@ impl NetworkConfigBuilder {
|
||||||
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
#[derive(Deserialize, Debug, Clone, Builder, Eq, PartialEq)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct DownloadScheduleConfig {
|
pub struct DownloadScheduleConfig {
|
||||||
/// Top-level configuration for how to retry our initial bootstrap attempt.
|
/// Top-level configuration for how to retry our initial bootstrap attempt.
|
||||||
#[serde(default = "default_retry_bootstrap")]
|
#[serde(default = "default_retry_bootstrap")]
|
||||||
|
@ -181,6 +183,7 @@ impl From<DownloadScheduleConfig> for DownloadScheduleConfigBuilder {
|
||||||
/// running Arti client. Those that cannot are documented.
|
/// running Arti client. Those that cannot are documented.
|
||||||
#[derive(Debug, Clone, Builder, Eq, PartialEq)]
|
#[derive(Debug, Clone, Builder, Eq, PartialEq)]
|
||||||
#[builder(build_fn(error = "ConfigBuildError"))]
|
#[builder(build_fn(error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct DirMgrConfig {
|
pub struct DirMgrConfig {
|
||||||
/// Location to use for storing and reading current-format
|
/// Location to use for storing and reading current-format
|
||||||
/// directory information.
|
/// directory information.
|
||||||
|
|
|
@ -27,6 +27,7 @@ use std::net::SocketAddr;
|
||||||
// be future-proof against adding new info about each fallback.
|
// be future-proof against adding new info about each fallback.
|
||||||
#[derive(Debug, Clone, Deserialize, Builder, Eq, PartialEq)]
|
#[derive(Debug, Clone, Deserialize, Builder, Eq, PartialEq)]
|
||||||
#[builder(build_fn(validate = "FallbackDirBuilder::validate", error = "ConfigBuildError"))]
|
#[builder(build_fn(validate = "FallbackDirBuilder::validate", error = "ConfigBuildError"))]
|
||||||
|
#[builder(derive(Deserialize))]
|
||||||
pub struct FallbackDir {
|
pub struct FallbackDir {
|
||||||
/// RSA identity for the directory relay
|
/// RSA identity for the directory relay
|
||||||
rsa_identity: RsaIdentity,
|
rsa_identity: RsaIdentity,
|
||||||
|
|
Loading…
Reference in New Issue