use super::*;
#[cfg(feature = "parse2")]
ns_choose! { (
use doc_digest_parse2_real as doc_digest_parse2_r; use Ignored as doc_digest_parse2_m;
use relay_flags::ConsensusRepr as VarietyRelayFlagsRepr;
) (
use NotPresent as doc_digest_parse2_r;
use doc_digest_parse2_real_item as doc_digest_parse2_m; use relay_flags::ConsensusRepr as VarietyRelayFlagsRepr;
) (
use doc_digest_parse2_real as doc_digest_parse2_r; use RouterStatusMdDigestsVote as doc_digest_parse2_m;
use relay_flags::VoteRepr as VarietyRelayFlagsRepr;
) }
#[cfg_attr(feature = "parse2", derive(Deftly), derive_deftly(ItemValueParseable))]
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct RouterStatusIntroItem {
pub nickname: Nickname,
pub identity: Base64Fingerprint,
#[cfg_attr(feature = "parse2", deftly(netdoc(with = "doc_digest_parse2_r")))]
pub doc_digest: ns_type!(DocDigest, NotPresent, DocDigest),
pub publication: ns_type!(
IgnoredPublicationTimeSp,
IgnoredPublicationTimeSp,
Iso8601TimeSp
),
pub ip: std::net::Ipv4Addr,
pub or_port: u16,
}
#[cfg_attr(feature = "parse2", derive(Deftly), derive_deftly(NetdocParseable))]
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct RouterStatus {
pub r: RouterStatusIntroItem,
#[cfg_attr(feature = "parse2", deftly(netdoc(with = "doc_digest_parse2_m")))]
pub m: ns_type!(NotPresent, DocDigest, Vec<RouterStatusMdDigestsVote>),
#[cfg_attr(feature = "parse2", deftly(netdoc(single_arg)))]
pub a: Vec<net::SocketAddr>,
#[cfg_attr(
feature = "parse2",
deftly(netdoc(keyword = "s")),
deftly(netdoc(with = "relay_flags::Parser::<VarietyRelayFlagsRepr>"))
)]
pub flags: DocRelayFlags,
#[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "v")))]
pub version: Option<SoftwareVersion>,
#[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "pr")))]
pub protos: Protocols,
#[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "w")))]
pub weight: RelayWeight,
}
impl RouterStatus {
pub fn doc_digest(&self) -> &DocDigest {
ns_expr!(&self.r.doc_digest, &self.m, &self.r.doc_digest,)
}
}
#[cfg(feature = "parse2")]
pub(crate) mod doc_digest_parse2_real {
use super::*;
use crate::parse2::ArgumentError as AE;
use crate::parse2::ArgumentStream;
use std::result::Result;
pub(crate) fn from_args<'s>(args: &mut ArgumentStream<'s>) -> Result<DocDigest, AE> {
let data = args
.next()
.ok_or(AE::Missing)?
.parse::<B64>()
.map_err(|_| AE::Invalid)?;
data.into_array().map_err(|_| AE::Invalid)
}
}