#![deny(
future_incompatible,
missing_debug_implementations,
nonstandard_style,
rust_2021_compatibility,
unused
)]
use std::{io::Write, process};
use nreplops_tool::{self, *};
fn main() {
if let Err(e) = main1() {
eprintln!("Error: {}", e);
process::exit(1);
}
}
fn main1() -> Result<(), anyhow::Error> {
let args = cli::Args::from_command_line()?;
let conn_expr = args.conn_expr_src.resolve_expr()?;
let sources =
sources::load_sources(&args.source_args[..], &args.template_args[..])?;
if sources.is_empty() {
return Ok(());
}
let conn_routes = conn_expr.resolve_routes()?;
let outputs = outputs::Outputs::try_from_args(&args)?;
let socket = socket::connect(conn_routes)?;
let mut con = nrepl::Connection::new(socket);
con.send(&nrepl::WireRequest {
op: nrepl::Op::Clone.to_string(),
id: "1".into(),
session: None,
ns: None,
code: None,
line: None,
column: None,
file: None,
})?;
let first_resp = con.try_recv()?;
let session = first_resp.new_session.unwrap();
for (ix, input) in sources.into_iter().enumerate() {
let id = format!("eval-{}", ix + 1);
con.send(&nrepl::WireRequest {
op: nrepl::Op::Eval.to_string(),
id: id.clone(),
session: Some(session.clone()),
ns: None,
code: Some(input.content),
line: Some(1),
column: Some(1),
file: input.file,
})?;
loop {
let resp = con.try_recv()?;
if resp.id.as_deref().unwrap_or("") != id {
continue;
}
if let Some(ref s) = resp.value {
if let Some(ref w) = outputs.nrepl_results {
writeln!(w.writer(), "{}", s)?;
}
}
if let Some(ref s) = resp.out {
if let Some(ref w) = outputs.nrepl_stdout {
write!(w.writer(), "{}", s)?;
}
}
if let Some(ref s) = resp.err {
if let Some(ref w) = outputs.nrepl_stderr {
write!(w.writer(), "{}", s)?;
}
}
if resp.has_status("done") {
break;
}
}
}
Ok(())
}