const MAIN: &str = concat!(
"fn greeting() -> String { \"Hello, Nova!\" }\n",
"\n",
"fn main() { println(greeting()) }\n",
"\n",
"@test\n",
"fn greeting_says_hello() { assert_eq(greeting(), \"Hello, Nova!\") }\n",
);
const LIB: &str = concat!(
"pub fn greeting() -> String { \"Hello, Nova!\" }\n",
"\n",
"@test\n",
"fn greeting_says_hello() { assert_eq(greeting(), \"Hello, Nova!\") }\n",
);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Kind {
Program,
Library,
}
pub fn files(name: &str, kind: Kind) -> Vec<(String, String)> {
let mut files = vec![
(
"nova.toml".to_string(),
format!(
"[package]\nname = \"{name}\"\nversion = \"0.1.0\"\nedition = \"2026\"\n\n\
[dependencies]\n"
),
),
(".gitignore".to_string(), "/target\n".to_string()),
];
match kind {
Kind::Program => {
files.push((
"README.md".to_string(),
format!(
"# {name}\n\n`nova run` builds and runs `src/main.nova`; `nova test` runs \
its tests.\n"
),
));
files.push(("src/main.nova".to_string(), MAIN.to_string()));
}
Kind::Library => {
let import = nova_pm::import_name(name);
files.push((
"README.md".to_string(),
format!(
"# {name}\n\nA library: other packages import it as `import {import}`. \
`nova test` runs the tests in `src/lib.nova` and `tests/`.\n"
),
));
files.push(("src/lib.nova".to_string(), LIB.to_string()));
files.push((
format!("tests/{import}_test.nova"),
format!(
"import {import}\n\n@test\n\
fn greeting_is_public() {{ assert_eq(greeting(), \"Hello, Nova!\") }}\n"
),
));
}
}
files
}