Files
gemserv/src/config.rs
2020-05-09 20:56:58 -04:00

79 lines
2.1 KiB
Rust

extern crate serde_derive;
extern crate toml;
use std::collections::HashMap;
use toml::de::Error;
use std::io;
use std::path::Path;
#[derive(Debug, Deserialize, Clone)]
pub struct Config {
pub port: u16,
pub host: String,
pub server: Vec<Server>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Server {
pub hostname: String,
pub dir: String,
pub key: String,
pub cert: String,
pub cgi: Option<String>,
pub usrdir: Option<bool>,
pub proxy: Option<Vec<String>>,
}
#[derive(Debug, Clone)]
pub struct ServerCfg {
pub hostname: String,
pub dir: String,
pub key: String,
pub cert: String,
pub cgi: String,
pub usrdir: bool,
pub port: u16,
pub proxy: HashMap<String, String>,
}
impl Config {
pub fn new(file: &Path) -> Result<Config, Error> {
let fd = std::fs::read_to_string(file).unwrap();
let config: Config = toml::from_str(&fd).unwrap();
return Ok(config);
}
pub fn to_map(&self) -> HashMap<String, ServerCfg> {
let mut map = HashMap::new();
for srv in &self.server {
let cgi = match srv.cgi.to_owned() {
Some(c) => c,
None => "".to_string(),
};
let usrdir = match srv.usrdir {
Some(u) => u,
None => false,
};
let mut pmap = HashMap::new();
match &srv.proxy {
Some(pr) => {
for p in pr {
let p: Vec<&str> = p.split("=").collect();
pmap.insert(p[0].trim().to_string(), p[1].trim().to_string());
}
},
None => {},
};
map.insert(srv.hostname.clone(), ServerCfg {
hostname: srv.hostname.clone(),
dir: srv.dir.clone(),
key: srv.key.clone(),
cert: srv.cert.clone(),
cgi: cgi,
usrdir: usrdir,
port: self.port.clone(),
proxy: pmap,
});
}
map
}
}