pub struct Extensao {
pub origem: &'static str,
pub arquivos: &'static [(&'static str, &'static [u8])],
}
include!(concat!(env!("OUT_DIR"), "/embedded.rs"));
const COMUM: &str = "_comum";
pub fn arquivos_do_preset(preset: &str) -> Vec<(&'static str, &'static [u8])> {
if preset == COMUM {
return Vec::new();
}
let mut arquivos = arquivos_sob(preset);
for (caminho, bytes) in arquivos_sob(COMUM) {
if !arquivos.iter().any(|(existente, _)| *existente == caminho) {
arquivos.push((caminho, bytes));
}
}
arquivos.sort_by_key(|(caminho, _)| *caminho);
arquivos
}
fn arquivos_sob(dir: &str) -> Vec<(&'static str, &'static [u8])> {
let prefixo = format!("{dir}/");
TEMPLATES
.iter()
.filter_map(|(caminho, bytes)| Some((caminho.strip_prefix(&prefixo)?, *bytes)))
.collect()
}
#[cfg(test)]
mod testes {
use super::*;
#[test]
fn comum_nao_e_oferecido_como_preset() {
assert!(arquivos_do_preset(COMUM).is_empty());
assert!(crate::scaffold::PRESETS.iter().all(|p| p.id != COMUM));
}
#[test]
fn presets_herdam_os_arquivos_comuns() {
for p in crate::scaffold::PRESETS {
let arquivos = arquivos_do_preset(p.id);
for esperado in ["gitignore", ".luaurc", "views/scripts/glacier.d.luau"] {
assert!(
arquivos.iter().any(|(c, _)| *c == esperado),
"preset '{}' não herdou '{esperado}'",
p.id
);
}
}
}
}