From 3f67c93c3dd21e8a9a2a7208c4184dc5684769eb Mon Sep 17 00:00:00 2001 From: yggverse Date: Wed, 15 Jan 2025 04:23:59 +0200 Subject: [PATCH] track `Status` change timestamp --- .../browser/window/tab/item/page/client.rs | 21 +++++++--- .../window/tab/item/page/client/status.rs | 38 ++++++++++++------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/app/browser/window/tab/item/page/client.rs b/src/app/browser/window/tab/item/page/client.rs index 298333c3..3a8570f7 100644 --- a/src/app/browser/window/tab/item/page/client.rs +++ b/src/app/browser/window/tab/item/page/client.rs @@ -1,10 +1,12 @@ mod redirect; mod status; +// Children dependencies use redirect::Redirect; use status::Status; -use gtk::{gio::Cancellable, prelude::CancellableExt}; +// Global dependencies +use gtk::{gio::Cancellable, glib::DateTime, prelude::CancellableExt}; use std::{ cell::{Cell, RefCell}, rc::Rc, @@ -43,7 +45,7 @@ impl Client { Self { cancellable: Cell::new(Cancellable::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(), } } @@ -57,9 +59,9 @@ impl Client { let previous = self.cancellable.replace(cancellable.clone()); if !previous.is_cancelled() { previous.cancel(); - self.status.replace(Status::Cancelled); + self.status.replace(Status::Cancelled(now())); } else { - self.status.replace(Status::Cancellable); + self.status.replace(Status::Cancellable(now())); } // Done @@ -71,13 +73,20 @@ impl Client { /// Begin new request /// * the `query` as string, to support system routing requests (e.g. `source:`) 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 // * this condition just to make sure that client will never stuck by driver implementation issue if self.redirect.count() > redirect::LIMIT { - self.status.replace(Status::RedirectLimit(redirect::LIMIT)); + self.status + .replace(Status::RedirectLimit((now(), redirect::LIMIT))); // @TODO return; } } } + +/// Get current [DateTime](https://docs.gtk.org/glib/struct.DateTime.html) +fn now() -> DateTime { + DateTime::now_local().unwrap() // @TODO handle? +} diff --git a/src/app/browser/window/tab/item/page/client/status.rs b/src/app/browser/window/tab/item/page/client/status.rs index 1e0777a0..cf6327a2 100644 --- a/src/app/browser/window/tab/item/page/client/status.rs +++ b/src/app/browser/window/tab/item/page/client/status.rs @@ -1,36 +1,48 @@ +use gtk::glib::{DateTime, GString}; use std::fmt::{Display, Formatter, Result}; /// Local `Client` status /// * not same as the Gemini status! pub enum Status { /// Ready to use (or cancel from outside) - Cancellable, + Cancellable(DateTime), /// Operation cancelled, new `Cancellable` required to continue - Cancelled, + Cancelled(DateTime), /// Redirection count limit reached by protocol driver or global settings - RedirectLimit(usize), + RedirectLimit((DateTime, usize)), /// New `request` begin - Request(String), + Request((DateTime, String)), } impl Display for Status { fn fmt(&self, f: &mut Formatter) -> Result { match self { - Self::Cancellable => { - write!(f, "Ready to use (or cancel from outside)") - } - Self::Cancelled => { + Self::Cancellable(t) => { write!( f, - "Operation cancelled, new `Cancellable` required to continue" + "[{}] Ready to use (or cancel from outside)", + format_time(t) ) } - Self::RedirectLimit(count) => { - write!(f, "Redirection count limit ({count}) reached by protocol driver or global settings") + Self::Cancelled(t) => { + write!( + f, + "[{}] Operation cancelled, new `Cancellable` required to continue", + format_time(t) + ) } - Self::Request(value) => { - write!(f, "Request `{value}`...") + Self::RedirectLimit((t, count)) => { + 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? +}