use clap::{Parser as clapParser, builder::Str};
use std::{
cell::RefCell, fs::File, io::Read, rc::Rc, path::Path
};
use ::ospl::ospl::{
interpreter::Context, parser::Parser, *
};
use ospm::packages;
#[derive(clapParser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
#[arg(short='r', long, default_value="")]
run: String,
#[arg(short='i', long, default_value="")]
install: String,
#[arg(short='l', long)]
local: bool,
#[arg(short='d', long, default_value="")]
remove: String,
#[arg(short='q', long, default_value="")]
query: String,
}
fn runfile(path: String, target: &str) {
let ctx: Rc<RefCell<Context>> = Rc::new(RefCell::new(Context::new(None)));
let p = &mut Parser::new(&path);
let mut file: File;
if Path::new(&path).is_dir() {
file = File::open(format!("{}/main.ospl", path)).expect("file not found!");
} else {
file = File::open(path).expect("file not found!");
}
let mut s = String::new();
file.read_to_string(&mut s).expect("failed to read file!");
match target.as_ref() {
"stmts" => parser::stmts(ctx.clone(), p, &s),
"block" => parser::block(ctx.clone(), p, &s),
"stmt" => parser::stmt(ctx.clone(), p, &s),
"expr" => parser::expr(ctx.clone(), p, &s),
_ => panic!("unknown target")
}
}
fn main() {
let args = Args::parse();
if args.run != "" {
runfile(args.run, "stmts");
} else if args.install != "" {
println!("tring to install package '{}'... ", args.install);
let package_name = packages::open_package(args.install, args.local).expect("error installing the package!");
println!("done! package {} installed (version {})", package_name["package"]["name"], package_name["package"]["version"]);
} else if args.remove != "" {
packages::remove_package(args.remove);
} else if args.query != "" {
let query = packages::query_package(args.query);
println!("{}", query)
}
}