use std::sync::Arc;
use crate::controller::LLMController;
use tokio_util::sync::CancellationToken;
use super::messages::channels::ToControllerRx;
pub struct InputRouter {
controller: Arc<LLMController>,
from_tui: ToControllerRx,
cancel_token: CancellationToken,
}
impl InputRouter {
pub fn new(
controller: Arc<LLMController>,
from_tui: ToControllerRx,
cancel_token: CancellationToken,
) -> Self {
Self {
controller,
from_tui,
cancel_token,
}
}
pub async fn run(mut self) {
tracing::info!("InputRouter started");
loop {
tokio::select! {
_ = self.cancel_token.cancelled() => {
tracing::info!("InputRouter cancelled");
break;
}
msg = self.from_tui.recv() => {
match msg {
Some(payload) => {
if let Err(e) = self.controller.send_input(payload).await {
tracing::error!("Failed to send input to controller: {}", e);
}
}
None => {
tracing::info!("TUI channel closed");
break;
}
}
}
}
}
tracing::info!("InputRouter stopped");
}
}