track Status change timestamp

This commit is contained in:
yggverse 2025-01-15 04:23:59 +02:00
parent d3d85e3672
commit 3f67c93c3d
2 changed files with 40 additions and 19 deletions

View File

@ -1,10 +1,12 @@
mod redirect; mod redirect;
mod status; mod status;
// Children dependencies
use redirect::Redirect; use redirect::Redirect;
use status::Status; use status::Status;
use gtk::{gio::Cancellable, prelude::CancellableExt}; // Global dependencies
use gtk::{gio::Cancellable, glib::DateTime, prelude::CancellableExt};
use std::{ use std::{
cell::{Cell, RefCell}, cell::{Cell, RefCell},
rc::Rc, rc::Rc,
@ -43,7 +45,7 @@ impl Client {
Self { Self {
cancellable: Cell::new(Cancellable::new()), cancellable: Cell::new(Cancellable::new()),
redirect: Rc::new(Redirect::new()), redirect: Rc::new(Redirect::new()),
status: Rc::new(RefCell::new(Status::Cancellable)), // e.g. "ready to use" status: Rc::new(RefCell::new(Status::Cancellable(now()))), // e.g. "ready to use"
gemini: gemini::Client::new(), gemini: gemini::Client::new(),
} }
} }
@ -57,9 +59,9 @@ impl Client {
let previous = self.cancellable.replace(cancellable.clone()); let previous = self.cancellable.replace(cancellable.clone());
if !previous.is_cancelled() { if !previous.is_cancelled() {
previous.cancel(); previous.cancel();
self.status.replace(Status::Cancelled); self.status.replace(Status::Cancelled(now()));
} else { } else {
self.status.replace(Status::Cancellable); self.status.replace(Status::Cancellable(now()));
} }
// Done // Done
@ -71,13 +73,20 @@ impl Client {
/// Begin new request /// Begin new request
/// * the `query` as string, to support system routing requests (e.g. `source:`) /// * the `query` as string, to support system routing requests (e.g. `source:`)
pub fn request(&self, query: &str) { pub fn request(&self, query: &str) {
self.status.replace(Status::Request(query.to_string())); self.status
.replace(Status::Request((now(), query.to_string())));
// Forcefully prevent infinitive redirection // Forcefully prevent infinitive redirection
// * this condition just to make sure that client will never stuck by driver implementation issue // * this condition just to make sure that client will never stuck by driver implementation issue
if self.redirect.count() > redirect::LIMIT { if self.redirect.count() > redirect::LIMIT {
self.status.replace(Status::RedirectLimit(redirect::LIMIT)); self.status
.replace(Status::RedirectLimit((now(), redirect::LIMIT)));
// @TODO return; // @TODO return;
} }
} }
} }
/// Get current [DateTime](https://docs.gtk.org/glib/struct.DateTime.html)
fn now() -> DateTime {
DateTime::now_local().unwrap() // @TODO handle?
}

View File

@ -1,36 +1,48 @@
use gtk::glib::{DateTime, GString};
use std::fmt::{Display, Formatter, Result}; use std::fmt::{Display, Formatter, Result};
/// Local `Client` status /// Local `Client` status
/// * not same as the Gemini status! /// * not same as the Gemini status!
pub enum Status { pub enum Status {
/// Ready to use (or cancel from outside) /// Ready to use (or cancel from outside)
Cancellable, Cancellable(DateTime),
/// Operation cancelled, new `Cancellable` required to continue /// Operation cancelled, new `Cancellable` required to continue
Cancelled, Cancelled(DateTime),
/// Redirection count limit reached by protocol driver or global settings /// Redirection count limit reached by protocol driver or global settings
RedirectLimit(usize), RedirectLimit((DateTime, usize)),
/// New `request` begin /// New `request` begin
Request(String), Request((DateTime, String)),
} }
impl Display for Status { impl Display for Status {
fn fmt(&self, f: &mut Formatter) -> Result { fn fmt(&self, f: &mut Formatter) -> Result {
match self { match self {
Self::Cancellable => { Self::Cancellable(t) => {
write!(f, "Ready to use (or cancel from outside)")
}
Self::Cancelled => {
write!( write!(
f, f,
"Operation cancelled, new `Cancellable` required to continue" "[{}] Ready to use (or cancel from outside)",
format_time(t)
) )
} }
Self::RedirectLimit(count) => { Self::Cancelled(t) => {
write!(f, "Redirection count limit ({count}) reached by protocol driver or global settings") write!(
f,
"[{}] Operation cancelled, new `Cancellable` required to continue",
format_time(t)
)
} }
Self::Request(value) => { Self::RedirectLimit((t, count)) => {
write!(f, "Request `{value}`...") write!(f, "[{}] Redirection count limit ({count}) reached by protocol driver or global settings",
format_time(t))
}
Self::Request((t, value)) => {
write!(f, "[{}] Request `{value}`...", format_time(t))
} }
} }
} }
} }
/// Format given [DateTime](https://docs.gtk.org/glib/struct.DateTime.html)
fn format_time(t: &DateTime) -> GString {
t.format_iso8601().unwrap() // @TODO handle?
}