use crate::error::{BuildError, Result};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::Path;
#[derive(Deserialize, Serialize)]
pub struct ManifestConfig {
pub project: ProjectSection,
pub build: BuildSection,
pub dependencies: BTreeMap<String, DependencySpec>,
}
#[derive(Deserialize, Serialize)]
pub struct ProjectSection {
pub name: String,
pub version: String,
pub authors: Vec<String>,
pub authors_email: Vec<String>,
pub c_standard: Option<String>,
}
#[derive(Deserialize, Serialize)]
pub struct BuildSection {
pub compiler: CompilerKind,
pub warnings: WarningLevel,
pub cflags: Vec<String>,
}
#[derive(Deserialize, Serialize)]
pub struct DependencySpec {
pub git: Option<String>,
pub path: Option<String>,
pub tag: Option<String>,
pub build_system: BuildSystemKind,
#[serde(default)]
pub build_commands: Vec<String>,
#[serde(default)]
pub extra_includes: Vec<String>,
#[serde(default)]
pub libs: Vec<String>,
}
#[derive(Debug, Deserialize, Serialize, Default, PartialEq, Eq)]
pub enum BuildSystemKind {
#[default]
Auto,
Cmake,
Meson,
Make,
Custom,
}
#[derive(Deserialize, Serialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum CompilerKind {
#[default]
Auto,
Gcc,
Tcc,
Clang,
}
#[derive(Deserialize, Serialize, Default)]
pub enum WarningLevel {
None,
#[default]
Standard,
Strict,
}
impl ManifestConfig {
pub fn load(project_dir: &Path) -> Result<Self> {
let manifest_path = project_dir.join("smidr.toml");
if !manifest_path.exists() {
return Err(BuildError::ManifestNotFound(manifest_path));
}
let text = std::fs::read_to_string(&manifest_path)?;
let config: ManifestConfig = toml::from_str(&text)?;
Ok(config)
}
pub fn to_toml_string(&self) -> Result<String> {
Ok(toml::to_string_pretty(self)?)
}
}