mytilde/src/lib.rs

66 lines
1.4 KiB
Rust

use serde_json::{Value, Map};
use serde::{Deserialize, Serialize};
use std::convert::From;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
enum Aliases {
One(String),
More(Vec<String>),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
enum Domain {
Name(String),
Config(DomainConfig),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
struct DomainConfig {
hostname: String,
alias: Option<Aliases>,
web: Option<Web>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
enum Web {
Template(String),
Config(WebConfig)
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
struct WebConfig {
template: Option<String>,
vars: Map<String,Value>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
struct MyTilde {
domains: Vec<Domain>,
}
#[derive(Debug)]
enum Error {
File(std::io::Error),
Json(serde_json::Error),
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Error {
Error::File(e)
}
}
impl From<serde_json::Error> for Error {
fn from(e: serde_json::Error) -> Error {
Error::Json(e)
}
}
impl MyTilde {
fn from_file<P: AsRef<std::path::Path>>(path: P) -> Result<MyTilde,Error> {
let content = std::fs::read_to_string(path)?;
let json: Value = serde_json::from_str(&content)?;
Ok(serde_json::from_value(json)?)
}
}