use super::{Aim, Model};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Login {
pub following: Option<String>,
pub asking: Option<String>,
}
impl Model {
pub fn begin_login(&mut self) {
if self.aim.is_some() {
self.login = Some(Login::default());
}
}
pub fn close_login(&mut self) {
self.login = None;
}
pub fn following(&self) -> Option<String> {
self.login.as_ref()?.following.clone()
}
pub fn post_signin(&mut self, provider: &str) {
let Some(pane) = self.login.as_mut() else {
return;
};
pane.following = Some(provider.to_owned());
self.signin = None;
self.aimed_act(&crate::verbs::login, provider);
}
pub fn post_offering(&mut self, provider: &str) {
let Some(pane) = self.login.as_mut() else {
return;
};
pane.asking = Some(provider.to_owned());
self.offered = None;
let Some(Aim { address, .. }) = self.aim.clone() else {
return;
};
self.outbox.push(super::Posted::read(crate::verbs::models(
address,
provider.to_owned(),
)));
}
fn aimed_act(&mut self, gesture: &dyn Fn(String, String) -> serde_json::Value, provider: &str) {
let Some(Aim { address, .. }) = self.aim.clone() else {
return;
};
self.outbox
.push(super::Posted::act(gesture(address, provider.to_owned())));
}
pub fn elsewhere(&self) -> bool {
let Some(aim) = self.aim.as_ref() else {
return false;
};
self.roster
.iter()
.find(|chunk| chunk.channel.name == aim.channel)
.is_some_and(|chunk| chunk.channel.named_there.is_some())
}
pub(super) fn retire_login(&mut self) {
self.login = None;
self.providers = None;
self.offered = None;
self.signin = None;
}
}
#[cfg(test)]
mod tests;