use citadel_io::tokio::time::Instant;
use crate::proto::packet::packet_flags;
use citadel_crypt::ratchets::Ratchet;
pub struct RegisterState<R: Ratchet> {
pub(crate) last_stage: u8,
pub(crate) constructor: Option<R::Constructor>,
pub(crate) created_ratchet: Option<R>,
pub(crate) last_packet_time: Option<Instant>,
pub(crate) passwordless: Option<bool>,
}
impl<R: Ratchet> Default for RegisterState<R> {
fn default() -> Self {
Self {
last_stage: 0,
constructor: None,
created_ratchet: None,
last_packet_time: None,
passwordless: None,
}
}
}
impl<R: Ratchet> RegisterState<R> {
pub fn on_fail(&mut self) {
self.last_stage = packet_flags::cmd::aux::do_register::FAILURE;
self.constructor = None;
self.on_register_packet_received();
}
pub fn on_register_packet_received(&mut self) {
self.last_packet_time = Some(Instant::now());
}
}
impl<R: Ratchet> From<u8> for RegisterState<R> {
fn from(stage: u8) -> Self {
Self {
last_stage: stage,
..Default::default()
}
}
}