topology: moved filtering into its own home

This commit is contained in:
Dave Hrycyszyn
2020-01-24 11:47:41 +00:00
parent 4c44df46f8
commit 6e03375ec7
5 changed files with 30 additions and 37 deletions
+3 -1
View File
@@ -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()
}
+16
View File
@@ -0,0 +1,16 @@
pub trait Versioned: Clone {
fn get_version(&self) -> String;
}
pub trait VersionFiltererable<T> {
fn filter_by_version(&self, expected_version: &str) -> Self;
}
impl<T: Versioned> VersionFiltererable<T> for Vec<T> {
fn filter_by_version(&self, expected_version: &str) -> Self {
self.iter()
.filter(|node| version_checker::is_compatible(&node.get_version(), expected_version))
.cloned()
.collect()
}
}
+7 -34
View File
@@ -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<T: Versioned>(&self, nodes: Vec<T>, expected_version: &str) -> Vec<T> {
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<T> {
nodes: Vec<T>,
}
impl<T: Versioned> Filter<T> {
fn new(nodes: Vec<T>) -> Self {
Self { nodes }
}
fn run(&self, expected_version: &str) -> Vec<T> {
self.nodes
.iter()
.filter(|node| version_checker::is_compatible(&node.get_version(), expected_version))
.cloned()
.collect()
}
}
#[derive(Debug)]
pub enum NymTopologyError {
InvalidMixLayerError,
+2 -1
View File
@@ -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()
}
+2 -1
View File
@@ -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()
}