dexr 0.4.3

A directory indexer with thumbnails, previews, and slideshow functionality.
use std::path::PathBuf;

use figment::providers::{Env, Format, Toml};
use figment::Figment;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
pub struct Config {
	pub address: bindable::BindableAddr,
	pub index_root: PathBuf,
	pub thumbnail_tmp: PathBuf,
	#[serde(default)]
	pub log_level: LevelFilter,
	#[serde(default = "default_exclude_dotfiles")]
	pub exclude_dotfiles: bool,
}

const fn default_exclude_dotfiles() -> bool {
	true
}

#[derive(Deserialize, Debug, Default, Clone, Copy)]
#[serde(rename_all = "snake_case")]
pub enum LevelFilter {
	Off,
	Error,
	Warn,
	#[default]
	Info,
	Debug,
	Trace,
}

impl From<LevelFilter> for tracing::level_filters::LevelFilter {
	fn from(level: LevelFilter) -> Self {
		match level {
			LevelFilter::Off => Self::OFF,
			LevelFilter::Error => Self::ERROR,
			LevelFilter::Warn => Self::WARN,
			LevelFilter::Info => Self::INFO,
			LevelFilter::Debug => Self::DEBUG,
			LevelFilter::Trace => Self::TRACE,
		}
	}
}

pub fn load() -> figment::error::Result<Config> {
	Figment::new()
		.merge(Toml::file("dexr.toml"))
		.merge(Env::prefixed("DEXR_"))
		.extract()
}