mod cmd;
mod embedded;
mod project;
mod template;
use anyhow::Result;
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(
name = "nova",
about = "The Nova programming language toolchain",
version
)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand)]
enum Command {
Parse(cmd::parse::ParseCmd),
Run(cmd::run::RunCmd),
Build(cmd::run::BuildCmd),
Check(cmd::run::CheckCmd),
Test(cmd::test::TestCmd),
Fmt(cmd::fmt::FmtCmd),
Doc(cmd::doc::DocCmd),
Lsp,
New(cmd::new::NewCmd),
Init(cmd::new::InitCmd),
Add(cmd::deps::AddCmd),
Remove(cmd::deps::RemoveCmd),
Fetch,
Update(cmd::fetch::UpdateCmd),
Login,
Package,
Publish,
Version,
}
fn main() -> Result<()> {
let cli = Cli::parse();
let filter = tracing_subscriber::EnvFilter::from_default_env()
.add_directive(tracing::Level::WARN.into());
if matches!(cli.command, Command::Lsp) {
tracing_subscriber::fmt()
.with_env_filter(filter)
.with_writer(std::io::stderr)
.init();
} else {
tracing_subscriber::fmt().with_env_filter(filter).init();
}
nova_driver::set_embedded_runtime(embedded::runtime());
match cli.command {
Command::Parse(cmd) => cmd::parse::run(cmd),
Command::Run(cmd) => cmd::run::run(cmd),
Command::Build(cmd) => cmd::run::build(cmd),
Command::Check(cmd) => cmd::run::check(cmd),
Command::Test(cmd) => cmd::test::run(cmd),
Command::Fmt(cmd) => std::process::exit(cmd::fmt::run(cmd)),
Command::Doc(cmd) => cmd::doc::run(cmd),
Command::Lsp => std::process::exit(cmd::lsp::run()),
Command::New(cmd) => cmd::new::new(cmd),
Command::Init(cmd) => cmd::new::init(cmd),
Command::Add(cmd) => cmd::deps::add(cmd),
Command::Remove(cmd) => cmd::deps::remove(cmd),
Command::Fetch => cmd::fetch::fetch(),
Command::Update(cmd) => cmd::fetch::update(cmd),
Command::Login => cmd::login::login(),
Command::Package => cmd::package::package(),
Command::Publish => cmd::package::publish(),
Command::Version => cmd::version::run(),
}
}