use itertools::Itertools;
use crate::from_hex;
use crate::structs::{NetworkEnvironment, PeerId, PublicKey, Seed, TrustData, TrustRatingLabel};
use crate::util::current_time_millis;
#[derive(Debug, serde::Deserialize)]
struct SeedCsvRecord {
external_address: String,
network_environment: String,
score: f64,
}
fn parse_seeds_csv_resource(str: &str) -> Vec<SeedCsvRecord> {
let mut rdr = csv::Reader::from_reader(str.as_bytes());
let mut res = vec![];
for result in rdr.deserialize() {
let record: SeedCsvRecord = result.expect("");
res.push(record);
}
res
}
pub fn seed(addr: impl Into<String>) -> Seed {
let mut s = Seed::default();
s.external_address = addr.into();
let t = TrustData::from_label(0.9);
s.trust = vec![t];
s.environments = vec![NetworkEnvironment::All as i32];
s
}
pub fn s(addr: impl Into<String>, pid: String, pk: String) -> Seed {
let mut ss = seed(addr);
ss.peer_id = Some(PeerId::from_hex(pid).expect("hex"));
ss.public_key = Some(PublicKey::from_hex(pk).expect("hex"));
ss
}
pub fn get_seeds() -> Vec<Seed> {
(1..5).map(|i| seed(format!("n{}.redgold.io", i))).collect_vec()
}
pub fn get_seeds_by_env(env: &NetworkEnvironment) -> Vec<Seed> {
get_seeds().into_iter()
.filter(|s| {
let env_match = s.environments.contains(&(env.clone() as i32));
let all_env = s.environments.iter()
.find(|e|
NetworkEnvironment::from_i32(**e)
.map(|e| e.is_all())
.unwrap_or(false
)
).is_some();
let allow_all = all_env && !env.local_debug();
env_match || allow_all
})
.collect_vec()
}
fn get_seeds_csv() -> Vec<Seed> {
let activation_time = 0;
let contents = if current_time_millis() < activation_time {
include_str!("resources/seeds/seeds-old.csv")
} else {
include_str!("resources/seeds/seeds.csv")
};
let csv_records = parse_seeds_csv_resource(contents);
csv_records.iter().map(|r| {
let mut s = Seed::default();
s.external_address = r.external_address.clone();
s.environments = vec![NetworkEnvironment::parse(r.network_environment.clone()) as i32];
let mut t = TrustData::default();
t.with_label(r.score);
s.trust = vec![t];
s
}).collect_vec()
}
#[test]
fn debug() {
}