use clash_starlark::codegen::ast::Stmt;
use clash_starlark::codegen::builder::*;
use crate::ecosystem::EcosystemDef;
pub fn standard_loads(sandbox_presets: &[&str], ecosystems: &[&EcosystemDef]) -> Vec<Stmt> {
let mut stmts = vec![load_builtin()];
let mut sandbox_names: Vec<&str> = sandbox_presets.to_vec();
for eco in ecosystems {
if eco.star_file == "sandboxes.star" {
if let Some(safe) = eco.safe_sandbox {
if !sandbox_names.contains(&safe) {
sandbox_names.push(safe);
}
}
if !sandbox_names.contains(&eco.full_sandbox) {
sandbox_names.push(eco.full_sandbox);
}
}
}
if !sandbox_names.is_empty() {
stmts.push(load_sandboxes(&sandbox_names));
}
for eco in ecosystems {
if eco.star_file == "sandboxes.star" {
continue;
}
let mut names: Vec<&str> = Vec::new();
if let Some(safe) = eco.safe_sandbox {
names.push(safe);
}
names.push(eco.full_sandbox);
stmts.push(load_ecosystem(eco.star_file, &names));
}
stmts
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn standard_loads_with_no_extras() {
let stmts = standard_loads(&[], &[]);
assert_eq!(stmts.len(), 1, "should have just builtin load");
let code = clash_starlark::codegen::serialize(&stmts);
assert!(code.contains("builtin.star"));
}
#[test]
fn standard_loads_with_preset() {
let stmts = standard_loads(&["project"], &[]);
assert_eq!(stmts.len(), 2);
let code = clash_starlark::codegen::serialize(&stmts);
assert!(code.contains("sandboxes.star"));
assert!(code.contains("project"));
}
#[test]
fn standard_loads_with_ecosystem() {
let rust = crate::ecosystem::ECOSYSTEMS
.iter()
.find(|e| e.name == "rust")
.unwrap();
let stmts = standard_loads(&[], &[rust]);
let code = clash_starlark::codegen::serialize(&stmts);
assert!(code.contains("rust.star"));
assert!(code.contains("rust_full"));
}
#[test]
fn standard_loads_deduplicates_sandbox_presets() {
let git = crate::ecosystem::ECOSYSTEMS
.iter()
.find(|e| e.name == "git")
.unwrap();
let stmts = standard_loads(&["project"], &[git]);
let code = clash_starlark::codegen::serialize(&stmts);
let sandboxes_count = code.matches("sandboxes.star").count();
assert_eq!(sandboxes_count, 1, "should have single sandboxes.star load");
}
}