2016-07-15 32 views
0

我已經將所有數據收集到一個向量中,並且需要使用該數據創建一個TOML文件。我已成功地創建和打開文件:如何從Rust創建TOML文件?

let mut file = try!(File::create("servers.toml")); 

vector<(string,(string, u32))>包含以下數據,這些數據應該是這樣的TOML。

[server.A] 
Ipaddr="192.168.4.1" 
Port no=4476 

[server.B] 
...... 

我有很多數據需要寫在TOML中,我知道TOML是一個文本文件。編碼器如何使用?

+0

歡迎來到Stack Overflow!請[編輯]你的問題向我們展示你的嘗試; [預計你會表現出很大的努力](http://meta.stackoverflow.com/q/261592/155423)提問時;這不是一項服務,人們將免費爲您編寫代碼! – Shepmaster

+0

還要注意'vector <(string,(string,u32))>'不是一個有效的類型,至少使用標準庫。如果您使用的是標準庫中找不到的類型,則需要在您的問題中包含該類型。你應該製作一個[MCVE],讓人們更好地理解你的問題並幫助你。 – Shepmaster

回答

4

這使用TOML crate作爲結構和序列化。主要好處是值應該適當地逃脫。

extern crate toml; 

use toml::Value; 
use std::collections::BTreeMap; 
use std::io::prelude::*; 

fn to_toml(v: Vec<(String, (String, u32))>) -> Value { 
    let mut servers = BTreeMap::new(); 
    for (name, (ip_addr, port)) in v { 
     let mut server = BTreeMap::new(); 
     server.insert("Ipaddr".into(), Value::String(ip_addr)); 
     server.insert("Port no".into(), Value::Integer(port as i64)); 
     servers.insert(name, Value::Table(server)); 
    } 

    let mut map = BTreeMap::new(); 
    map.insert("server".into(), Value::Table(servers)); 
    Value::Table(map) 
} 

fn main() { 
    let v = vec![("A".into(), ("192.168.4.1".into(), 4476)), 
       ("B".into(), ("192.168.4.8".into(), 1234))]; 

    let toml_string = toml::encode_str(&to_toml(v)); 
    println!("{}", toml_string); 

    let mut file = std::fs::File::create("servers.toml").unwrap(); 
    file.write_all(toml_string.as_bytes()).expect("Could not write to file!"); 
}