2016-07-15 8 views
0

Ich habe alle meine Daten in einem Vektor gesammelt und ich muss eine TOML-Datei mit diesen Daten erstellen. Ich habe es geschafft, eine Datei zu erstellen, und zu öffnen:Wie erstelle ich eine TOML-Datei von Rust?

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

Mein vector<(string,(string, u32))> enthält die folgenden Daten, die wie folgt in TomL aussehen sollte.

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

[server.B] 
...... 

Ich habe eine Menge Daten, die in TOML geschrieben werden müssen und ich weiß, dass TOML eine Textdatei ist. Wie wird der Encoder verwendet?

+0

Willkommen bei Stack Overflow! Bitte [bearbeiten] Sie Ihre Frage, um uns zu zeigen, was Sie versucht haben; [es wird erwartet, dass Sie eine gute Menge an Anstrengung zeigen] (http://meta.stackoverflow.com/q/261592/155423), wenn Sie eine Frage stellen; Dies ist kein Dienst, bei dem Menschen Code für Sie kostenlos schreiben! – Shepmaster

+0

Beachten Sie auch, dass 'vector <(string, (string, u32))>' kein gültiger Typ ist, zumindest unter Verwendung der Standardbibliothek. Wenn Sie Typen verwenden, die nicht in der Standardbibliothek enthalten sind, müssen Sie diese in Ihre Frage aufnehmen. Sie sollten ein [MCVE] erstellen, mit dem die Leute Ihr Problem besser verstehen und Ihnen helfen können. – Shepmaster

Antwort

4

Dies verwendet die TOML crate für die Struktur und Serialisierung. Der Hauptvorteil besteht darin, dass Werte ordnungsgemäß maskiert werden sollten.

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!"); 
}