use super::*;
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::NoImplicitRepr as VarietyRelayFlagsRepr;
) }
#[derive(Debug, Clone, Deftly)]
#[derive_deftly(ItemValueParseable)]
#[non_exhaustive]
pub struct RouterStatusIntroItem {
pub nickname: Nickname,
pub identity: Base64Fingerprint,
#[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,
}
#[derive(Debug, Clone, Deftly)]
#[derive_deftly(NetdocParseable)]
#[non_exhaustive]
pub struct RouterStatus {
pub r: RouterStatusIntroItem,
#[deftly(netdoc(with = doc_digest_parse2_m))]
pub m: ns_type!(NotPresent, DocDigest, Vec<RouterStatusMdDigestsVote>),
#[deftly(netdoc(single_arg))]
pub a: Vec<net::SocketAddr>,
#[deftly(netdoc(
keyword = "s",
with = { relay_flags::ParserEncoder::<VarietyRelayFlagsRepr> },
))]
pub flags: DocRelayFlags,
#[deftly(netdoc(keyword = "v"))]
pub version: Option<SoftwareVersion>,
#[deftly(netdoc(keyword = "pr"))]
pub protos: Protocols,
#[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,)
}
}
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)
}
}