use std::path::Path;
use serde_json::Value;
use super::down;
use crate::state::{Link, Open, Said};
use crate::ui::Channel;
pub fn tick(link: &Link, root: &Path) {
let standing = link.standing();
for channel in &standing.channels {
read(
link,
down(link, root, channel, &crate::verbs::workspaces()),
channel,
);
if standing.standing(&Open::Queue) {
read(
link,
down(link, root, channel, &crate::verbs::attention()),
channel,
);
}
}
let Some((channel, aim)) = standing.aimed() else {
return;
};
aimed(
link,
root,
&channel,
&crate::verbs::conversations(aim.address.clone()),
);
if standing.standing(&Open::Tuning) {
aimed(
link,
root,
&channel,
&crate::verbs::roles(aim.address.clone()),
);
}
if standing.standing(&Open::Login(standing.signin())) {
aimed(
link,
root,
&channel,
&crate::verbs::providers(aim.address.clone()),
);
}
let Some(conversation) = standing.conversation.clone() else {
return;
};
aimed(
link,
root,
&channel,
&crate::verbs::transcript(aim.address.clone(), conversation.clone()),
);
if standing.standing(&Open::Records) {
aimed(
link,
root,
&channel,
&crate::verbs::steps(aim.address.clone(), conversation.clone()),
);
aimed(
link,
root,
&channel,
&crate::verbs::files(aim.address, conversation),
);
}
}
fn aimed(link: &Link, root: &Path, channel: &Channel, envelope: &Value) {
let asked = crate::seat::route(root, envelope)
.map_err(crate::channel::Reach::Unsent)
.and_then(|(open, carried)| open.ask(&carried));
match asked {
Ok(stream) => super::file(link, channel, stream),
Err(reach) => read(link, Err(reach), channel),
}
}
fn read(link: &Link, leg: Result<(), crate::channel::Reach>, channel: &Channel) {
if let Err(reach) = leg {
link.heard(channel, Said::Unreachable(reach.said()));
}
}
#[cfg(test)]
mod tests;