89 lines
2.5 KiB
Rust
89 lines
2.5 KiB
Rust
mod cli_opts;
|
|
mod formatters;
|
|
mod source;
|
|
|
|
use std::{
|
|
collections::HashMap,
|
|
fs::File,
|
|
io::{BufRead, BufReader, BufWriter, Write},
|
|
};
|
|
|
|
use clap::Parser;
|
|
use color_eyre::Result;
|
|
|
|
use crate::{
|
|
cli_opts::{FormatterOpt, Opts},
|
|
source::Source,
|
|
};
|
|
|
|
fn main() -> Result<()> {
|
|
color_eyre::install()?;
|
|
let opts: Opts = Opts::parse();
|
|
|
|
let sources = parse_sources_config_file(&opts.sources_file);
|
|
|
|
let mut contents = String::new();
|
|
let ipv4_addr = opts.ipv4_address;
|
|
let ipv6_addr = opts.ipv6_address;
|
|
let formatter = opts.formatter;
|
|
for source in sources.keys() {
|
|
if let Some(s) = sources.get(source) {
|
|
let raw_data = match formatter {
|
|
FormatterOpt::Dnsmasq => s.format_to_dnsmasq(&ipv4_addr, &ipv6_addr),
|
|
FormatterOpt::DnsmasqServer => s.format_to_dnsmasq_server(),
|
|
FormatterOpt::Unbound => s.format_to_unbound(&ipv4_addr, &ipv6_addr),
|
|
};
|
|
println!("INFO: {}: {} entries", source, raw_data.len());
|
|
contents.push_str(raw_data.join("\n").as_str());
|
|
}
|
|
}
|
|
if let Some(val) = opts.output {
|
|
let write_file = File::create(val).unwrap();
|
|
let mut writer = BufWriter::new(&write_file);
|
|
match write!(&mut writer, "{contents}") {
|
|
Ok(()) => {}
|
|
Err(e) => eprintln!("{e}"),
|
|
};
|
|
} else {
|
|
println!("{contents}");
|
|
};
|
|
Ok(())
|
|
}
|
|
|
|
fn parse_sources_config_file(filepath: &str) -> HashMap<String, Source> {
|
|
let mut list: HashMap<String, Source> = HashMap::new();
|
|
if let Ok(file) = File::open(filepath) {
|
|
BufReader::new(file)
|
|
.lines()
|
|
.map_while(Result::ok)
|
|
.for_each(|line| {
|
|
let vec: Vec<&str> = line.split('|').collect();
|
|
list.insert(
|
|
vec[0].to_owned(),
|
|
Source {
|
|
url: vec[1].to_owned(),
|
|
},
|
|
);
|
|
});
|
|
} else {
|
|
eprintln!("Problem opening file: {filepath}");
|
|
};
|
|
list
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::parse_sources_config_file;
|
|
|
|
#[test]
|
|
fn test_parse_sources_config_file() {
|
|
let source_config = parse_sources_config_file("test_data/sample_config");
|
|
assert!(source_config.contains_key("StevenBlack"));
|
|
assert!(source_config.get("StevenBlack").is_some());
|
|
assert_eq!(
|
|
source_config.get("StevenBlack").unwrap().url,
|
|
*"https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts",
|
|
);
|
|
}
|
|
}
|