mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-04-01 17:15:28 +00:00
reorganize request routing
This commit is contained in:
parent
d87057a544
commit
b6e1ae4e6a
11 changed files with 329 additions and 527 deletions
|
|
@ -1,45 +1,59 @@
|
|||
pub mod feature;
|
||||
pub use feature::Feature;
|
||||
mod feature;
|
||||
mod gemini;
|
||||
|
||||
use super::{Client, Response};
|
||||
use feature::Feature;
|
||||
use gtk::{
|
||||
gio::Cancellable,
|
||||
glib::{Priority, Uri},
|
||||
glib::{Uri, UriFlags},
|
||||
};
|
||||
|
||||
/// Request data wrapper for `Client`
|
||||
#[derive(Clone)]
|
||||
pub struct Request {
|
||||
pub feature: Feature,
|
||||
/// Requests chain in order to process redirection rules
|
||||
pub referrer: Vec<Request>,
|
||||
/// Single `Request` API for multiple `Client` drivers
|
||||
pub enum Request {
|
||||
Gemini {
|
||||
feature: Feature,
|
||||
referrer: Vec<Self>,
|
||||
uri: Uri,
|
||||
},
|
||||
Titan(Uri),
|
||||
}
|
||||
|
||||
impl Request {
|
||||
// Constructors
|
||||
// Actions
|
||||
|
||||
/// Build new `Self`
|
||||
pub fn build(
|
||||
/// Process request by routed driver
|
||||
pub fn route(
|
||||
client: &Client,
|
||||
query: &str,
|
||||
referrer: Option<Vec<Request>>,
|
||||
referrer: Option<Vec<Self>>,
|
||||
cancellable: Cancellable,
|
||||
priority: Priority,
|
||||
) -> Self {
|
||||
Self {
|
||||
feature: Feature::build(query, cancellable, priority),
|
||||
referrer: referrer.unwrap_or_default(),
|
||||
callback: impl FnOnce(Response) + 'static,
|
||||
) {
|
||||
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(()),
|
||||
)),
|
||||
},
|
||||
Err(_) => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
// Getters
|
||||
|
||||
/// Copy `Self` to new `referrer` vector
|
||||
pub fn to_referrer(&self) -> Vec<Request> {
|
||||
let mut referrer = self.referrer.to_vec();
|
||||
referrer.push(self.clone());
|
||||
referrer
|
||||
}
|
||||
|
||||
pub fn uri(&self) -> Option<&Uri> {
|
||||
self.feature.uri()
|
||||
/// Get reference to `Self` [URI](https://docs.gtk.org/glib/struct.Uri.html)
|
||||
pub fn as_uri(&self) -> &Uri {
|
||||
match self {
|
||||
Self::Gemini {
|
||||
feature: _,
|
||||
referrer: _,
|
||||
uri,
|
||||
}
|
||||
| Self::Titan(uri) => &uri,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue