mod args;
mod provider;
mod error;
mod interface;
use crate::args::{Args, RecordCmds};
use crate::provider::build_dns_provider;
use crate::error::Error;
use crate::interface::{interface_list, interface_or_value};
fn fetch_key(file_name: String) -> Result<String, Error> {
use std::fs::File;
use std::io::prelude::*;
let mut f = File::open(file_name)?;
let mut s = String::with_capacity(64);
f.read_to_string(&mut s)?;
Ok(String::from(s.trim()))
}
fn main() -> Result<(), Error> {
let args = Args::args();
match args {
Err(err) => {
eprintln!("{}", err);
},
Ok(param) => { match param {
Args::Record{provider, key, domain, cmd} => {
let key = fetch_key(key)?;
let provider = build_dns_provider(provider, key, domain)?;
match cmd {
RecordCmds::Add{
sub_domain, record_type, record_line, value, interface
} => {
let value = interface_or_value(interface, value)?;
eprintln!("value: {}", value);
let id = provider.add_record(
&sub_domain,
&record_type,
&record_line,
&value,
)?;
print!("{}", id);
},
RecordCmds::List{offset, length, sub_domain} => {
let records = provider.list_record(
offset,
length,
sub_domain.as_ref()
)?;
for record in records {
println!("{}", record);
}
},
RecordCmds::Modify{
record_id, sub_domain, record_type, record_line, value, interface
} => {
let value = interface_or_value(interface, value)?;
provider.modify_record(
record_id,
sub_domain.as_ref(),
&record_type,
&record_line,
&value
)?;
},
RecordCmds::Delete{record_id} => {
provider.delete_record(record_id)?;
},
}
},
Args::Interface{interface} => {
for (n, i) in interface_list(interface)? {
eprintln!("{}: {}", n, i);
}
}
};}
};
Ok(())
}