use bytesize::ByteSize; use figment::{ error::Result, providers::{Env, Format, Serialized, Toml}, value::{Dict, Map}, Figment, Metadata, Profile, Provider, }; use serde::{Deserialize, Serialize}; use std::path::PathBuf; #[derive(Debug, Clone, Deserialize, Serialize)] pub struct Config { pub quota: ByteSize, pub pool_name: String, pub mountpoint: PathBuf, } impl Default for Config { fn default() -> Self { Config { quota: ByteSize::gb(16), pool_name: String::from("pool"), mountpoint: PathBuf::from("/srv"), } } } impl Config { pub fn from(provider: T) -> Result { Figment::from(provider).extract() } pub fn figment() -> Figment { Figment::from(Config::default()) .merge(Toml::file(Env::var_or("ZFS_CONFIG", "ZFS.toml")).nested()) .merge(Env::prefixed("ZFS_").global()) } } impl Provider for Config { fn metadata(&self) -> Metadata { Metadata::named("ZFS Config") } fn data(&self) -> Result> { Serialized::defaults(Config::default()).data() } }