tor-circmgr: Introduce TargetPorts with a pretty Display impl

This commit is contained in:
Ian Jackson 2022-01-26 18:39:25 +00:00
parent 09116d7b4d
commit d21b2cc6f5
2 changed files with 35 additions and 2 deletions

View File

@ -73,7 +73,7 @@ mod timeouts;
mod usage;
pub use err::Error;
pub use usage::{IsolationToken, StreamIsolation, StreamIsolationBuilder, TargetPort};
pub use usage::{IsolationToken, StreamIsolation, StreamIsolationBuilder, TargetPort, TargetPorts};
pub use config::{
CircMgrConfig, CircMgrConfigBuilder, CircuitTiming, CircuitTimingBuilder, PathConfig,

View File

@ -29,7 +29,9 @@ pub(crate) struct ExitPolicy {
///
/// Ordinarily, this is a TCP port, plus a flag to indicate whether we
/// must support IPv4 or IPv6.
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Hash, PartialOrd, Ord, Serialize)]
#[derive(
Clone, Copy, Debug, Deserialize, Eq, PartialEq, Hash, PartialOrd, Ord, Serialize, Default,
)]
pub struct TargetPort {
/// True if this is a request to connect to an IPv6 address
ipv6: bool,
@ -66,6 +68,37 @@ impl Display for TargetPort {
}
}
/// Set of requestedd target ports, mostly for use in error reporting
///
/// Displays nicely.
#[derive(Debug, Clone, Default)]
pub struct TargetPorts(Vec<TargetPort>);
impl From<&'_ [TargetPort]> for TargetPorts {
fn from(ports: &'_ [TargetPort]) -> Self {
TargetPorts(ports.into())
}
}
impl Display for TargetPorts {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let brackets = self.0.len() != 1;
if brackets {
write!(f, "[")?;
}
for (i, port) in self.0.iter().enumerate() {
if i > 0 {
write!(f, ",")?;
}
write!(f, "{}", port)?;
}
if brackets {
write!(f, "]")?;
}
Ok(())
}
}
/// A token used to isolate unrelated streams on different circuits.
///
/// When two streams are associated with different isolation tokens, they