1 use std::env;
2 use std::io;
3 use std::io::prelude::*;
4
5 use serde_json::Value as Json;
6 use toml::Value as Toml;
7
main()8 fn main() {
9 let mut args = env::args();
10 let input = if args.len() > 1 {
11 let name = args.nth(1).unwrap();
12 std::fs::read_to_string(name).unwrap()
13 } else {
14 let mut input = String::new();
15 io::stdin().read_to_string(&mut input).unwrap();
16 input
17 };
18
19 match input.parse() {
20 Ok(toml) => {
21 let json = convert(toml);
22 println!("{}", serde_json::to_string_pretty(&json).unwrap());
23 }
24 Err(error) => println!("failed to parse TOML: {}", error),
25 }
26 }
27
convert(toml: Toml) -> Json28 fn convert(toml: Toml) -> Json {
29 match toml {
30 Toml::String(s) => Json::String(s),
31 Toml::Integer(i) => Json::Number(i.into()),
32 Toml::Float(f) => {
33 let n = serde_json::Number::from_f64(f).expect("float infinite and nan not allowed");
34 Json::Number(n)
35 }
36 Toml::Boolean(b) => Json::Bool(b),
37 Toml::Array(arr) => Json::Array(arr.into_iter().map(convert).collect()),
38 Toml::Table(table) => {
39 Json::Object(table.into_iter().map(|(k, v)| (k, convert(v))).collect())
40 }
41 Toml::Datetime(dt) => Json::String(dt.to_string()),
42 }
43 }
44