From 6e03375ec79bd4eaeb0be0a2bc0060e7038eac12 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Fri, 24 Jan 2020 11:47:41 +0000 Subject: [PATCH] topology: moved filtering into its own home --- common/topology/src/coco.rs | 4 +++- common/topology/src/filter.rs | 16 +++++++++++++ common/topology/src/lib.rs | 41 ++++++--------------------------- common/topology/src/mix.rs | 3 ++- common/topology/src/provider.rs | 3 ++- 5 files changed, 30 insertions(+), 37 deletions(-) create mode 100644 common/topology/src/filter.rs diff --git a/common/topology/src/coco.rs b/common/topology/src/coco.rs index 320064d08e..be3c20f367 100644 --- a/common/topology/src/coco.rs +++ b/common/topology/src/coco.rs @@ -1,3 +1,5 @@ +use crate::filter; + #[derive(Debug, Clone)] pub struct Node { pub host: String, @@ -6,7 +8,7 @@ pub struct Node { pub version: String, } -impl super::Versioned for Node { +impl filter::Versioned for Node { fn get_version(&self) -> String { self.version.clone() } diff --git a/common/topology/src/filter.rs b/common/topology/src/filter.rs new file mode 100644 index 0000000000..846db99134 --- /dev/null +++ b/common/topology/src/filter.rs @@ -0,0 +1,16 @@ +pub trait Versioned: Clone { + fn get_version(&self) -> String; +} + +pub trait VersionFiltererable { + fn filter_by_version(&self, expected_version: &str) -> Self; +} + +impl VersionFiltererable for Vec { + fn filter_by_version(&self, expected_version: &str) -> Self { + self.iter() + .filter(|node| version_checker::is_compatible(&node.get_version(), expected_version)) + .cloned() + .collect() + } +} diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index 36dd8fa494..d4416d1b8d 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -1,11 +1,12 @@ +use crate::filter::VersionFiltererable; use itertools::Itertools; use rand::seq::IteratorRandom; use sphinx::route::Node as SphinxNode; use std::cmp::max; use std::collections::HashMap; -use version_checker; pub mod coco; +mod filter; pub mod mix; pub mod provider; @@ -99,21 +100,15 @@ pub trait NymTopology: Sized { expected_provider_version: &str, expected_coco_version: &str, ) -> Self { - let mixes = Filter::new(self.mix_nodes()).run(expected_mix_version); - let providers = Filter::new(self.providers()).run(expected_provider_version); - let cocos = Filter::new(self.coco_nodes()).run(expected_coco_version); + let mixes = self.mix_nodes().filter_by_version(expected_mix_version); + let providers = self + .providers() + .filter_by_version(expected_provider_version); + let cocos = self.coco_nodes().filter_by_version(expected_coco_version); Self::new_from_nodes(mixes, providers, cocos) } - fn filter(&self, nodes: Vec, expected_version: &str) -> Vec { - nodes - .iter() - .filter(|node| version_checker::is_compatible(&node.get_version(), expected_version)) - .cloned() - .collect() - } - fn can_construct_path_through(&self) -> bool { match self.make_layered_topology() { Ok(_) => true, @@ -122,28 +117,6 @@ pub trait NymTopology: Sized { } } -pub trait Versioned: Clone + Sized { - fn get_version(&self) -> String; -} - -pub struct Filter { - nodes: Vec, -} - -impl Filter { - fn new(nodes: Vec) -> Self { - Self { nodes } - } - - fn run(&self, expected_version: &str) -> Vec { - self.nodes - .iter() - .filter(|node| version_checker::is_compatible(&node.get_version(), expected_version)) - .cloned() - .collect() - } -} - #[derive(Debug)] pub enum NymTopologyError { InvalidMixLayerError, diff --git a/common/topology/src/mix.rs b/common/topology/src/mix.rs index 0501a9f314..8ff318920c 100644 --- a/common/topology/src/mix.rs +++ b/common/topology/src/mix.rs @@ -1,3 +1,4 @@ +use crate::filter; use sphinx::route::Node as SphinxNode; use sphinx::route::NodeAddressBytes; use std::net::SocketAddr; @@ -20,7 +21,7 @@ impl Node { } } -impl super::Versioned for Node { +impl filter::Versioned for Node { fn get_version(&self) -> String { self.version.clone() } diff --git a/common/topology/src/provider.rs b/common/topology/src/provider.rs index f887a6989a..9bbcfa6d86 100644 --- a/common/topology/src/provider.rs +++ b/common/topology/src/provider.rs @@ -1,3 +1,4 @@ +use crate::filter; use sphinx::route::Node as SphinxNode; use sphinx::route::NodeAddressBytes; use std::net::SocketAddr; @@ -26,7 +27,7 @@ impl Node { } } -impl super::Versioned for Node { +impl filter::Versioned for Node { fn get_version(&self) -> String { self.version.clone() }