//! Tool configuration. use log::debug; use serde::Deserialize; use std::default::Default; use std::fs; use std::path::{Path, PathBuf}; /// Configuration from configuration file. #[derive(Default, Debug, Deserialize)] pub struct Configuration { /// Base image, if provided. pub default_base_image: Option, /// Default size of new VM image, in GiB. pub default_image_gib: Option, /// Default memory to give to new VM, in MiB. pub default_memory_mib: Option, /// Default number of CPUs for a new VM. pub default_cpus: Option, /// Should host certificates be generated for new VMs? pub default_generate_host_certificate: Option, /// Should new VM be started automatically on host boot? pub default_autostart: Option, /// Directory where new VM images should be created, if given. pub image_directory: Option, /// List of path names of SSH public keys to put into the default /// user's `authorized_keys` file. pub authorized_keys: Option>, /// Path name to SSH CA key for creating SSH host certificates. pub ca_key: Option, } /// Errors from this module. #[derive(Debug, thiserror::Error)] pub enum ConfigurationError { /// Error reading configuration file. #[error("couldn't read configuration file {0}")] ReadError(PathBuf, #[source] std::io::Error), /// YAML parsing error. #[error(transparent)] YamlError(#[from] serde_yaml::Error), } impl Configuration { /// Read configuration from named file. pub fn from_file(filename: &Path) -> Result { if filename.exists() { debug!("reading configuration file {}", filename.display()); let config = fs::read(filename) .map_err(|err| ConfigurationError::ReadError(filename.to_path_buf(), err))?; let config: Configuration = serde_yaml::from_slice(&config)?; debug!("config: {:#?}", config); Ok(config) } else { Ok(Self::default()) } } }