#![feature(str_as_str)]
use rumtk_core::core::RUMResult;
use rumtk_core::strings::{RUMArrayConversions, RUMString};
use rumtk_core::types::RUMCLIParser;
use rumtk_core::{rumtk_deserialize, rumtk_read_stdin, rumtk_serialize, rumtk_write_stdout};
use rumtk_hl7_v2::hl7_v2_parser::v2_parser::{rumtk_format, V2Message};
use rumtk_hl7_v2::{rumtk_v2_generate_message, rumtk_v2_parse_message};
#[derive(RUMCLIParser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct RUMTKInterfaceArgs {
#[arg(short, long, default_value_t = 1)]
threads: usize,
#[arg(short, long)]
pretty: bool,
#[arg(short, long)]
quiet: bool,
#[arg(short, long)]
daemon: bool,
}
fn process_message(args: &RUMTKInterfaceArgs) -> RUMResult<()> {
let stdin_msg = rumtk_read_stdin!()?;
if !stdin_msg.is_empty() {
let out_data = match rumtk_deserialize!(&stdin_msg.as_slice().to_string()?) {
Ok(msg) => {
let parsed_msg: V2Message = msg;
rumtk_v2_generate_message!(&parsed_msg)
}
Err(_) => {
let msg = rumtk_v2_parse_message!(stdin_msg)?;
if !args.quiet {
match rumtk_serialize!(&msg, &args.pretty)?.parse() {
Ok(data) => data,
Err(e) => {
return Err(rumtk_format!(
"Failure to identify and process message in stdin. It might not be a valid V2Message or v2 raw message! => {}", e
));
}
}
} else {
RUMString::default()
}
}
};
rumtk_write_stdout!(&out_data);
}
Ok(())
}
fn process_message_loop(args: &RUMTKInterfaceArgs) {
loop {
match process_message(args) {
Ok(()) => continue,
Err(e) => println!("{}", e), };
}
}
fn main() {
let args = RUMTKInterfaceArgs::parse();
if args.daemon {
process_message_loop(&args);
} else {
process_message(&args).expect("Failed to generate V2 message");
}
}