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