feat: cli
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
23
nix-js/src/bin/eval.rs
Normal 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
53
nix-js/src/bin/repl.rs
Normal 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(())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user