1
0
mirror of https://github.com/NLnetLabs/routinator.git synced 2024-05-19 06:50:04 +00:00

Now also with JSON output.

This commit is contained in:
Martin Hoffmann
2018-07-06 16:05:28 +02:00
parent 5163021609
commit 5b8aa51d66

View File

@ -86,6 +86,7 @@ fn main() -> Result<(), ProcessingError> {
match matches.value_of("outform").unwrap_or("csv") { match matches.value_of("outform").unwrap_or("csv") {
"csv" => output_csv(roas, &mut output), "csv" => output_csv(roas, &mut output),
"json" => output_json(roas, &mut output),
other => { other => {
error!("unknown output format {}", other); error!("unknown output format {}", other);
Err(ProcessingError::Other) Err(ProcessingError::Other)
@ -120,6 +121,48 @@ fn output_csv<W: io::Write>(
Ok(()) Ok(())
} }
fn output_json<W: io::Write>(
roas: RouteOrigins,
output: &mut W
) -> Result<(), ProcessingError> {
let mut first = true;
writeln!(output, "{{\n \"roas\": [")?;
for roa in roas.drain() {
for addr in roa.v4_addrs().iter() {
if first {
first = false
}
else {
write!(output, ",\n")?;
}
let addr = addr.as_v4();
write!(output,
" {{ \"asn\": \"{}\", \"prefix\": \"{}/{}\", \"maxLength\": {} }}",
roa.as_id(),
addr.address(), addr.address_length(),
addr.max_length()
)?;
}
for addr in roa.v6_addrs().iter() {
if first {
first = false
}
else {
write!(output, ",\n")?;
}
let addr = addr.as_v6();
write!(output,
" {{ \"asn\": \"{}\", \"prefix\": \"{}/{}\", \"maxLength\": {} }}",
roa.as_id(),
addr.address(), addr.address_length(),
addr.max_length()
)?;
}
}
writeln!(output, "\n ]\n}}")?;
Ok(())
}
pub enum FileOrStdout<F, S> { pub enum FileOrStdout<F, S> {
File(F), File(F),
@ -130,7 +173,7 @@ impl FileOrStdout<File, io::Stdout> {
fn open(path: &str) -> Result<Self, io::Error> { fn open(path: &str) -> Result<Self, io::Error> {
match path { match path {
"-" => Ok(FileOrStdout::Stdout(io::stdout())), "-" => Ok(FileOrStdout::Stdout(io::stdout())),
path => File::open(Path::new(path)).map(FileOrStdout::File) path => File::create(Path::new(path)).map(FileOrStdout::File)
} }
} }