use paste::paste;
use crate::doc::microdesc::Microdesc;
use crate::doc::netstatus;
use crate::doc::routerdesc::{RouterDesc, RouterDescUnverified};
use crate::parse2::{NetdocParseable, NetdocParseableUnverified};
use crate::test_support::parse_test_document;
#[macro_use]
#[path = "../testdata-live/generated_consts.rs"]
#[rustfmt::skip] mod generated_consts;
pub use generated_consts::*;
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct PerVariety {
pub plain: &'static str,
pub md: &'static str,
pub vote: &'static str,
}
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct PerRelay {
pub nick: &'static str,
pub data: PerVariety,
}
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub struct RelayDocument<D: 'static> {
pub nick: &'static str,
pub doc: &'static D,
}
fn relay_documents<D, S>(inputs: &[PerRelay], selector: S) -> Vec<RelayDocument<D>>
where
D: NetdocParseable + Sync,
S: Fn(&PerVariety) -> &'static str,
{
inputs
.iter()
.map(|relay| RelayDocument {
nick: relay.nick,
doc: parse_test_document::<D>(selector(&relay.data)),
})
.collect()
}
fn unwrap_bodies<U>(u: Vec<RelayDocument<U>>) -> Vec<RelayDocument<U::Body>>
where
U: NetdocParseableUnverified,
{
u.into_iter()
.map(|rd| RelayDocument {
nick: rd.nick,
doc: rd.doc.inspect_unverified().0,
})
.collect()
}
macro_rules! netstatus_variety { { $v:ident } => { paste!{
pub fn [<netstatus_ $v _unverified>]() -> &'static netstatus::$v::NetworkStatusUnverified {
parse_test_document(NETSTATUS.$v)
}
pub fn [<netstatus_ $v>]() -> &'static netstatus::$v::NetworkStatus {
[<netstatus_ $v _unverified>]().inspect_unverified().0
}
pub fn [<relay_routerstatuses_ $v>]() -> Vec<RelayDocument<netstatus::$v::RouterStatus>> {
relay_documents(RELAY_ROUTERSTATUSES, |relay| relay.$v)
}
} } }
netstatus_variety! { plain }
netstatus_variety! { md }
netstatus_variety! { vote }
pub fn relay_routerdescs() -> Vec<RelayDocument<RouterDesc>> {
unwrap_bodies(relay_routerdescs_unverified())
}
pub fn relay_routerdescs_unverified() -> Vec<RelayDocument<RouterDescUnverified>> {
relay_documents(RELAY_DESCRIPTORS, |relay| relay.plain)
}
pub fn relay_routerdescs_vote() -> Vec<RelayDocument<RouterDesc>> {
unwrap_bodies(relay_routerdescs_vote_unverified())
}
pub fn relay_routerdescs_vote_unverified() -> Vec<RelayDocument<RouterDescUnverified>> {
relay_documents(RELAY_DESCRIPTORS, |relay| relay.vote)
}
pub fn relay_microdescs() -> Vec<RelayDocument<Microdesc>> {
relay_documents(RELAY_DESCRIPTORS, |relay| relay.md)
}
pub fn relay_document_by_nick<D>(nick: &str, docs: &[RelayDocument<D>]) -> &'static D {
docs.iter().find(|d| d.nick == nick).expect(nick).doc
}
#[test]
fn test_all() {
netstatus_plain();
netstatus_md();
netstatus_vote();
netstatus_plain_unverified();
netstatus_md_unverified();
netstatus_vote_unverified();
relay_routerstatuses_plain();
relay_routerstatuses_md();
relay_routerstatuses_vote();
relay_routerdescs();
relay_routerdescs_unverified();
relay_routerdescs_vote();
relay_routerdescs_vote_unverified();
relay_microdescs();
}