mod templates;
#[cfg(test)]
mod tests;
use crate::error::ExtensionError;
use crate::validate::{validate_extension_name, validate_spdx_license};
#[derive(Debug, Clone)]
pub struct ScaffoldConfig {
pub name: String,
pub description: String,
pub version: String,
pub license: String,
pub maintainer: String,
pub github_repo: String,
pub excluded_platforms: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct GeneratedFile {
pub path: String,
pub content: String,
}
pub fn generate_scaffold(config: &ScaffoldConfig) -> Result<Vec<GeneratedFile>, ExtensionError> {
validate_extension_name(&config.name)?;
crate::validate::validate_extension_version(&config.version)?;
validate_spdx_license(&config.license)?;
for platform in &config.excluded_platforms {
crate::validate::validate_platform(platform)?;
}
let files = vec![
GeneratedFile {
path: "Cargo.toml".to_string(),
content: templates::generate_cargo_toml(config),
},
GeneratedFile {
path: "Makefile".to_string(),
content: templates::generate_makefile(config),
},
GeneratedFile {
path: "extension_config.cmake".to_string(),
content: templates::generate_extension_config_cmake(config),
},
GeneratedFile {
path: "src/lib.rs".to_string(),
content: templates::generate_lib_rs(config),
},
GeneratedFile {
path: "src/wasm_lib.rs".to_string(),
content: templates::generate_wasm_lib(),
},
GeneratedFile {
path: "description.yml".to_string(),
content: templates::generate_description_yml(config),
},
GeneratedFile {
path: format!("test/sql/{}.test", config.name),
content: templates::generate_sqllogictest(config),
},
GeneratedFile {
path: ".github/workflows/extension-ci.yml".to_string(),
content: templates::generate_extension_ci(config),
},
GeneratedFile {
path: ".gitmodules".to_string(),
content: templates::generate_gitmodules(),
},
GeneratedFile {
path: ".gitignore".to_string(),
content: templates::generate_gitignore(),
},
GeneratedFile {
path: ".cargo/config.toml".to_string(),
content: templates::generate_cargo_config(),
},
];
Ok(files)
}