use std::path::PathBuf;
use crate::session::{self, VersioningFlags};
#[derive(clap::Args)]
pub struct Args {
#[arg(long, default_value_t = 0)]
pub port: u16,
#[arg(long, default_value = "127.0.0.1")]
pub bind: String,
#[arg(long = "src-path", value_name = "DIR")]
pub src_paths: Vec<PathBuf>,
#[arg(long)]
pub gc_soft_limit_mb: Option<usize>,
#[arg(long)]
pub gc_hard_limit_mb: Option<usize>,
}
pub fn run(args: Args, versioning: VersioningFlags) -> miette::Result<i32> {
let Args {
port,
bind,
src_paths,
gc_soft_limit_mb,
gc_hard_limit_mb,
} = args;
let gc_config = session::build_gc_config(gc_soft_limit_mb, gc_hard_limit_mb);
let globals = session::setup_globals(src_paths, gc_config, versioning);
let addr: std::net::SocketAddr = format!("{bind}:{port}")
.parse()
.map_err(|e| miette::miette!("invalid bind address {bind}:{port}: {e}"))?;
let config = cljrs_nrepl::Config {
addr,
port_file: Some(PathBuf::from(".nrepl-port")),
};
let server = cljrs_nrepl::start(config, globals)?;
println!(
"nREPL server started on port {0} on host {bind} - nrepl://{bind}:{0}",
server.port()
);
server.serve_with(session::eval_form)?;
Ok(0)
}