diff --git a/crates/tor-netdoc/Cargo.toml b/crates/tor-netdoc/Cargo.toml index d4faae06bf1b8ecfcf439fe89bff047773ffd754..24606b318d5d8b8f745146741fc91651f3b84a72 100644 --- a/crates/tor-netdoc/Cargo.toml +++ b/crates/tor-netdoc/Cargo.toml @@ -135,7 +135,7 @@ tinystr = "0.8.0" tor-basic-utils = { path = "../tor-basic-utils", version = "0.41.0" } tor-bytes = { path = "../tor-bytes", version = "0.41.0" } tor-cell = { path = "../tor-cell", version = "0.41.0" } -tor-cert = { path = "../tor-cert", version = "0.41.0" } +tor-cert = { path = "../tor-cert", version = "0.41.0", features = ["encode"] } tor-checkable = { path = "../tor-checkable", version = "0.41.0" } tor-error = { path = "../tor-error", version = "0.41.0" } tor-hscrypto = { path = "../tor-hscrypto", version = "0.41.0", optional = true } diff --git a/crates/tor-netdoc/README.md b/crates/tor-netdoc/README.md index 6955b516ca2b3ae696c0975769465ac35d0a89e8..a24ce0e01e3fe35e20d57becfd009ec496c8fdd8 100644 --- a/crates/tor-netdoc/README.md +++ b/crates/tor-netdoc/README.md @@ -68,12 +68,6 @@ the parsers for the documents themselves. ## Features -`routerdesc`: enable support for the "router descriptor" document type, which -is needed by bridge clients and relays. - -`plain-consensus`: enable support for the "plain (unflavoured) consensus" document type, which -some relays cache and serve. - `hs-client`: enable support for parsing hidden service descriptors. `hs-service`: enable support for generating hidden service descriptors. @@ -90,6 +84,13 @@ not be used. Use of such features is (even more) at your own risk. #### Deprecated features +`routerdesc`: previously needed to enable support for the "router +descriptor" document type. This support is now enabled unconditionally. + +`plain-consensus`: previously needed to enable support for the "plain +(unflavoured) consensus" document type. This support is now enabled +unconditionally. + `build_docs`: enable code to construct the objects representing different network documents, with builder patterns. diff --git a/crates/tor-netdoc/src/doc.rs b/crates/tor-netdoc/src/doc.rs index cc53fd2fd1b32c6b3cfe27fcac6a670dd1bdf5f9..6e252c2887e615d366d30bb20da409974436d298 100644 --- a/crates/tor-netdoc/src/doc.rs +++ b/crates/tor-netdoc/src/doc.rs @@ -38,16 +38,4 @@ pub mod hsdesc; pub mod microdesc; pub mod netstatus; -#[cfg(any(doc, feature = "routerdesc"))] pub mod routerdesc; - -// TODO: Do not define this twice but do `pub use` instead. -#[allow(missing_docs, clippy::missing_docs_in_private_items)] -#[cfg(not(any(doc, feature = "routerdesc")))] -pub mod routerdesc { - /// The digest of a RouterDesc document, as reported in a NS consensus. - pub type RdDigest = [u8; 20]; - - /// The digest of an ExtraInfo document, as reported in a RouterDesc. - pub type ExtraInfoDigest = [u8; 20]; -} diff --git a/crates/tor-netdoc/src/doc/authcert.rs b/crates/tor-netdoc/src/doc/authcert.rs index 581146ec51e954fcbdedb09ba7c42316d29b4480..0021b8809bcfe15b80209a58d9764677f143aff1 100644 --- a/crates/tor-netdoc/src/doc/authcert.rs +++ b/crates/tor-netdoc/src/doc/authcert.rs @@ -39,9 +39,9 @@ mod build; #[allow(deprecated)] pub use build::AuthCertBuilder; -#[cfg(all(feature = "plain-consensus", feature = "incomplete"))] +#[cfg(feature = "incomplete")] mod encoded; -#[cfg(all(feature = "plain-consensus", feature = "incomplete"))] +#[cfg(feature = "incomplete")] pub use encoded::EncodedAuthCert; decl_keyword! { @@ -677,7 +677,7 @@ impl AuthCert { /// as an [`EncodedAuthCert`]. // TODO these features are quite tangled // `EncodedAuthCert` is only available with `parse2` and `plain-consensus` - #[cfg(all(feature = "plain-consensus", feature = "incomplete"))] + #[cfg(feature = "incomplete")] // Needs EncodedAuthCert pub fn encode_sign(&self, k_auth_id_rsa: &rsa::KeyPair) -> StdResult { let mut encoder = NetdocEncoder::new(); self.encode_unsigned(&mut encoder)?; @@ -1190,7 +1190,7 @@ mzMT023bleZ574az+117yNAr6XbIgqQfzbySzVLPXM8ZN9BrGR40KDZ2638ZJjRu } } - #[cfg(all(feature = "plain-consensus", feature = "incomplete"))] + #[cfg(feature = "incomplete")] mod encode_test { use super::*; use crate::parse2::{ParseInput, parse_netdoc}; diff --git a/crates/tor-netdoc/src/doc/authcert/encoded.rs b/crates/tor-netdoc/src/doc/authcert/encoded.rs index 9ad0640159da9ddf858dea5aeac3a13d347c70a2..0a355429d71fd963a89f4300b9c2e7b08302f48e 100644 --- a/crates/tor-netdoc/src/doc/authcert/encoded.rs +++ b/crates/tor-netdoc/src/doc/authcert/encoded.rs @@ -1,7 +1,9 @@ //! `EncodedAuthCert` use std::str::FromStr; +use tor_error::Bug; +use crate::encode::{NetdocEncodable, NetdocEncoder}; use crate::parse2::{ ErrorProblem, IsStructural, ItemStream, KeywordRef, NetdocParseable, ParseInput, }; @@ -268,12 +270,8 @@ impl NetdocParseable for EncodedAuthCert { } } -#[cfg(feature = "encode")] // TODO get rid of this feature, and use imports rather than :: paths -impl crate::encode::NetdocEncodable for EncodedAuthCert { - fn encode_unsigned( - &self, - out: &mut crate::encode::NetdocEncoder, - ) -> Result<(), tor_error::Bug> { +impl NetdocEncodable for EncodedAuthCert { + fn encode_unsigned(&self, out: &mut NetdocEncoder) -> Result<(), Bug> { // OK because invariants include the right syntax including a trailing newline. out.push_raw_string(&self.as_str()); Ok(()) diff --git a/crates/tor-netdoc/src/doc/microdesc.rs b/crates/tor-netdoc/src/doc/microdesc.rs index 3f4db94ad70717e562063745b97231b152dd2f5d..740ebde00ad00748cfb996b87b787b8b5c584d24 100644 --- a/crates/tor-netdoc/src/doc/microdesc.rs +++ b/crates/tor-netdoc/src/doc/microdesc.rs @@ -33,7 +33,6 @@ use std::sync::Arc; use std::sync::LazyLock; use std::time; -#[cfg(feature = "parse2")] use crate::parse2::ItemObjectParseable; #[cfg(feature = "build_docs")] @@ -62,7 +61,7 @@ pub type MdDigest = [u8; DOC_DIGEST_LEN]; /// /// #[derive(Clone, Debug, Deftly, PartialEq, Eq)] -#[cfg_attr(feature = "parse2", derive_deftly(NetdocParseable))] +#[derive_deftly(NetdocParseable)] #[non_exhaustive] pub struct Microdesc { /// The legacy onion key, whose object is optional but whose item serves @@ -74,31 +73,28 @@ pub struct Microdesc { onion_key: OnionKeyIntro, /// Public key used for the ntor circuit extension protocol. - #[cfg_attr(feature = "parse2", deftly(netdoc(single_arg)))] + #[deftly(netdoc(single_arg))] pub ntor_onion_key: Curve25519Public, /// Declared family for this relay. - #[cfg_attr(feature = "parse2", deftly(netdoc(default)))] + #[deftly(netdoc(default))] pub family: Arc, /// Family identities for this relay. - #[cfg_attr(feature = "parse2", deftly(netdoc(default)))] + #[deftly(netdoc(default))] pub family_ids: RelayFamilyIds, /// List of IPv4 ports to which this relay will exit - #[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "p", default)))] + #[deftly(netdoc(keyword = "p", default))] pub ipv4_policy: Arc, /// List of IPv6 ports to which this relay will exit - #[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "p6", default)))] + #[deftly(netdoc(keyword = "p6", default))] pub ipv6_policy: Arc, /// Ed25519 identity for this relay // TODO SPEC: Set this to "exactly once". - #[cfg_attr( - feature = "parse2", - deftly(netdoc(keyword = "id", with = "Ed25519IdentityLine")) - )] + #[deftly(netdoc(keyword = "id", with = "Ed25519IdentityLine"))] pub ed25519_id: Ed25519IdentityLine, // addr is obsolete and doesn't go here any more @@ -108,7 +104,7 @@ pub struct Microdesc { /// it, and when listing it in a consensus document. // TODO: maybe this belongs somewhere else. Once it's used to store // correlate the microdesc to a consensus, it's never used again. - #[cfg_attr(feature = "parse2", deftly(netdoc(skip)))] + #[deftly(netdoc(skip))] pub sha256: MdDigest, } @@ -165,10 +161,8 @@ impl Microdesc { /// The object (the onion key) is deprecated and optional, but the item itself /// must be present, because it is used to mark the start of the netdoc. #[derive(Debug, Clone, Default, Deftly, PartialEq, Eq)] -#[cfg_attr(feature = "parse2", derive_deftly(ItemValueParseable))] -struct OnionKeyIntro( - #[cfg_attr(feature = "parse2", deftly(netdoc(object)))] Option, -); +#[derive_deftly(ItemValueParseable)] +struct OnionKeyIntro(#[deftly(netdoc(object))] Option); /// A microdescriptor annotated with additional data /// @@ -663,7 +657,6 @@ mod test { /// replaced by a copy and paste in the case one replaces the testdata2 /// vector's in the future. #[test] - #[cfg(feature = "parse2")] fn parse2() { use tor_llcrypto::pk::ed25519::Ed25519Identity; @@ -716,7 +709,6 @@ Yl0wCKpUZFHs5CHsajLSfXZKHkwfqRXFEJu9aMtmQdQFfqE9JOJHAgMBAAE= // TODO: This should be included in testdata2/ but that would require the // chutney/shadow integration test to actually do families at all. #[test] - #[cfg(feature = "parse2")] fn parse2_happy_family() { use tor_llcrypto::pk::ed25519::Ed25519Identity; diff --git a/crates/tor-netdoc/src/doc/netstatus.rs b/crates/tor-netdoc/src/doc/netstatus.rs index 5981bbce90bedf4a0487195ae7c5e18a9c9203ba..d0b839dd0bd69ffed9103f0e2d9d9bd68744e146 100644 --- a/crates/tor-netdoc/src/doc/netstatus.rs +++ b/crates/tor-netdoc/src/doc/netstatus.rs @@ -52,37 +52,27 @@ mod dir_source; mod rs; pub mod md; -#[cfg(feature = "plain-consensus")] pub mod plain; -#[cfg(feature = "ns-vote")] +#[cfg(feature = "incomplete")] pub mod vote; #[cfg(feature = "build_docs")] mod build; -#[cfg(feature = "encode")] -use { - crate::encode::{ItemValueEncodable, NetdocEncodable, NetdocEncoder}, // - tor_error::Bug, -}; -#[cfg(feature = "parse2")] -use { - crate::parse2::{self, ArgumentStream, ItemValueParseable}, // -}; - -#[cfg(feature = "parse2")] -pub use { - parse2::{ErrorProblem, IsStructural, ItemStream, KeywordRef, NetdocParseable, StopAt}, - proto_statuses_parse2_encode::ProtoStatusesNetdocParseAccumulator, // -}; +pub use proto_statuses_parse2_encode::ProtoStatusesNetdocParseAccumulator; -#[cfg(all(feature = "parse2", feature = "plain-consensus"))] +#[cfg(feature = "incomplete")] use crate::doc::authcert::EncodedAuthCert; use crate::doc::authcert::{AuthCert, AuthCertKeyIds}; +use crate::encode::{ItemValueEncodable, NetdocEncodable, NetdocEncoder}; use crate::parse::keyword::Keyword; use crate::parse::parser::{Section, SectionRules, SectionRulesBuilder}; use crate::parse::tokenize::{Item, ItemResult, NetDocReader}; +use crate::parse2::{ + self, ArgumentStream, ErrorProblem, IsStructural, ItemStream, ItemValueParseable, KeywordRef, + NetdocParseable, StopAt, +}; use crate::types::misc::*; use crate::types::relay_flags::{self, DocRelayFlags}; use crate::util::PeekableIterator; @@ -93,7 +83,7 @@ use std::result::Result as StdResult; use std::str::FromStr; use std::sync::Arc; use std::{net, result, time}; -use tor_error::{HasKind, bad_api_usage, internal}; +use tor_error::{Bug, HasKind, bad_api_usage, internal}; use tor_protover::Protocols; use derive_deftly::{Deftly, define_derive_deftly}; @@ -107,7 +97,7 @@ use serde::{Deserialize, Deserializer}; #[cfg(feature = "build_docs")] pub use build::MdConsensusBuilder; -#[cfg(all(feature = "build_docs", feature = "plain-consensus"))] +#[cfg(feature = "build_docs")] pub use build::PlainConsensusBuilder; #[cfg(feature = "build_docs")] ns_export_each_flavor! { @@ -119,19 +109,14 @@ ns_export_each_variety! { } #[deprecated] -#[cfg(feature = "ns_consensus")] pub use PlainConsensus as NsConsensus; #[deprecated] -#[cfg(feature = "ns_consensus")] pub use PlainRouterStatus as NsRouterStatus; #[deprecated] -#[cfg(feature = "ns_consensus")] pub use UncheckedPlainConsensus as UncheckedNsConsensus; #[deprecated] -#[cfg(feature = "ns_consensus")] pub use UnvalidatedPlainConsensus as UnvalidatedNsConsensus; -#[cfg(feature = "ns-vote")] pub use rs::{RouterStatusMdDigestsVote, SoftwareVersion}; pub use dir_source::{ConsensusAuthoritySection, DirSource, SupersededAuthorityKey}; @@ -161,12 +146,8 @@ pub struct IgnoredPublicationTimeSp; /// /// Aggregate of three netdoc preamble fields. #[derive(Clone, Debug, Deftly)] -#[derive_deftly(Constructor)] +#[derive_deftly(Constructor, NetdocEncodableFields, NetdocParseableFields)] #[derive_deftly(Lifetime)] -#[cfg_attr(feature = "encode", derive_deftly(NetdocEncodableFields))] -#[cfg_attr(feature = "parse2", derive_deftly(NetdocParseableFields))] -// derive_deftly_adhoc disables unused deftly attribute checking, so we needn't cfg_attr them all -#[cfg_attr(not(any(feature = "parse2", feature = "encode")), derive_deftly_adhoc)] #[allow(clippy::exhaustive_structs)] pub struct Lifetime { /// `valid-after` --- Time at which the document becomes valid @@ -278,8 +259,7 @@ impl NormalItemArgument for ConsensusMethod {} /// /// There is also [`consensus_methods_comma_separated`] for `m` lines in votes. #[derive(Debug, Clone, Default, Eq, PartialEq, Deftly)] -#[cfg_attr(feature = "parse2", derive_deftly(ItemValueParseable))] -#[cfg_attr(feature = "encode", derive_deftly(ItemValueEncodable))] +#[derive_deftly(ItemValueEncodable, ItemValueParseable)] #[non_exhaustive] pub struct ConsensusMethods { /// Consensus methods. @@ -290,7 +270,6 @@ pub struct ConsensusMethods { /// /// As found in an `m` item in a vote: /// -#[cfg(feature = "parse2")] pub mod consensus_methods_comma_separated { use super::*; use parse2::ArgumentError as AE; @@ -578,8 +557,7 @@ pub struct SharedRandVal([u8; 32]); /// along with meta-information about that value. #[derive(Debug, Clone, Deftly)] #[non_exhaustive] -#[cfg_attr(feature = "parse2", derive_deftly(ItemValueParseable))] -#[cfg_attr(feature = "encode", derive_deftly(ItemValueEncodable))] +#[derive_deftly(ItemValueEncodable, ItemValueParseable)] pub struct SharedRandStatus { /// How many authorities revealed shares that contributed to this value. pub n_reveals: u8, @@ -637,10 +615,7 @@ pub type MdAuthorityEntry = ConsensusAuthorityEntry; // 1. That avoids separating the two consensus authority entry types, which are identical // 2. The only common fields are `dir-source` and `contact`, so there is little duplication #[derive(Debug, Clone, Deftly)] -#[cfg_attr(feature = "parse2", derive_deftly(NetdocParseable))] -#[cfg_attr(feature = "encode", derive_deftly(NetdocEncodable))] -#[cfg_attr(not(any(feature = "parse2", feature = "encode")), derive_deftly_adhoc)] -#[derive_deftly(Constructor)] +#[derive_deftly(Constructor, NetdocEncodable, NetdocParseable)] #[allow(clippy::exhaustive_structs)] pub struct ConsensusAuthorityEntry { /// Contents of the `dir-source` line about an authority @@ -679,10 +654,7 @@ pub struct ConsensusAuthorityEntry { /// TODO DIRAUTH not all fields are here yet. // They have individual comments, below. #[derive(Debug, Clone, Deftly)] -#[cfg_attr(feature = "parse2", derive_deftly(NetdocParseable))] -#[cfg_attr(feature = "encode", derive_deftly(NetdocEncodable))] -#[cfg_attr(not(any(feature = "parse2", feature = "encode")), derive_deftly_adhoc)] -#[derive_deftly(Constructor)] +#[derive_deftly(Constructor, NetdocEncodable, NetdocParseable)] #[allow(clippy::exhaustive_structs)] pub struct VoteAuthorityEntry { /// Contents of the `dir-source` line about an authority @@ -722,7 +694,7 @@ define_derive_deftly! { ${defcond F_NORMAL not(fmeta(netdoc(skip)))} - #[cfg(feature = "parse2")] + #[cfg(feature = "incomplete")] // needs EncodedAuthCert, otherwise complete impl NetdocParseable for VoteAuthoritySection { fn doctype_for_error() -> &'static str { "vote.authority.section" @@ -758,7 +730,7 @@ define_derive_deftly! { } } - #[cfg(feature = "encode")] + #[cfg(feature = "incomplete")] impl NetdocEncodable for VoteAuthoritySection { fn encode_unsigned(&self, out: &mut NetdocEncoder) -> StdResult<(), Bug> { $( @@ -779,7 +751,7 @@ define_derive_deftly! { #[derive(Deftly, Clone, Debug)] #[derive_deftly(VoteAuthoritySection, Constructor)] #[allow(clippy::exhaustive_structs)] -#[cfg(all(feature = "parse2", feature = "plain-consensus"))] +#[cfg(feature = "incomplete")] // needs EncodedAuthCert, otherwise complete pub struct VoteAuthoritySection { /// Authority entry #[deftly(constructor)] @@ -818,17 +790,14 @@ pub type UnvalidatedMdConsensus = md::UnvalidatedConsensus; /// and timeliness. pub type UncheckedMdConsensus = md::UncheckedConsensus; -#[cfg(feature = "plain-consensus")] /// A consensus document that lists relays along with their /// router descriptor documents. pub type PlainConsensus = plain::Consensus; -#[cfg(feature = "plain-consensus")] /// An PlainConsensus that has been parsed and checked for timeliness, /// but not for signatures. pub type UnvalidatedPlainConsensus = plain::UnvalidatedConsensus; -#[cfg(feature = "plain-consensus")] /// An PlainConsensus that has been parsed but not checked for signatures /// and timeliness. pub type UncheckedPlainConsensus = plain::UncheckedConsensus; @@ -1279,8 +1248,7 @@ impl RelayWeight { /// `parse2` impls for types in this modulea /// -/// Separate module to save on repeated `cfg` and for a separate namespace. -#[cfg(feature = "parse2")] +/// Separate module for a separate namespace. mod parse2_impls { use super::*; pub(super) use parse2::{ @@ -1332,8 +1300,7 @@ mod parse2_impls { /// `encode` impls for types in this modulea /// -/// Separate module to save on repeated `cfg` and for a separate namespace. -#[cfg(feature = "encode")] +/// Separate module for a separate namespace. mod encode_impls { use super::*; use std::result::Result; @@ -1379,12 +1346,9 @@ impl Footer { /// `ProtoStatuses` parsing and encoding /// -/// Separate module to save on repeated `cfg` to hide the helper struct -#[cfg(any(feature = "encode", feature = "parse2"))] +/// Separate module for separate namespace mod proto_statuses_parse2_encode { - #[cfg(feature = "encode")] use super::encode_impls::*; - #[cfg(feature = "parse2")] use super::parse2_impls::*; use super::*; use paste::paste; @@ -1406,7 +1370,6 @@ mod proto_statuses_parse2_encode { macro_rules! impl_proto_statuses { { $( $rr:ident $cr:ident; )* } => { paste! { #[derive(Deftly)] #[derive_deftly(NetdocParseableFields)] - #[cfg(feature = "parse2")] // Only ProtoStatusesParseNetdocParseAccumulator is exposed. #[allow(unreachable_pub)] pub struct ProtoStatusesParseHelper { @@ -1417,11 +1380,9 @@ mod proto_statuses_parse2_encode { } /// Partially parsed `ProtoStatuses` - #[cfg(feature = "parse2")] pub use ProtoStatusesParseHelperNetdocParseAccumulator as ProtoStatusesNetdocParseAccumulator; - #[cfg(feature = "parse2")] impl NetdocParseableFields for ProtoStatuses { type Accumulator = ProtoStatusesNetdocParseAccumulator; fn is_item_keyword(kw: KeywordRef<'_>) -> bool { @@ -1443,7 +1404,6 @@ mod proto_statuses_parse2_encode { } } - #[cfg(feature = "encode")] impl NetdocEncodableFields for ProtoStatuses { fn encode_fields(&self, out: &mut NetdocEncoder) -> Result<(), Bug> { $( @@ -1648,7 +1608,7 @@ mod test { //! use super::*; use hex_literal::hex; - #[cfg(all(feature = "ns-vote", feature = "parse2"))] + #[cfg(feature = "incomplete")] use { crate::parse2::{NetdocUnverified as _, ParseInput, parse_netdoc}, std::fs, @@ -1657,9 +1617,7 @@ mod test { const CERTS: &str = include_str!("../../testdata/authcerts2.txt"); const CONSENSUS: &str = include_str!("../../testdata/mdconsensus1.txt"); - #[cfg(feature = "plain-consensus")] const PLAIN_CERTS: &str = include_str!("../../testdata2/cached-certs"); - #[cfg(feature = "plain-consensus")] const PLAIN_CONSENSUS: &str = include_str!("../../testdata2/cached-consensus"); fn read_bad(fname: &str) -> String { @@ -1740,7 +1698,6 @@ mod test { } #[test] - #[cfg(feature = "plain-consensus")] fn parse_and_validate_ns() -> Result<()> { use tor_checkable::{SelfSigned, Timebound}; let mut certs = Vec::new(); @@ -1766,12 +1723,12 @@ mod test { } #[test] - #[cfg(all(feature = "plain-consensus", feature = "incomplete"))] + #[cfg(feature = "incomplete")] fn parse2_vote() -> anyhow::Result<()> { let file = "testdata2/v3-status-votes--1"; let text = fs::read_to_string(file)?; - // TODO replace the poc struct here when we have parsing of proper whole votes + // TODO DIRAUTH replace the poc struct here when we have parsing of proper whole votes use crate::parse2::poc::netstatus::NetworkStatusUnverifiedVote; let input = ParseInput::new(&text, file); @@ -1884,20 +1841,15 @@ mod test { let p = "Hello=Goodbye Fred=7".parse::>(); assert!(p.is_err()); - #[cfg(feature = "encode")] - { - use crate::encode::{ItemValueEncodable, NetdocEncoder}; - - for bad_kw in ["What=The", "", "\n", "\0"] { - let p = [(bad_kw, 42)].into_iter().collect::>(); - let mut d = NetdocEncoder::new(); - let d = (|| { - let i = d.item("bad-psrams"); - p.write_item_value_onto(i)?; - d.finish() - })(); - let _: tor_error::Bug = d.expect_err(bad_kw); - } + for bad_kw in ["What=The", "", "\n", "\0"] { + let p = [(bad_kw, 42)].into_iter().collect::>(); + let mut d = NetdocEncoder::new(); + let d = (|| { + let i = d.item("bad-psrams"); + p.write_item_value_onto(i)?; + d.finish() + })(); + let _: tor_error::Bug = d.expect_err(bad_kw); } } diff --git a/crates/tor-netdoc/src/doc/netstatus/build.rs b/crates/tor-netdoc/src/doc/netstatus/build.rs index eb4a9907b5a9a33d3be9413aec0172e196c40b20..39b5cb3a0838d9110926f6c7aef6058f5a7b94c1 100644 --- a/crates/tor-netdoc/src/doc/netstatus/build.rs +++ b/crates/tor-netdoc/src/doc/netstatus/build.rs @@ -19,7 +19,6 @@ use std::sync::Arc; use std::time::SystemTime; pub(crate) mod md; -#[cfg(feature = "plain-consensus")] pub(crate) mod plain; ns_export_each_flavor! { diff --git a/crates/tor-netdoc/src/doc/netstatus/dir_source.rs b/crates/tor-netdoc/src/doc/netstatus/dir_source.rs index 5687fe90f8bf5b0177f981c9e6a7cc7ee4ee5b16..bda0b8b009110a5707c378d59519a1740e31fbfa 100644 --- a/crates/tor-netdoc/src/doc/netstatus/dir_source.rs +++ b/crates/tor-netdoc/src/doc/netstatus/dir_source.rs @@ -48,7 +48,7 @@ define_derive_deftly! { // /// #[derive(Debug, Clone, Deftly, amplify::Getters)] - #[cfg_attr(feature = "encode", derive_deftly(ItemValueEncodable))] + #[derive_deftly(ItemValueEncodable)] #[derive_deftly_adhoc] // ignore deftly attrs directed at Constructor pub struct SupersededAuthorityKey { /// Real nickname for this authority, not including the `-legacy` @@ -96,7 +96,6 @@ define_derive_deftly! { /// Instead we derive `ItemValueParseable` on this and convert it ad-hoc /// in `ConsensusAuthoritySection`'s parser. #[derive(Debug, Clone, Deftly)] - #[cfg(feature = "parse2")] #[derive_deftly(ItemValueParseable)] #[derive_deftly_adhoc] // ignore deftly attrs directed at Constructor struct RawDirSource { @@ -106,7 +105,6 @@ define_derive_deftly! { $DEFINE_NORMAL_FIELDS } - #[cfg(feature = "parse2")] impl RawDirSource { /// Convert into the public representation. fn into_superseded(self) -> Result { @@ -133,11 +131,8 @@ define_derive_deftly! { /// Corresponds to a dir-source line which is *not* a "superseded authority key entry". /// #[derive(Debug, Clone, Deftly)] +#[derive_deftly(Constructor, ItemValueParseable, ItemValueEncodable)] #[derive_deftly(SupersededAuthorityKey)] -#[cfg_attr(feature = "parse2", derive_deftly(ItemValueParseable))] -#[cfg_attr(feature = "encode", derive_deftly(ItemValueEncodable))] -#[cfg_attr(not(any(feature = "parse2", feature = "encode")), derive_deftly_adhoc)] -#[derive_deftly(Constructor)] #[allow(clippy::exhaustive_structs)] pub struct DirSource { /// human-readable nickname for this authority. @@ -198,7 +193,6 @@ pub struct ConsensusAuthoritySection { pub __non_exhaustive: (), } -#[cfg(feature = "encode")] impl NetdocEncodable for ConsensusAuthoritySection { fn encode_unsigned(&self, out: &mut NetdocEncoder) -> Result<(), Bug> { // bind all fields so that if any are added we remember to encode them @@ -222,7 +216,6 @@ impl NetdocEncodable for ConsensusAuthoritySection { } } -#[cfg(feature = "parse2")] impl NetdocParseable for ConsensusAuthoritySection { fn doctype_for_error() -> &'static str { "consensus.authorities" diff --git a/crates/tor-netdoc/src/doc/netstatus/each_variety.rs b/crates/tor-netdoc/src/doc/netstatus/each_variety.rs index 513f199d1ab757c294955cc496a52eb48bc4e5aa..9648b2dbded98f0df64453567f4bcb88f3f4e007 100644 --- a/crates/tor-netdoc/src/doc/netstatus/each_variety.rs +++ b/crates/tor-netdoc/src/doc/netstatus/each_variety.rs @@ -30,11 +30,7 @@ ns_use_this_variety! { // and is missing some consensus fields that need to be manipulated by dirauths; // there are individual TODO comments about each such defect. #[derive(Clone, Debug, Deftly)] -#[derive_deftly(Constructor)] -#[cfg_attr(feature = "parse2", derive_deftly(NetdocParseableFields))] -#[cfg_attr(feature = "encode", derive_deftly(NetdocEncodableFields))] -// derive_deftly_adhoc disables unused deftly attribute checking, so we needn't cfg_attr them all -#[cfg_attr(not(any(feature = "parse2", feature = "encode")), derive_deftly_adhoc)] +#[derive_deftly(Constructor, NetdocEncodableFields, NetdocParseableFields)] #[allow(clippy::exhaustive_structs)] pub struct Preamble { /// Consensus methods supported by this voter. diff --git a/crates/tor-netdoc/src/doc/netstatus/rs.rs b/crates/tor-netdoc/src/doc/netstatus/rs.rs index 918833121f01ff85f2e93257b7c3313b3be09d12..6175cd4b48d4f43f7ba00950248e4e07f2a39642 100644 --- a/crates/tor-netdoc/src/doc/netstatus/rs.rs +++ b/crates/tor-netdoc/src/doc/netstatus/rs.rs @@ -6,12 +6,11 @@ #[cfg(feature = "build_docs")] pub(crate) mod build; pub(crate) mod md; -#[cfg(feature = "plain-consensus")] pub(crate) mod plain; -#[cfg(feature = "ns-vote")] +#[cfg(feature = "incomplete")] pub(crate) mod vote; -use super::{ConsensusFlavor, ConsensusMethods}; +use super::{ConsensusFlavor, ConsensusMethods, consensus_methods_comma_separated}; use crate::doc::netstatus::NetstatusKwd; use crate::doc::netstatus::{IgnoredPublicationTimeSp, Protocols, RelayWeight}; use crate::parse::parser::Section; @@ -19,6 +18,7 @@ use crate::types::misc::*; use crate::types::relay_flags::{self, DocRelayFlags, RelayFlag, RelayFlags}; use crate::types::version::TorVersion; use crate::{Error, NetdocErrorKind as EK, Result}; +use derive_deftly::Deftly; use itertools::chain; use std::sync::Arc; use std::{net, time}; @@ -26,12 +26,6 @@ use tor_basic_utils::intern::InternCache; use tor_error::internal; use tor_llcrypto::pk::rsa::RsaIdentity; -#[cfg(feature = "parse2")] -use { - super::consensus_methods_comma_separated, // - derive_deftly::Deftly, -}; - /// A version as presented in a router status. /// /// This can either be a parsed Tor version, or an unparsed string. @@ -67,16 +61,12 @@ static OTHER_VERSION_CACHE: InternCache = InternCache::new(); /// must sort it. /// * These non-invariants apply both within one instance of this struct, /// and across multiple instances of it within a `RouterStatus`. -#[derive(Debug, Clone, Default, Eq, PartialEq)] -#[cfg(feature = "ns-vote")] -#[cfg_attr(feature = "parse2", derive(Deftly), derive_deftly(ItemValueParseable))] +#[derive(Debug, Clone, Default, Eq, PartialEq, Deftly)] +#[derive_deftly(ItemValueParseable)] #[non_exhaustive] pub struct RouterStatusMdDigestsVote { /// The methods for which this document is applicable. - #[cfg_attr( - feature = "parse2", - deftly(netdoc(with = consensus_methods_comma_separated)) - )] + #[deftly(netdoc(with = consensus_methods_comma_separated))] pub consensus_methods: ConsensusMethods, /// The various hashes of this document. diff --git a/crates/tor-netdoc/src/doc/netstatus/rs/build.rs b/crates/tor-netdoc/src/doc/netstatus/rs/build.rs index bd2999857b830fa5eda655d5a9b6f9dd872d9a1d..ba50a4c4f5b04435fd4fd1b30e9704a04ff50539 100644 --- a/crates/tor-netdoc/src/doc/netstatus/rs/build.rs +++ b/crates/tor-netdoc/src/doc/netstatus/rs/build.rs @@ -10,5 +10,4 @@ use tor_protover::Protocols; use std::net::SocketAddr; pub(crate) mod md; -#[cfg(feature = "plain-consensus")] pub(crate) mod plain; diff --git a/crates/tor-netdoc/src/doc/netstatus/rs/each_variety.rs b/crates/tor-netdoc/src/doc/netstatus/rs/each_variety.rs index 00d698fd722a3047ac4787666eb0875868b3a291..596ee71ae3b0f3a2b050b13eaf9a0c48a3438a9a 100644 --- a/crates/tor-netdoc/src/doc/netstatus/rs/each_variety.rs +++ b/crates/tor-netdoc/src/doc/netstatus/rs/each_variety.rs @@ -28,7 +28,6 @@ use super::*; // but they're just byte arrays and such impls would imply that byte arrays are always // represented the same way in netdocs which is very far from being true. // TODO consider introducing newtypes for routerdesc and microdesc hashes? -#[cfg(feature = "parse2")] ns_choose! { ( use doc_digest_parse2_real as doc_digest_parse2_r; // implemented here in rs/each_variety.rs use Ignored as doc_digest_parse2_m; @@ -49,8 +48,8 @@ ns_choose! { ( /// /// /// `r` item. -#[cfg_attr(feature = "parse2", derive(Deftly), derive_deftly(ItemValueParseable))] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deftly)] +#[derive_deftly(ItemValueParseable)] #[non_exhaustive] pub struct RouterStatusIntroItem { /// The nickname for this relay. @@ -63,7 +62,7 @@ pub struct RouterStatusIntroItem { /// Digest of the document for this relay (except md consensuses) // TODO SPEC rename in the spec from `digest` to "doc_digest" // TODO SPEC in md consensuses the referenced document digest is in a separate `m` item - #[cfg_attr(feature = "parse2", deftly(netdoc(with = doc_digest_parse2_r)))] + #[deftly(netdoc(with = doc_digest_parse2_r))] pub doc_digest: ns_type!(DocDigest, NotPresent, DocDigest), /// Publication time. pub publication: ns_type!( @@ -87,8 +86,8 @@ pub struct RouterStatusIntroItem { // In most netdocs we would use the item keywords as the field names. But routerstatus // entry keywords are chosen to be very short to minimise the consensus size, so we // use longer names in the struct and specify the keyword separately. -#[cfg_attr(feature = "parse2", derive(Deftly), derive_deftly(NetdocParseable))] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deftly)] +#[derive_deftly(NetdocParseable)] #[non_exhaustive] pub struct RouterStatus { /// `r` --- Introduce a routerstatus entry @@ -106,42 +105,41 @@ pub struct RouterStatus { /// `r` item. // We call this field `m` rather than `doc_digest` because it's not always the doc digest. // TODO SPEC in all but md consensuses the referenced document digest is in the `r` intro item - #[cfg_attr(feature = "parse2", deftly(netdoc(with = doc_digest_parse2_m)))] + #[deftly(netdoc(with = doc_digest_parse2_m))] pub m: ns_type!(NotPresent, DocDigest, Vec), /// `a` --- Further router address(es) (IPv6) /// /// /// (and, the md version, which is different). - #[cfg_attr(feature = "parse2", deftly(netdoc(single_arg)))] + #[deftly(netdoc(single_arg))] pub a: Vec, /// `s` --- Router status flags /// /// - #[cfg_attr( - feature = "parse2", - deftly(netdoc(keyword = "s")), - deftly(netdoc(with = { relay_flags::ParserEncoder:: })) - )] + #[deftly(netdoc( + keyword = "s", + with = { relay_flags::ParserEncoder:: }, + ))] pub flags: DocRelayFlags, /// `v` --- Relay's Tor software version /// /// - #[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "v")))] + #[deftly(netdoc(keyword = "v"))] pub version: Option, /// `pr` --- Subprotocol capabilities supported /// /// - #[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "pr")))] + #[deftly(netdoc(keyword = "pr"))] pub protos: Protocols, /// `w` --- Bandwidth estimates /// /// - #[cfg_attr(feature = "parse2", deftly(netdoc(keyword = "w")))] + #[deftly(netdoc(keyword = "w"))] pub weight: RelayWeight, } @@ -161,7 +159,6 @@ impl RouterStatus { /// /// This field is present in `r` items, except for md consensuses, where it's in `m`. /// Hence the `_real`, which lets us swap it out for each variety. -#[cfg(feature = "parse2")] pub(crate) mod doc_digest_parse2_real { use super::*; use crate::parse2::ArgumentError as AE; diff --git a/crates/tor-netdoc/src/doc/netstatus/rs/md.rs b/crates/tor-netdoc/src/doc/netstatus/rs/md.rs index a4083ea94fdf6678fad550d32ed5dd2cc3e43c99..22216dbf480320151d109aebf795fda9a2277891 100644 --- a/crates/tor-netdoc/src/doc/netstatus/rs/md.rs +++ b/crates/tor-netdoc/src/doc/netstatus/rs/md.rs @@ -28,7 +28,6 @@ impl RouterStatus { /// See `doc_digest_parse2_real` in `rs/each_variety.rs`. /// This is in `md.rs` because it's needed only for md consensuses. /// Elsewhere, the value is in the `r` item, so is merely `ItemArgumentParseable`. -#[cfg(feature = "parse2")] pub(crate) mod doc_digest_parse2_real_item { use super::*; use crate::parse2::ErrorProblem as EP; diff --git a/crates/tor-netdoc/src/doc/ns_variety_definition_macros.rs b/crates/tor-netdoc/src/doc/ns_variety_definition_macros.rs index de50dd40ed74ad98dea580b4ea210b5721badef1..4fa480f9b0e8873ba75f86c4629ad0199878c90a 100644 --- a/crates/tor-netdoc/src/doc/ns_variety_definition_macros.rs +++ b/crates/tor-netdoc/src/doc/ns_variety_definition_macros.rs @@ -300,7 +300,7 @@ use ns_do_variety_md; /// Include variety-agnostic items, for a vote, from `each_variety.rs`. /// /// Use within `vote.rs`. -#[allow(unused)] // TODO feature = "ns-vote" +#[allow(unused)] // TODO DIRAUTH macro_rules! ns_do_variety_vote { {} => { ns_do_one_variety! { vote : plain md vote $ } } } #[cfg(doc)] use ns_do_variety_vote; @@ -339,13 +339,11 @@ macro_rules! ns_export_each_variety { { @ [ $($case:tt)* ] [$($infix:tt)*] $id:ident } => { paste::paste!{ - #[cfg(feature = "plain-consensus")] - #[cfg_attr(docsrs, doc(cfg(feature = "plain-consensus")))] pub use { plain ::$id as [] }; // unconditional pub use { md ::$id as [] }; - #[cfg(feature = "ns-vote")] // TODO ns-vote this feature doesn't exist yet - #[cfg_attr(docsrs, doc(cfg(feature = "ns-vote")))] + #[cfg(feature = "incomplete")] + #[cfg_attr(docsrs, doc(cfg(feature = "incomplete")))] pub use { vote::$id as [] }; } }; } @@ -372,8 +370,6 @@ macro_rules! ns_export_each_flavor { { @ [ $($case:tt)* ] [$($infix:tt)*] $id:ident } => { paste::paste!{ - #[cfg(feature = "plain-consensus")] - #[cfg_attr(docsrs, doc(cfg(feature = "plain-consensus")))] pub use { plain ::$id as [] }; // unconditional pub use { md ::$id as [] }; diff --git a/crates/tor-netdoc/src/doc/routerdesc.rs b/crates/tor-netdoc/src/doc/routerdesc.rs index 2d6aa4d920e4b9f13416d3f07e0b0b1ddc5bf1ed..4fd467c29e5ac1ae7a568c54b5dd6a3588d48fa6 100644 --- a/crates/tor-netdoc/src/doc/routerdesc.rs +++ b/crates/tor-netdoc/src/doc/routerdesc.rs @@ -214,7 +214,6 @@ impl std::str::FromStr for RelayPlatform { } } -#[cfg(feature = "parse2")] impl ItemArgumentParseable for RelayPlatform { fn from_args<'s>(args: &mut ArgumentStream<'s>) -> std::result::Result { args.into_remaining() diff --git a/crates/tor-netdoc/src/lib.rs b/crates/tor-netdoc/src/lib.rs index f3bd31758d9ba47e4d645df926ebde607f81966e..d20e980dece33689ebfbaec67e631ffdf5a6bc03 100644 --- a/crates/tor-netdoc/src/lib.rs +++ b/crates/tor-netdoc/src/lib.rs @@ -63,7 +63,7 @@ pub mod doc; mod err; pub mod types; -#[cfg(all(test, feature = "parse2", feature = "encode"))] +#[cfg(test)] mod test2; #[doc(hidden)] @@ -76,8 +76,6 @@ pub use util::batching_split_before; pub use err::{BuildError, Error, NetdocErrorKind, Pos}; -#[cfg(feature = "encode")] -#[cfg_attr(docsrs, doc(cfg(feature = "encode")))] pub use encode::NetdocBuilder; /// Alias for the Result type returned by most objects in this module. diff --git a/crates/tor-netdoc/src/parse/tokenize.rs b/crates/tor-netdoc/src/parse/tokenize.rs index 85bfb2ab361464f779dbc6ac2a30cce63711eb79..f683d2550d5e84bf2ebb0c1fe6e28cb4e1135ab6 100644 --- a/crates/tor-netdoc/src/parse/tokenize.rs +++ b/crates/tor-netdoc/src/parse/tokenize.rs @@ -513,7 +513,6 @@ impl<'a, 'b, K: Keyword> MaybeItem<'a, 'b, K> { /// If this item is present, parse its argument at position `idx`. /// Treat the absence or malformedness of the argument as an error, /// but treat the absence of this item as acceptable. - #[cfg(any(test, feature = "routerdesc"))] pub(crate) fn parse_arg(&self, idx: usize) -> Result> where Error: From, @@ -669,7 +668,6 @@ impl<'a, K: Keyword> NetDocReader<'a, K> { /// /// Like [`should_be_exhausted`](Self::should_be_exhausted), /// but permit empty lines at the end of the document. - #[cfg(feature = "routerdesc")] pub(crate) fn should_be_exhausted_but_for_empty_lines(&mut self) -> Result<()> { use crate::err::NetdocErrorKind as K; while let Some(Err(e)) = self.peek() { diff --git a/crates/tor-netdoc/src/parse2.rs b/crates/tor-netdoc/src/parse2.rs index 1e08c9d408935ca8071d5b8e13be377f924674ba..948086df46baef9ae7ea12f04faba23f5ece106c 100644 --- a/crates/tor-netdoc/src/parse2.rs +++ b/crates/tor-netdoc/src/parse2.rs @@ -95,7 +95,7 @@ pub mod multiplicity; mod signatures; mod traits; -#[cfg(all(feature = "plain-consensus", feature = "incomplete"))] +#[cfg(feature = "incomplete")] pub mod poc; use internal_prelude::*; diff --git a/crates/tor-netdoc/src/types/embedded_cert.rs b/crates/tor-netdoc/src/types/embedded_cert.rs index 86866374eb9ea13763b00db7ec141523c88056b5..1d4f3b958fe17d16a3b27242fecbb2d217fe6551 100644 --- a/crates/tor-netdoc/src/types/embedded_cert.rs +++ b/crates/tor-netdoc/src/types/embedded_cert.rs @@ -237,5 +237,5 @@ where } } -#[cfg(all(test, feature = "routerdesc"))] +#[cfg(test)] mod test; diff --git a/crates/tor-netdoc/src/types/family.rs b/crates/tor-netdoc/src/types/family.rs index ecaf594cc87708eb672db36ba543759a72bdc209..eddab82062aa68e209b6c82b283aa9b06734ae9c 100644 --- a/crates/tor-netdoc/src/types/family.rs +++ b/crates/tor-netdoc/src/types/family.rs @@ -26,7 +26,7 @@ use tor_llcrypto::pk::rsa::RsaIdentity; /// /// TODO: This type probably belongs in a different crate. #[derive(Clone, Debug, Default, Hash, Eq, PartialEq, Deftly)] -#[cfg_attr(feature = "parse2", derive_deftly(ItemValueParseable))] +#[derive_deftly(ItemValueParseable)] pub struct RelayFamily(Vec); /// Cache of RelayFamily objects, for saving memory. @@ -152,7 +152,7 @@ impl NormalItemArgument for RelayFamilyId {} /// A list of multiple [`RelayFamilyId`] entries as found in microdescs. #[derive(Clone, Debug, Default, Eq, PartialEq, Deftly, derive_more::AsRef)] -#[cfg_attr(feature = "parse2", derive_deftly(ItemValueParseable))] +#[derive_deftly(ItemValueParseable)] pub struct RelayFamilyIds( // TODO DIRMIRROR: Replace with BTreeSet at one point. // TODO could/should this be a type alias instead? @@ -274,10 +274,9 @@ mod test { } #[test] - #[cfg(feature = "parse2")] fn parse2() { #[derive(Debug, PartialEq, Eq, derive_deftly::Deftly)] - #[cfg_attr(feature = "parse2", derive_deftly(NetdocParseable))] + #[derive_deftly(NetdocParseable)] struct Wrapper { family: RelayFamily, } diff --git a/crates/tor-netdoc/src/types/misc.rs b/crates/tor-netdoc/src/types/misc.rs index edd4c2d1ff478a8e07f418e29609885a3dde4daf..3a3e8859fe97bf3fbf695506ee14316cccaf07cd 100644 --- a/crates/tor-netdoc/src/types/misc.rs +++ b/crates/tor-netdoc/src/types/misc.rs @@ -10,7 +10,6 @@ pub use b64impl::*; pub use contact_info::*; pub use curve25519impl::*; pub use ed25519impl::*; -#[cfg(any(feature = "routerdesc", feature = "hs-common"))] pub(crate) use edcert::*; pub use fingerprint::*; pub use hostname::*; @@ -1143,11 +1142,9 @@ mod rsa { } /// Types for decoding Ed25519 certificates -#[cfg(any(feature = "routerdesc", feature = "hs-common"))] mod edcert { use crate::{NetdocErrorKind as EK, Pos, Result}; use tor_cert::{CertType, Ed25519Cert, KeyUnknownCert}; - #[cfg(feature = "routerdesc")] use tor_llcrypto::pk::ed25519; /// An ed25519 certificate as parsed from a directory object, with @@ -1183,7 +1180,6 @@ mod edcert { Ok(self) } /// Give an error if this certificate's subject_key is not `pk` - #[cfg(feature = "routerdesc")] pub(crate) fn check_subject_key_is(self, pk: &ed25519::Ed25519Identity) -> Result { if self.0.peek_subject_key().as_ed25519() != Some(pk) { return Err(EK::BadObjectVal @@ -2271,7 +2267,6 @@ mod test { assert!(failure.is_err()); } - #[cfg(feature = "routerdesc")] #[test] fn ed_cert() { use tor_llcrypto::pk::ed25519::Ed25519Identity; diff --git a/crates/tor-netdoc/src/types/policy.rs b/crates/tor-netdoc/src/types/policy.rs index 640656e3358e5f7f07deece5a74a1d2a56f4ddf1..9a6f3c2cdda4633e912ccd7161b7f438901168e7 100644 --- a/crates/tor-netdoc/src/types/policy.rs +++ b/crates/tor-netdoc/src/types/policy.rs @@ -27,7 +27,6 @@ pub use addrpolicy::{AddrPolicy, AddrPortPattern}; pub use portpolicy::PortPolicy; use crate::NormalItemArgument; -#[cfg(feature = "parse2")] use crate::parse2::{ArgumentError, ArgumentStream, ItemArgumentParseable}; /// Error from an unparsable or invalid policy. @@ -306,7 +305,6 @@ impl FromStr for PortRanges { } } -#[cfg(feature = "parse2")] impl ItemArgumentParseable for PortRanges { /// [`PortRanges`] argument parser which is odd because port ranges are /// syntactically a single argument although semantically multiple ones. @@ -350,6 +348,8 @@ mod test { //! use super::*; use crate::Result; + use crate::parse2::{self, ParseInput}; + #[test] fn parse_portrange() -> Result<()> { assert_eq!( @@ -459,20 +459,15 @@ mod test { ] ); - #[cfg(feature = "parse2")] - { - use crate::parse2::{self, ParseInput}; - - #[derive(derive_deftly::Deftly)] - #[derive_deftly(NetdocParseable)] - struct Dummy { - #[deftly(netdoc(single_arg))] - dummy: PortRanges, - } - let ranges2 = - parse2::parse_netdoc::(&ParseInput::new(&format!("dummy {INPUT}\n"), "")) - .unwrap(); - assert_eq!(ranges, ranges2.dummy); + #[derive(derive_deftly::Deftly)] + #[derive_deftly(NetdocParseable)] + struct Dummy { + #[deftly(netdoc(single_arg))] + dummy: PortRanges, } + let ranges2 = + parse2::parse_netdoc::(&ParseInput::new(&format!("dummy {INPUT}\n"), "")) + .unwrap(); + assert_eq!(ranges, ranges2.dummy); } } diff --git a/crates/tor-netdoc/src/types/policy/addrpolicy.rs b/crates/tor-netdoc/src/types/policy/addrpolicy.rs index 41aba7cc2e3d784469a7c87da7e2ff0d2f3524ca..3950cb6c8deaf9f2090843e3f5068c9387236129 100644 --- a/crates/tor-netdoc/src/types/policy/addrpolicy.rs +++ b/crates/tor-netdoc/src/types/policy/addrpolicy.rs @@ -6,7 +6,6 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use std::str::FromStr; use crate::NormalItemArgument; -#[cfg(feature = "parse2")] use crate::parse2::{ ErrorProblem as EP, ItemArgumentParseable, KeywordRef, NetdocParseableFields, UnparsedItem, }; @@ -84,7 +83,6 @@ impl AddrPolicy { } } -#[cfg(feature = "parse2")] impl NetdocParseableFields for AddrPolicy { type Accumulator = AddrPolicy; @@ -450,7 +448,6 @@ mod test { assert_eq!(&x2, &x); } - #[cfg(feature = "parse2")] #[test] fn parse2() { use crate::{ diff --git a/crates/tor-netdoc/src/types/policy/portpolicy.rs b/crates/tor-netdoc/src/types/policy/portpolicy.rs index dae0df13b0f5710230953f1933c45f7209c56710..7ca46aafa2bdc1d553e5ce63e7c204685d207d45 100644 --- a/crates/tor-netdoc/src/types/policy/portpolicy.rs +++ b/crates/tor-netdoc/src/types/policy/portpolicy.rs @@ -6,13 +6,11 @@ use std::fmt::Display; use std::str::FromStr; use std::sync::Arc; -#[cfg(feature = "parse2")] use crate::parse2::{ErrorProblem as EP, ItemValueParseable, UnparsedItem}; use super::{PolicyError, PortRanges, RuleKind}; use tor_basic_utils::intern::InternCache; -#[cfg(feature = "parse2")] use derive_deftly::Deftly; /// A policy to match zero or more TCP/UDP ports. @@ -126,7 +124,6 @@ impl FromStr for PortPolicy { } } -#[cfg(feature = "parse2")] impl ItemValueParseable for PortPolicy { // Manual implementation incorporating the `accept`/`reject`, // using `.invert()` if necessary to yield simply a `PortPolicy`, @@ -182,14 +179,10 @@ mod test { #![allow(clippy::useless_vec)] #![allow(clippy::needless_pass_by_value)] //! - use itertools::Itertools; - - #[cfg(feature = "parse2")] - use crate::parse2::{self, ParseInput}; - use super::*; + use crate::parse2::{self, ParseInput}; + use itertools::Itertools; - #[cfg(feature = "parse2")] #[derive(derive_deftly::Deftly)] #[derive_deftly(NetdocParseable)] struct Dummy { @@ -207,18 +200,15 @@ mod test { for p in deny { assert!(!policy.allows_port(*p)); } - #[cfg(feature = "parse2")] - { - let policy2 = - parse2::parse_netdoc::(&ParseInput::new(&format!("dummy {inp}"), "")) - .unwrap() - .dummy; - for p in allow { - assert!(policy2.allows_port(*p)); - } - for p in deny { - assert!(!policy2.allows_port(*p)); - } + let policy2 = + parse2::parse_netdoc::(&ParseInput::new(&format!("dummy {inp}"), "")) + .unwrap() + .dummy; + for p in allow { + assert!(policy2.allows_port(*p)); + } + for p in deny { + assert!(!policy2.allows_port(*p)); } } @@ -268,13 +258,9 @@ mod test { "reject 5,4,3,2", ] { assert!(s.parse::().is_err()); - #[cfg(feature = "parse2")] - { - assert!( - parse2::parse_netdoc::(&ParseInput::new(&format!("dummy {s}"), "")) - .is_err() - ); - } + assert!( + parse2::parse_netdoc::(&ParseInput::new(&format!("dummy {s}"), "")).is_err() + ); } } diff --git a/crates/tor-netdoc/src/types/relay_flags.rs b/crates/tor-netdoc/src/types/relay_flags.rs index dd4d0ceb89f10c61e86d98c0f34f8e3ba2c551cb..4209d4cf0951649e3465a29190ce9e9a631e13f5 100644 --- a/crates/tor-netdoc/src/types/relay_flags.rs +++ b/crates/tor-netdoc/src/types/relay_flags.rs @@ -267,21 +267,16 @@ mod parse_impl { } /// New parser impl -#[cfg(any(feature = "parse2", feature = "encode"))] mod parse2_impl { use super::*; - #[cfg(feature = "parse2")] use crate::parse2::{self, ErrorProblem as EP}; - - #[cfg(feature = "encode")] use { crate::encode::ItemEncoder, itertools::chain, std::collections::BTreeSet, tor_error::Bug, }; impl<'s, M: ReprMode> ParserEncoder<'s, M> { /// Parse relay flags - #[cfg(feature = "parse2")] #[allow(clippy::needless_pass_by_value)] // we must match trait signature pub(crate) fn from_unparsed(item: parse2::UnparsedItem<'_>) -> Result { item.check_no_object()?; @@ -295,7 +290,6 @@ mod parse2_impl { } /// Encode relay flags - #[cfg(feature = "encode")] #[allow(clippy::unnecessary_wraps)] // we must match trait signature #[allow(clippy::redundant_closure)] // rust-clippy/issues#14215 |f| <&'static str>::from(f) pub(crate) fn write_item_value_onto(