use crate::{fsys::event::InputFilter, input::Event};
use std::sync::mpsc::{Sender, channel};
use tracing::error;
#[derive(Debug)]
pub struct Message {
pub req: Req,
pub tx: Sender<Result<String, String>>,
}
impl Message {
pub(super) fn send(req: Req, etx: &Sender<Event>) -> Result<String, String> {
let (tx, rx) = channel();
let evt = Event::Message(Self { req, tx });
if let Err(e) = etx.send(evt) {
error!("error sending message from fsys to main thread: {e}");
}
match rx.recv() {
Ok(res) => res,
Err(e) => {
let err = format!("error receiving message from main thread: {e}");
error!("{err}");
Err(err)
}
}
}
}
#[derive(Debug, Clone)]
pub enum Req {
ControlMessage {
msg: String,
},
MinibufferSelect {
prompt: Option<String>,
lines: String,
tx: Sender<String>,
},
ReadBufferName {
id: usize,
},
ReadBufferDot {
id: usize,
},
ReadBufferXDot {
id: usize,
},
ReadBufferAddr {
id: usize,
},
ReadBufferXAddr {
id: usize,
},
ReadBufferBody {
id: usize,
},
ReadBufferFtype {
id: usize,
},
SetBufferName {
id: usize,
s: String,
},
SetBufferDot {
id: usize,
s: String,
},
SetBufferXDot {
id: usize,
s: String,
},
SetBufferAddr {
id: usize,
s: String,
},
SetBufferXAddr {
id: usize,
s: String,
},
ClearBufferBody {
id: usize,
},
AppendBufferBody {
id: usize,
s: String,
},
AppendOutput {
id: usize,
s: String,
},
AddInputEventFilter {
id: usize,
filter: InputFilter,
},
RemoveInputEventFilter {
id: usize,
},
LoadInBuffer {
id: usize,
txt: String,
},
ExecuteInBuffer {
id: usize,
txt: String,
},
}