use super::error::{ProfileError, ProfileResult};
use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ProfileManifest {
pub name: String,
pub version: String,
#[serde(default)]
pub provider: Option<String>,
#[serde(default)]
pub files: Vec<String>,
}
impl ProfileManifest {
pub fn provider_name(&self) -> &str {
self.provider.as_deref().unwrap_or(&self.name)
}
}
impl ProfileManifest {
pub fn from_file(path: &Path) -> ProfileResult<Self> {
let content = std::fs::read_to_string(path)?;
Self::from_json(&content)
}
pub fn from_json(json: &str) -> ProfileResult<Self> {
let mut manifest: Self = serde_json::from_str(json)?;
manifest.files.retain(|f| !f.is_empty());
manifest.validate()?;
Ok(manifest)
}
fn validate(&self) -> ProfileResult<()> {
if self.name.is_empty() {
return Err(ProfileError::InvalidManifest {
reason: "Profile name cannot be empty".to_string(),
});
}
if self.version.is_empty() {
return Err(ProfileError::InvalidManifest {
reason: "Profile version cannot be empty".to_string(),
});
}
Ok(())
}
}