use super::{input_translate, output_translate};
use crate::{
cin_implements::common::CommandGeneratorJava,
runtimes::{CommandGenerator, CommandVm, CommandVmRuntime},
};
use anyhow::Result;
use nar_dev_utils::manipulate;
use navm::{
cmd::Cmd,
vm::{VmLauncher, VmRuntime},
};
use std::path::PathBuf;
#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct OpenNARS {
command_generator: CommandGeneratorJava,
initial_volume: Option<usize>,
}
impl OpenNARS {
pub fn new(jar_path: impl Into<PathBuf>) -> Self {
Self {
command_generator: CommandGeneratorJava::new(jar_path),
..Default::default()
}
}
}
impl VmLauncher for OpenNARS {
type Runtime = CommandVmRuntime;
fn launch(self) -> Result<CommandVmRuntime> {
let command_java = self.command_generator.generate_command();
let mut vm = manipulate!(
CommandVm::from(command_java)
=> .input_translator(input_translate)
=> .output_translator(output_translate)
)
.launch()?;
if let Some(volume) = self.initial_volume {
if let Err(e) = vm.input_cmd(Cmd::VOL(volume)) {
println!("无法设置初始音量「{volume}」:{e}");
}
};
Ok(vm)
}
}