sort consistently
This commit is contained in:
parent
14112acea3
commit
4050aeb2dd
1 changed files with 8 additions and 7 deletions
15
src/main.rs
15
src/main.rs
|
@ -1,18 +1,19 @@
|
||||||
use std::io::{self};
|
use std::io::{self};
|
||||||
use std::collections::HashMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let redirects = parse_alias_to_hashmap();
|
let redirects = parse_alias_to_BTreeMap();
|
||||||
let sieve_script = generate_sieve_script(redirects);
|
let sieve_script = generate_sieve_script(redirects);
|
||||||
println!("{}", sieve_script);
|
println!("{}", sieve_script);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_sieve_script(redirects: HashMap<String, Vec<String>>) -> String {
|
fn generate_sieve_script(redirects: BTreeMap<String, Vec<String>>) -> String {
|
||||||
let mut script : String = "require [\"envelope\", \"copy\"];\n".to_string();
|
let mut script : String = "require [\"envelope\", \"copy\"];\n".to_string();
|
||||||
for (redirect, destinations) in redirects {
|
for (redirect, mut destinations) in redirects {
|
||||||
script += format!("if envelope :is \"to\" \"{}\" {{\n{}}}\n", redirect,
|
script += format!("if envelope :is \"to\" \"{}\" {{\n{}}}\n", redirect,
|
||||||
(|| {
|
(|| {
|
||||||
let mut subscript : String = "".to_string();
|
let mut subscript : String = "".to_string();
|
||||||
|
destinations.sort();
|
||||||
for destination in destinations.iter().rev().skip(1).rev() {
|
for destination in destinations.iter().rev().skip(1).rev() {
|
||||||
subscript += format!(" redirect :copy \"{}\";\n", destination).as_str();
|
subscript += format!(" redirect :copy \"{}\";\n", destination).as_str();
|
||||||
}
|
}
|
||||||
|
@ -24,9 +25,9 @@ fn generate_sieve_script(redirects: HashMap<String, Vec<String>>) -> String {
|
||||||
return script;
|
return script;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_alias_to_hashmap() -> HashMap<String, Vec<String>> {
|
fn parse_alias_to_BTreeMap() -> BTreeMap<String, Vec<String>> {
|
||||||
// File must exist in the current path
|
// File must exist in the current path
|
||||||
let mut redirect_map : HashMap<String, Vec<String>> = HashMap::new();
|
let mut redirect_map : BTreeMap<String, Vec<String>> = BTreeMap::new();
|
||||||
let mut destinations : Vec<String> = Vec::new();
|
let mut destinations : Vec<String> = Vec::new();
|
||||||
for line in io::stdin().lines() {
|
for line in io::stdin().lines() {
|
||||||
let line = line.unwrap();
|
let line = line.unwrap();
|
||||||
|
@ -46,7 +47,7 @@ fn parse_alias_to_hashmap() -> HashMap<String, Vec<String>> {
|
||||||
let mut changed = true;
|
let mut changed = true;
|
||||||
while changed {
|
while changed {
|
||||||
changed = false;
|
changed = false;
|
||||||
let mut all_new_redirects : HashMap<String, Vec<String>> = HashMap::new();
|
let mut all_new_redirects : BTreeMap<String, Vec<String>> = BTreeMap::new();
|
||||||
for destination in destinations.iter() {
|
for destination in destinations.iter() {
|
||||||
for forward_to in redirect_map.get(destination).unwrap().iter() {
|
for forward_to in redirect_map.get(destination).unwrap().iter() {
|
||||||
if let Some(new_redirects) = redirect_map.get(forward_to) {
|
if let Some(new_redirects) = redirect_map.get(forward_to) {
|
||||||
|
|
Loading…
Reference in a new issue