extern crate lazy_static;
use anyhow::Context;
use fehler::throw;
use serde::Deserialize;
use std::{env, fs, io, path::PathBuf};
use thiserror::Error;
pub const CARGO_TOML: &str = "Cargo.toml";
pub const TRDELNIK_TOML: &str = "Trdelnik.toml";
pub const ANCHOR_TOML: &str = "Anchor.toml";
#[derive(Error, Debug)]
pub enum Error {
#[error("invalid workspace")]
BadWorkspace,
#[error("{0:?}")]
Anyhow(#[from] anyhow::Error),
#[error("{0:?}")]
Io(#[from] io::Error),
#[error("{0:?}")]
Toml(#[from] toml::de::Error),
}
#[derive(Debug, Deserialize, Clone)]
pub struct Test {
pub validator_startup_timeout: u64,
}
#[derive(Default, Debug, Deserialize, Clone)]
struct _Test {
#[serde(default)]
pub validator_startup_timeout: Option<u64>,
}
impl From<_Test> for Test {
fn from(_t: _Test) -> Self {
Self {
validator_startup_timeout: _t.validator_startup_timeout.unwrap_or(10_000),
}
}
}
#[derive(Debug, Deserialize, Clone)]
pub struct Config {
pub test: Test,
}
#[derive(Default, Debug, Deserialize, Clone)]
struct _Config {
#[serde(default)]
pub test: Option<_Test>,
}
impl From<_Config> for Config {
fn from(_c: _Config) -> Self {
Self {
test: _c.test.unwrap_or_default().into(),
}
}
}
impl Config {
pub fn new() -> Self {
let root = Config::discover_root().expect("failed to find the root folder");
let s = fs::read_to_string(root.join(TRDELNIK_TOML).as_path())
.expect("failed to read the Trdelnik config file");
let _config: _Config =
toml::from_str(&s).expect("failed to parse the Trdelnik config file");
_config.into()
}
pub fn discover_root() -> Result<PathBuf, Error> {
let current_dir = env::current_dir()?;
let mut dir = Some(current_dir.as_path());
while let Some(cwd) = dir {
for file in std::fs::read_dir(cwd).with_context(|| {
format!("Error reading the directory with path: {}", cwd.display())
})? {
let path = file
.with_context(|| {
format!("Error reading the directory with path: {}", cwd.display())
})?
.path();
if let Some(filename) = path.file_name() {
if filename.to_str() == Some(ANCHOR_TOML) {
return Ok(PathBuf::from(cwd));
}
}
}
dir = cwd.parent();
}
throw!(Error::BadWorkspace)
}
}
lazy_static::lazy_static! {
pub static ref CONFIG: Config = Config::new();
}