tor_netdoc/doc/netstatus/
rs.rs1#[cfg(feature = "build_docs")]
7pub(crate) mod build;
8pub(crate) mod md;
9pub(crate) mod plain;
10pub(crate) mod vote;
11
12use super::{ConsensusFlavor, ConsensusMethods, consensus_methods_comma_separated};
13use crate::doc::netstatus::{
14 IgnoredPublicationTimeSp, NetParams, NetstatusKwd, Protocols, RelayWeight, RelayWeightsItem,
15};
16use crate::encode::{EncodeOrd, ItemEncoder};
17use crate::parse::parser::Section;
18use crate::parse2::ItemArgumentParseable;
19use crate::types::misc::*;
20use crate::types::policy::PortPolicy;
21use crate::types::relay_flags::{self, DocRelayFlags, RelayFlag, RelayFlags};
22use crate::types::version::TorVersion;
23use crate::{Error, NetdocErrorKind as EK, Result};
24use derive_deftly::Deftly;
25use itertools::chain;
26use std::cmp::Ordering;
27use std::{net, time};
28use tor_basic_utils::intern::{Intern, InternCache};
29use tor_error::{Bug, internal};
30use tor_llcrypto::pk::rsa::RsaIdentity;
31
32#[derive(Clone, Debug, Eq, PartialEq, Hash, derive_more::Display)]
38#[non_exhaustive]
39pub enum SoftwareVersion {
40 #[display("Tor {_0}")]
42 CTor(TorVersion),
43 Other(Intern<str>),
45}
46
47static OTHER_VERSION_CACHE: InternCache<str> = InternCache::new();
53
54#[derive(Debug, Clone, Default, Eq, PartialEq, Ord, PartialOrd, Deftly)]
70#[derive_deftly(ItemValueEncodable, ItemValueParseable)]
71#[non_exhaustive]
72pub struct RouterStatusMdDigestsVote {
73 #[deftly(netdoc(with = consensus_methods_comma_separated))]
75 pub consensus_methods: ConsensusMethods,
76
77 pub digests: Vec<IdentifiedDigest>,
79}
80
81impl std::str::FromStr for SoftwareVersion {
82 type Err = Error;
83
84 fn from_str(s: &str) -> Result<Self> {
85 let mut elts = s.splitn(3, ' ');
86 if elts.next() == Some("Tor") {
87 if let Some(Ok(v)) = elts.next().map(str::parse) {
88 return Ok(SoftwareVersion::CTor(v));
89 }
90 }
91
92 Ok(SoftwareVersion::Other(OTHER_VERSION_CACHE.intern_ref(s)))
93 }
94}
95
96trait FromRsString: Sized {
99 fn decode(s: &str) -> Result<Self>;
101}