handle undefined scheme route

This commit is contained in:
yggverse 2025-01-22 05:32:23 +02:00
parent 5570b6fa85
commit 130f66deff

View file

@ -9,7 +9,7 @@ use feature::Feature;
use gtk::{ use gtk::{
gio::Cancellable, gio::Cancellable,
glib::{Uri, UriFlags}, glib::{Uri, UriFlags},
prelude::CancellableExt, prelude::{CancellableExt, EntryExt},
}; };
use std::{cell::Cell, rc::Rc}; use std::{cell::Cell, rc::Rc};
use subject::Subject; use subject::Subject;
@ -30,6 +30,7 @@ impl Client {
page: page.clone(), page: page.clone(),
tab_page: tab_page.clone(), tab_page: tab_page.clone(),
}); });
Self { Self {
cancellable: Cell::new(Cancellable::new()), cancellable: Cell::new(Cancellable::new()),
driver: Rc::new(Driver::build(&subject)), driver: Rc::new(Driver::build(&subject)),
@ -45,8 +46,26 @@ impl Client {
// run async resolver to detect Uri, scheme-less host, or search query // run async resolver to detect Uri, scheme-less host, or search query
lookup(request, self.cancellable(), { lookup(request, self.cancellable(), {
let driver = self.driver.clone(); let driver = self.driver.clone();
move |feature, cancellable, uri| { let subject = self.subject.clone();
route(driver, feature, cancellable, uri, is_snap_history) // route by scheme parsed
move |feature, cancellable, uri| match uri.scheme().as_str() {
"gemini" => driver
.gemini
.handle(uri, feature, cancellable, is_snap_history),
scheme => {
// no scheme match driver, complete with failure message
let status = subject.page.content.to_status_failure();
status.set_description(Some(&format!("Scheme `{scheme}` yet not supported")));
subject.page.title.replace(status.title());
subject
.page
.navigation
.request
.widget
.entry
.set_progress_fraction(0.0);
subject.tab_page.set_loading(false);
}
} }
}) })
} }
@ -120,22 +139,6 @@ fn lookup(
} }
} }
/// Route request (resolved by `lookup` function)
fn route(
driver: Rc<Driver>,
feature: Feature,
cancellable: Cancellable,
uri: Uri,
is_snap_history: bool,
) {
match uri.scheme().as_str() {
"gemini" => driver
.gemini
.handle(uri, feature, cancellable, is_snap_history),
_ => todo!(),
}
}
/// Convert `query` to default search provider [Uri](https://docs.gtk.org/glib/struct.Uri.html) /// Convert `query` to default search provider [Uri](https://docs.gtk.org/glib/struct.Uri.html)
fn search(query: &str) -> Uri { fn search(query: &str) -> Uri {
Uri::build( Uri::build(