From 6f16ccaa2decc4349c7601c0fb3d401a43d80a05 Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 18 Jan 2025 13:43:06 +0200 Subject: [PATCH] implement separated handler for request --- .../browser/window/tab/item/page/client.rs | 4 +- .../window/tab/item/page/client/request.rs | 54 +++++++++++++------ .../tab/item/page/client/request/error.rs | 16 ++++++ .../tab/item/page/client/request/gemini.rs | 8 +-- 4 files changed, 62 insertions(+), 20 deletions(-) create mode 100644 src/app/browser/window/tab/item/page/client/request/error.rs diff --git a/src/app/browser/window/tab/item/page/client.rs b/src/app/browser/window/tab/item/page/client.rs index a3fe395f..113ff074 100644 --- a/src/app/browser/window/tab/item/page/client.rs +++ b/src/app/browser/window/tab/item/page/client.rs @@ -73,7 +73,9 @@ impl Client { time: now(), value: query.to_string(), }); - Request::route(self, query, None, self.new_cancellable(), callback); + Request::parse(query, None) + .unwrap() // @TODO + .handle(self, self.new_cancellable(), callback); } /// Get new [Cancellable](https://docs.gtk.org/gio/class.Cancellable.html) by cancel previous one diff --git a/src/app/browser/window/tab/item/page/client/request.rs b/src/app/browser/window/tab/item/page/client/request.rs index 759a65ea..056bd1d9 100644 --- a/src/app/browser/window/tab/item/page/client/request.rs +++ b/src/app/browser/window/tab/item/page/client/request.rs @@ -1,7 +1,9 @@ +mod error; mod feature; mod gemini; use super::{Client, Response}; +use error::Error; use feature::Feature; use gtk::{ gio::Cancellable, @@ -19,27 +21,49 @@ pub enum Request { } impl Request { - // Actions + // Constructors - /// Process request by routed driver - pub fn route( - client: &Client, - query: &str, - referrer: Option>, - cancellable: Cancellable, - callback: impl FnOnce(Response) + 'static, - ) { + /// Create new `Self` from string + pub fn parse(query: &str, referrer: Option>) -> Result { let (feature, request) = Feature::parse(query); match Uri::parse(request, UriFlags::NONE) { Ok(uri) => match uri.scheme().as_str() { - "gemini" => gemini::route(client, feature, uri, referrer, cancellable, callback), - "titan" => todo!(), - _ => callback(Response::Redirect( - todo!(), //super::response::Redirect::Foreground(()), - )), + "gemini" => Ok(Self::Gemini { + feature, + referrer: referrer.unwrap_or_default(), + uri, + }), + "titan" => Ok(Self::Titan(uri)), + _ => Err(Error::Unsupported), }, - Err(_) => todo!(), + Err(e) => Err(Error::Glib(e)), + } + } + + // Actions + + /// Handle `Self` request + pub fn handle( + self, + client: &Client, + cancellable: Cancellable, + callback: impl FnOnce(Response) + 'static, + ) { + match self { + Self::Gemini { + feature, + referrer, + uri, + } => gemini::route( + client, + feature.clone(), + uri.clone(), + referrer, + cancellable, + callback, + ), + Self::Titan(_) => todo!(), } } diff --git a/src/app/browser/window/tab/item/page/client/request/error.rs b/src/app/browser/window/tab/item/page/client/request/error.rs new file mode 100644 index 00000000..903e8724 --- /dev/null +++ b/src/app/browser/window/tab/item/page/client/request/error.rs @@ -0,0 +1,16 @@ +use std::fmt::{Display, Formatter, Result}; + +#[derive(Debug)] +pub enum Error { + Glib(gtk::glib::Error), + Unsupported, +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter) -> Result { + match self { + Self::Glib(e) => write!(f, "{e}"), + Self::Unsupported => write!(f, "Request not supported"), + } + } +} diff --git a/src/app/browser/window/tab/item/page/client/request/gemini.rs b/src/app/browser/window/tab/item/page/client/request/gemini.rs index 2df0cdd7..bb8b9822 100644 --- a/src/app/browser/window/tab/item/page/client/request/gemini.rs +++ b/src/app/browser/window/tab/item/page/client/request/gemini.rs @@ -9,7 +9,7 @@ pub fn route( client: &Client, feature: Feature, uri: Uri, - referrer: Option>, + referrer: Vec, cancellable: Cancellable, callback: impl FnOnce(Response) + 'static, ) { @@ -57,7 +57,7 @@ fn handle( response: ggemini::client::connection::Response, base: Uri, cancellable: Cancellable, - referrer: Option>, + referrer: Vec, feature: Feature, callback: impl FnOnce(Response) + 'static, ) { @@ -123,7 +123,7 @@ fn handle( Status::Redirect => callback(redirect( response.meta.data, base, - referrer.unwrap_or_default(), // @TODO + referrer, cancellable, Priority::DEFAULT, false, @@ -132,7 +132,7 @@ fn handle( Status::PermanentRedirect => callback(redirect( response.meta.data, base, - referrer.unwrap_or_default(), // @TODO + referrer, cancellable, Priority::DEFAULT, true,