use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TemplateMeta {
pub name: String,
pub version: String,
pub description: String,
pub required_variables: Vec<String>,
}
impl TemplateMeta {
pub fn new(
name: impl Into<String>,
version: impl Into<String>,
description: impl Into<String>,
required_variables: Vec<String>,
) -> Self {
Self {
name: name.into(),
version: version.into(),
description: description.into(),
required_variables,
}
}
pub fn missing_variables(&self, provided: &[&str]) -> Vec<String> {
self.required_variables
.iter()
.filter(|req| !provided.iter().any(|p| p == req))
.cloned()
.collect()
}
}
#[derive(Debug, Clone)]
pub struct SourceFile {
pub path: String,
pub content: String,
}
#[derive(Debug, Clone)]
pub struct MigrationFile {
pub name: String,
pub content: String,
}
#[derive(Debug, Clone)]
pub struct PluginSkeleton {
pub plugin_name: String,
pub template_type: String,
pub source_files: Vec<SourceFile>,
pub migrations: Vec<MigrationFile>,
pub manifest: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_template_meta_new() {
let meta = TemplateMeta::new(
"crud",
"1.0.0",
"CRUD plugin template",
vec!["plugin_name".to_string(), "table_name".to_string()],
);
assert_eq!(meta.name, "crud");
assert_eq!(meta.version, "1.0.0");
assert_eq!(meta.required_variables.len(), 2);
}
#[test]
fn test_template_meta_serialize_deserialize() {
let meta = TemplateMeta::new(
"crud",
"1.0.0",
"CRUD plugin template",
vec!["plugin_name".to_string()],
);
let json = serde_json::to_string(&meta).expect("serialize failed");
let deserialized: TemplateMeta = serde_json::from_str(&json).expect("deserialize failed");
assert_eq!(meta, deserialized);
}
#[test]
fn test_missing_variables_all_provided() {
let meta = TemplateMeta::new(
"crud",
"1.0.0",
"",
vec!["plugin_name".to_string(), "table_name".to_string()],
);
let provided = vec!["plugin_name", "table_name"];
let missing = meta.missing_variables(&provided);
assert!(missing.is_empty());
}
#[test]
fn test_missing_variables_some_missing() {
let meta = TemplateMeta::new(
"crud",
"1.0.0",
"",
vec![
"plugin_name".to_string(),
"table_name".to_string(),
"fields".to_string(),
],
);
let provided = vec!["plugin_name"];
let missing = meta.missing_variables(&provided);
assert_eq!(missing.len(), 2);
assert!(missing.contains(&"table_name".to_string()));
assert!(missing.contains(&"fields".to_string()));
}
}