implement separated handler for request

This commit is contained in:
yggverse 2025-01-18 13:43:06 +02:00
parent 225b13270a
commit 6f16ccaa2d
4 changed files with 62 additions and 20 deletions

View File

@ -73,7 +73,9 @@ impl Client {
time: now(), time: now(),
value: query.to_string(), 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 /// Get new [Cancellable](https://docs.gtk.org/gio/class.Cancellable.html) by cancel previous one

View File

@ -1,7 +1,9 @@
mod error;
mod feature; mod feature;
mod gemini; mod gemini;
use super::{Client, Response}; use super::{Client, Response};
use error::Error;
use feature::Feature; use feature::Feature;
use gtk::{ use gtk::{
gio::Cancellable, gio::Cancellable,
@ -19,27 +21,49 @@ pub enum Request {
} }
impl Request { impl Request {
// Actions // Constructors
/// Process request by routed driver /// Create new `Self` from string
pub fn route( pub fn parse(query: &str, referrer: Option<Vec<Self>>) -> Result<Self, Error> {
client: &Client,
query: &str,
referrer: Option<Vec<Self>>,
cancellable: Cancellable,
callback: impl FnOnce(Response) + 'static,
) {
let (feature, request) = Feature::parse(query); let (feature, request) = Feature::parse(query);
match Uri::parse(request, UriFlags::NONE) { match Uri::parse(request, UriFlags::NONE) {
Ok(uri) => match uri.scheme().as_str() { Ok(uri) => match uri.scheme().as_str() {
"gemini" => gemini::route(client, feature, uri, referrer, cancellable, callback), "gemini" => Ok(Self::Gemini {
"titan" => todo!(), feature,
_ => callback(Response::Redirect( referrer: referrer.unwrap_or_default(),
todo!(), //super::response::Redirect::Foreground(()), 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!(),
} }
} }

View File

@ -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"),
}
}
}

View File

@ -9,7 +9,7 @@ pub fn route(
client: &Client, client: &Client,
feature: Feature, feature: Feature,
uri: Uri, uri: Uri,
referrer: Option<Vec<Request>>, referrer: Vec<Request>,
cancellable: Cancellable, cancellable: Cancellable,
callback: impl FnOnce(Response) + 'static, callback: impl FnOnce(Response) + 'static,
) { ) {
@ -57,7 +57,7 @@ fn handle(
response: ggemini::client::connection::Response, response: ggemini::client::connection::Response,
base: Uri, base: Uri,
cancellable: Cancellable, cancellable: Cancellable,
referrer: Option<Vec<Request>>, referrer: Vec<Request>,
feature: Feature, feature: Feature,
callback: impl FnOnce(Response) + 'static, callback: impl FnOnce(Response) + 'static,
) { ) {
@ -123,7 +123,7 @@ fn handle(
Status::Redirect => callback(redirect( Status::Redirect => callback(redirect(
response.meta.data, response.meta.data,
base, base,
referrer.unwrap_or_default(), // @TODO referrer,
cancellable, cancellable,
Priority::DEFAULT, Priority::DEFAULT,
false, false,
@ -132,7 +132,7 @@ fn handle(
Status::PermanentRedirect => callback(redirect( Status::PermanentRedirect => callback(redirect(
response.meta.data, response.meta.data,
base, base,
referrer.unwrap_or_default(), // @TODO referrer,
cancellable, cancellable,
Priority::DEFAULT, Priority::DEFAULT,
true, true,