feat: cli

This commit is contained in:
2026-01-02 03:13:44 +08:00
parent aab3b3d5c0
commit def1e26e7a
5 changed files with 77 additions and 3 deletions

1
Cargo.lock generated
View File

@@ -1019,7 +1019,6 @@ name = "nix-js"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bumpalo",
"deno_core", "deno_core",
"derive_more", "derive_more",
"hashbrown 0.16.1", "hashbrown 0.16.1",

View File

@@ -1,4 +1,4 @@
//! This crate provides procedural macros for the nixjit project. //! This crate provides procedural macros for the nix-js project.
use proc_macro::TokenStream; use proc_macro::TokenStream;
mod ir; mod ir;

View File

@@ -11,7 +11,6 @@ anyhow = "1.0"
rustyline = "14.0" rustyline = "14.0"
regex = "1.11" regex = "1.11"
bumpalo = { version = "3.19", features = ["boxed"] }
hashbrown = "0.16" hashbrown = "0.16"
derive_more = { version = "2", features = ["full"] } derive_more = { version = "2", features = ["full"] }
thiserror = "2" thiserror = "2"

23
nix-js/src/bin/eval.rs Normal file
View File

@@ -0,0 +1,23 @@
use std::process::exit;
use anyhow::Result;
use nix_js::context::Context;
fn main() -> Result<()> {
let mut args = std::env::args();
if args.len() != 2 {
eprintln!("Usage: {} expr", args.next().unwrap());
exit(1);
}
args.next();
let expr = args.next().unwrap();
match Context::new().eval(&expr) {
Ok(value) => {
println!("{value}");
Ok(())
},
Err(err) => {
eprintln!("Error: {err}");
Err(anyhow::anyhow!("{err}"))
},
}
}

53
nix-js/src/bin/repl.rs Normal file
View File

@@ -0,0 +1,53 @@
use anyhow::Result;
use regex::Regex;
use rustyline::DefaultEditor;
use rustyline::error::ReadlineError;
use nix_js::context::Context;
fn main() -> Result<()> {
let mut rl = DefaultEditor::new()?;
let mut context = Context::new();
let re = Regex::new(r"^\s*([a-zA-Z_][a-zA-Z0-9_'-]*)\s*=(.*)$").unwrap();
loop {
let readline = rl.readline("nix-js-repl> ");
match readline {
Ok(line) => {
if line.trim().is_empty() {
continue;
}
let _ = rl.add_history_entry(line.as_str());
if let Some(_caps) = re.captures(&line) {
eprintln!("Error: binding not implemented yet");
continue;
/* let ident = caps.get(1).unwrap().as_str();
let expr = caps.get(2).unwrap().as_str().trim();
if expr.is_empty() {
eprintln!("Error: missing expression after '='");
continue;
}
if let Err(err) = context.add_binding(ident, expr) {
eprintln!("Error: {}", err);
} */
} else {
match context.eval(&line) {
Ok(value) => println!("{value}"),
Err(err) => eprintln!("Error: {err}"),
}
}
}
Err(ReadlineError::Interrupted) => {
println!();
}
Err(ReadlineError::Eof) => {
println!("CTRL-D");
break;
}
Err(err) => {
eprintln!("Error: {err:?}");
break;
}
}
}
Ok(())
}