use std::io::prelude::*;
use std::{
cell::RefCell,
io::BufReader,
sync::{Arc, Mutex},
time::Duration,
};
use crate::prelude::*;
use interprocess::local_socket::{prelude::*, GenericFilePath, Stream};
use crate::brokers::messenger_broker_proxy_factory::create_messenger_broker_proxy_factory;
use crate::brokers::{
BrokerProxyFactory, MessengerBrokerProxyCore, MessengerBrokerProxyCoreFactory,
};
#[allow(unused)]
pub struct IPCBrokerProxyCore {
name: String,
buf_reader: RefCell<BufReader<Stream>>,
buf_size: usize,
}
impl IPCBrokerProxyCore {
}
pub struct IPCBrokerProxyCoreFactory {
}
impl IPCBrokerProxyCoreFactory {
pub fn new() -> JuizResult<Box<dyn MessengerBrokerProxyCoreFactory>> {
Ok(Box::new(IPCBrokerProxyCoreFactory {}))
}
}
impl MessengerBrokerProxyCoreFactory for IPCBrokerProxyCoreFactory {
fn create_core(&self, object_name: &str) -> JuizResult<Box<dyn MessengerBrokerProxyCore>> {
let name = format!("/tmp/{:}", object_name).to_fs_name::<GenericFilePath>()?;
let buf_size: usize = 4096;
let conn = Stream::connect(name)?;
Ok(Box::new(IPCBrokerProxyCore {
name: object_name.to_owned(),
buf_reader: RefCell::new(BufReader::new(conn)),
buf_size,
}))
}
}
impl MessengerBrokerProxyCore for IPCBrokerProxyCore {
fn send_and_receive(&self, value: CapsuleMap, _timeout: Duration) -> JuizResult<CapsulePtr> {
log::trace!("IPCBrokerProxyCore::send_and_receive(value={value:?}) called");
let mut buffer = String::with_capacity(self.buf_size);
let v: Value = value.into();
let strv = v.to_string() + "\n";
log::trace!(" - payload = {strv:}");
self.buf_reader
.borrow_mut()
.get_mut()
.write_all(strv.as_bytes())?;
self.buf_reader.borrow_mut().read_line(&mut buffer)?;
Ok(juiz_sdk::serde_json::from_str::<Value>(buffer.as_str())?.into())
}
fn send_and_receive_output(
&self,
_v: CapsuleMap,
_timeout: Duration,
) -> JuizResult<CapsulePtr> {
todo!("Outputクラスをどう扱うか。")
}
}
pub fn create_ipc_broker_proxy_factory() -> JuizResult<Arc<Mutex<dyn BrokerProxyFactory>>> {
log::trace!("create_ipc_broker_factory called");
create_messenger_broker_proxy_factory(
"IPCBrokerProxyFactory",
"ipc",
IPCBrokerProxyCoreFactory::new()?,
)
}