topology: moved filtering into its own home
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user