use super::*;
ns_use_this_variety! {
pub use [crate::doc::netstatus::rs]::?::{RouterStatus};
}
#[derive(Clone, Debug, Deftly)]
#[derive_deftly(Constructor, NetdocEncodable, NetdocParseableUnverified)]
#[deftly(netdoc(doctype_for_error = NETSTATUS_DOCTYPE_FOR_ERROR))]
#[allow(clippy::exhaustive_structs)]
#[cfg(feature = "incomplete")] pub struct NetworkStatus {
pub network_status_version: NetworkStatusVersionItem,
#[deftly(netdoc(single_arg))]
pub vote_status: ns_type!(
VoteStatusConsensus,
VoteStatusConsensus,
VoteStatusVote,
),
#[deftly(constructor, netdoc(flatten))]
pub preamble: Preamble,
#[deftly(constructor, netdoc(subdoc))]
pub authority: ns_type!(
ConsensusAuthoritySection,
ConsensusAuthoritySection,
VoteAuthoritySection,
),
#[deftly(netdoc(subdoc))]
pub routers: Vec<RouterStatus>,
#[deftly(netdoc(subdoc))]
#[deftly(constructor)]
pub footer: Footer,
#[doc(hidden)]
#[deftly(netdoc(skip))]
pub __non_exhaustive: (),
}
#[derive(Clone, Debug, Deftly, Default)]
#[derive_deftly(Constructor, ItemValueEncodable, ItemValueParseable)]
#[allow(clippy::exhaustive_structs)]
pub struct NetworkStatusVersionItem {
pub version: NetworkStatusVersion,
pub variety: VarietyKeyword,
#[doc(hidden)]
#[deftly(netdoc(skip))]
pub __non_exhaustive: (),
}
#[derive(Clone, Debug, Deftly)]
#[derive_deftly(Constructor, NetdocEncodableFields, NetdocParseableFields)]
#[allow(clippy::exhaustive_structs)]
pub struct Preamble {
#[deftly(constructor)]
pub consensus_methods: ns_type!( NotPresent, NotPresent, ConsensusMethods ),
#[deftly(constructor)]
pub consensus_method: ns_type!( (u32,), (u32,), NotPresent ),
#[deftly(constructor)]
pub published: ns_type!( NotPresent, NotPresent, (Iso8601TimeSp,) ),
#[deftly(constructor)]
#[deftly(netdoc(flatten))]
pub lifetime: Lifetime,
pub voting_delay: Option<(u32, u32)>,
#[deftly(netdoc(default))]
pub client_versions: RecommendedTorVersions,
#[deftly(netdoc(default))]
pub server_versions: RecommendedTorVersions,
#[deftly(constructor)]
#[deftly(netdoc(with = "relay_flags::ParserEncoder::<relay_flags::NoImplicitRepr>"))]
pub known_flags: DocRelayFlags,
#[deftly(constructor)]
#[deftly(netdoc(flatten))]
pub proto_statuses: Arc<ProtoStatuses>,
#[deftly(constructor)]
pub params: NetParams<i32>,
#[deftly(netdoc(flatten))]
pub shared_rand: ns_type!( SharedRandStatuses, SharedRandStatuses, NotPresent ),
#[doc(hidden)]
#[deftly(netdoc(skip))]
pub __non_exhaustive: (),
}
#[derive(Clone, Debug, Deftly)]
#[derive_deftly(Constructor, NetdocEncodable, NetdocParseable)]
#[allow(clippy::exhaustive_structs)]
pub struct Footer {
pub directory_footer: (),
#[deftly(constructor, netdoc(flatten))]
pub consensus: ns_type!(ConsensusFooterFields, ConsensusFooterFields, NotPresent),
#[doc(hidden)]
#[deftly(netdoc(skip))]
pub __non_exhaustive: (),
}
#[derive(Deftly, Clone, Debug)]
#[derive_deftly(NetdocEncodableFields, NetdocParseableSignatures)]
#[deftly(netdoc(signatures(hashes_accu = "DirectorySignaturesHashesAccu")))]
#[non_exhaustive]
pub struct NetworkStatusSignatures {
pub directory_signature: ns_type!(Vec<Signature>, Vec<Signature>, Signature),
}
impl Preamble {
pub fn validity_time_range(&self) -> std::ops::Range<SystemTime> {
let lifetime = self.lifetime.clone();
let delay = self.voting_delay.unwrap_or((0, 0));
let dist_interval = time::Duration::from_secs(delay.1.into());
let starting_time = lifetime.valid_after.saturating_sub(dist_interval);
starting_time..*lifetime.valid_until
}
}