const fs = require("fs");
const path = require("path");
const cp = require("child_process");
const snowballDir = path.join(__dirname, "../../snowball/");
const snowballBinary = path.join(snowballDir, "./snowball");
const thisSnowballDir = path.join(__dirname, "./src/snowball/");
const algorithmDir = path.join(snowballDir, "algorithms/");
const algorithms = fs.readdirSync(algorithmDir).filter(a => a.endsWith(".sbl")).map(a => {
let name = a.split('.')[0];
return { file: a, low: name, high: name.replace(/^(\w)/, c => c.toUpperCase()) };
});
const rustTemplate = (algorithms) => {
return `
${algorithms.map(a => `#[cfg(feature = "${a.low}")]\npub mod ${a.low};`).join('\n')}
pub enum Algorithm {
${algorithms.map(a => ` #[cfg(feature = "${a.low}")]\n ${a.high},`).join('\n')}
}
impl From<Algorithm> for fn(&mut super::SnowballEnv) -> bool {
fn from(lang: Algorithm) -> Self {
match lang {
${algorithms.map(a => ` #[cfg(feature = "${a.low}")]\n Algorithm::${a.high} => ${a.low}::stem,`).join('\n')}
}
}
}`;
}
fs.rmSync(thisSnowballDir, { recursive: true, force: true });
fs.mkdirSync(thisSnowballDir);
fs.cpSync(path.join(snowballDir, "rust/src/snowball"), thisSnowballDir, { recursive: true });
fs.writeFileSync(path.join(__dirname, "./src/snowball/algorithms/mod.rs"), rustTemplate(algorithms));
algorithms.forEach(algorithm => {
cp.execSync(`${snowballBinary} ${path.join(algorithmDir, algorithm.file)} -o src/snowball/algorithms/${algorithm.low} -rust`, {
stdio: "inherit",
cwd: __dirname
});
})
console.log(algorithms.map(a => `${a.low} = []`).join('\n'));
console.log(`---\n^ These features need to be added to Cargo.toml`);