• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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