mod enums;
use config::{Config, File, FileFormat};
use serde::{Deserialize, Serialize};
use std::env;
pub use crate::enums::{Categories, PluginType};
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub struct PluginMetadata {
pub vendor: String,
pub categories: Option<Vec<Categories>>,
pub plugin_type: Option<PluginType>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[serde(default)]
#[non_exhaustive]
pub struct PluginProcessing {
pub block_size: usize,
}
impl Default for PluginProcessing {
fn default() -> Self {
Self { block_size: 512 }
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Metadata {
pub metadata: PluginMetadata,
#[serde(default)]
pub processing: PluginProcessing,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[serde(default)]
pub struct PackageInfo {
pub name: String,
pub version: String,
pub description: Option<String>,
pub authors: Option<Vec<String>>,
}
impl Default for PackageInfo {
fn default() -> Self {
let authors = match env::var("CARGO_PKG_AUTHORS").ok() {
Some(authors) if authors.is_empty() => None,
Some(authors) => Some(authors.split(':').map(|s| s.trim().to_string()).collect()),
None => None,
};
Self {
name: env::var("CARGO_PKG_NAME").unwrap(),
version: env::var("CARGO_PKG_VERSION").unwrap(),
description: env::var("CARGO_PKG_DESCRIPTION").ok(),
authors,
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ShizenConfig {
pub shizen: Metadata,
#[serde(default)]
pub package: PackageInfo,
}
impl ShizenConfig {
pub fn new() -> Result<Self, config::ConfigError> {
let conf = Config::builder()
.add_source(File::new("Shizen.toml", FileFormat::Toml))
.build()?
.try_deserialize()?;
Ok(conf)
}
}