mirror of
https://github.com/YGGverse/Yoda.git
synced 2025-02-05 07:54:14 +00:00
implement separated handler for request
This commit is contained in:
parent
225b13270a
commit
6f16ccaa2d
@ -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
|
||||||
|
@ -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!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
src/app/browser/window/tab/item/page/client/request/error.rs
Normal file
16
src/app/browser/window/tab/item/page/client/request/error.rs
Normal 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"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user