接前一期的toml文件,我这次用rust实现读取。我用的rust版本是1.41.0。程序写法可能与老的rust有差别。请使用老版本rust的读者注意。
use serde_derive::Deserialize;
use toml::value::*;
use std::fs::File;
use std::io::prelude::*;
#[derive(Deserialize)]
#[derive(Debug)]
struct Owner {
name : String,
organization : String,
bio : String,
dob : Datetime,
}
#[derive(Deserialize)]
#[derive(Debug)]
struct Database {
server : String,
ports : Array,
connection_max : toml::Value,
enabled : toml::Value,
}
#[derive(Deserialize)]
#[derive(Debug)]
struct Server {
ip : String,
dc : String,
}
#[derive(Deserialize)]
#[derive(Debug)]
struct Servers {
alpha : Server,
beta : Server,
}
#[derive(Deserialize)]
#[derive(Debug)]
struct Clients {
data : Array,
}
#[derive(Deserialize)]
#[derive(Debug)]
struct Config {
title : String,
hosts : Array,
owner : Owner,
database : Database,
servers : Servers,
clients : Clients,
}
fn main() {
let file_path = "sample.toml";
let mut file = match File::open(file_path) {
Ok(f) => f,
Err(e) => panic!("no such file {} exception:{}", file_path, e)
};
let mut str_val = String::new();
match file.read_to_string(&mut str_val) {
Ok(s) => s
,
Err(e) => panic!("Error Reading file: {}", e)
};
let config : Config = toml::from_str(&str_val).unwrap();
println!("\"Title\" = {}", config.title);
let ct = config.hosts.len();
let mut p = 1;
println!("\"hosts\" = [");
for h in config.hosts {
print!("\t");
print!("{}",h.as_str().unwrap());
if p < ct {
p = p + 1;
println!(",");
} else {
println!("");
}
}
println!("]");
println!("\"owner\".\"name\" = {}", config.owner.name);
println!("\"owner\".\"organization\" = {}", config.owner.organization);
println!("\"owner\".\"bio\" = {}", config.owner.bio);
println!("\"owner\".\"dob\" = {}", config.owner.dob);
println!("\"database\".\"server\" = {}", config.database.server);
let ps = config.database.ports.len();
p = 1;
println!("\"database\".\"ports\" = [");
for q in config.database.ports {
print!("\t {}", q.as_integer().unwrap());
if p < ps {
p = p + 1;
println!(",");
} else {
println!("");
}
}
println!("]");
println!("\"servers\".\"alpha\".\"ip\" = {}", config.servers.alpha.ip);
println!("\"servers\".\"alpha\".\"dc\" = {}", config.servers.alpha.dc);
println!("\"servers\".\"beta\".\"ip\" = {}", config.servers.beta.ip);
println!("\"servers\".\"beta\".\"dc\" = {}", config.servers.beta.dc);
let als = config.clients.data.len();
p = 1;
println!("\"clients\".\"data\" = [");
for al in config.clients.data {
if al.is_array() {
let su = al.as_array().unwrap();
let suc = su.len();
let mut sp = 1;
println!("\t[");
for sai in su {
if sai.is_str() {
print!("\t\t{}", sai.as_str().unwrap());
} else {
print!("\t\t{}", sai.as_integer().unwrap());
}
if sp < suc {
sp = sp + 1;
println!(",");
} else {
println!("");
}
}
print!("\t]");
if p < als {
p = p + 1;
println!(",");
} else {
println!("");
}
}
}
println!("]");
}
Cargo.toml文件如下:
[package]
name = "toml_sample"
version = "0.1.0"
authors = ["许阳 "]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
toml = "0.5.6"
serde_derive = "1.0.104"
serde = "1.0.104"
datetime = "0.4.7"
运行结果如下:
示例代码仓库