mirror of
https://github.com/YGGverse/Yoda.git
synced 2025-03-13 06:01:21 +00:00
define lookup
and search
methods as Request
implementation constructors
This commit is contained in:
parent
d4efcbca37
commit
0f6e54a3ee
@ -86,11 +86,12 @@ impl Client {
|
|||||||
Error::Unsupported => callback(Response::Failure(Failure::Error {
|
Error::Unsupported => callback(Response::Failure(Failure::Error {
|
||||||
message: "Request scheme yet not supported".to_string(),
|
message: "Request scheme yet not supported".to_string(),
|
||||||
})),
|
})),
|
||||||
_ => request::lookup(query, Some(&cancellable), |result| {
|
// try async resolver
|
||||||
|
_ => Request::lookup(query, Some(&cancellable), |result| {
|
||||||
callback(match result {
|
callback(match result {
|
||||||
// redirection with scheme auto-complete or default search provider
|
// redirection with scheme auto-complete or default search provider
|
||||||
Ok(request) => Response::Redirect(Redirect::Foreground(request)),
|
Ok(request) => Response::Redirect(Redirect::Foreground(request)),
|
||||||
// unresolvable request issue
|
// unresolvable request.
|
||||||
Err(e) => Response::Failure(Failure::Error {
|
Err(e) => Response::Failure(Failure::Error {
|
||||||
message: e.to_string(),
|
message: e.to_string(),
|
||||||
}),
|
}),
|
||||||
|
@ -57,6 +57,58 @@ impl Request {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create new `Self` as the search query to default provider
|
||||||
|
/// @TODO
|
||||||
|
// * implement DNS lookup before apply this option
|
||||||
|
// * make search provider optional
|
||||||
|
// * validate request len by gemini specifications
|
||||||
|
pub fn search(query: &str) -> Self {
|
||||||
|
Self::from_uri(search::tgls(query), None, None).unwrap() // no handler as unexpected
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create new `Self` using DNS async resolver (slow method)
|
||||||
|
/// * useful for scheme-less requests, before apply search redirect
|
||||||
|
pub fn lookup(
|
||||||
|
query: &str,
|
||||||
|
cancellable: Option<&Cancellable>,
|
||||||
|
callback: impl FnOnce(Result<Self, Error>) + 'static,
|
||||||
|
) {
|
||||||
|
use gtk::{
|
||||||
|
gio::{NetworkAddress, Resolver},
|
||||||
|
prelude::{NetworkAddressExt, ResolverExt},
|
||||||
|
};
|
||||||
|
|
||||||
|
const DEFAULT_SCHEME: &str = "gemini://";
|
||||||
|
const DEFAULT_PORT: u16 = 1965;
|
||||||
|
const TIMEOUT: u32 = 1000;
|
||||||
|
|
||||||
|
let request = match query.trim().strip_prefix(DEFAULT_SCHEME) {
|
||||||
|
Some(postfix) => format!("{DEFAULT_SCHEME}{postfix}"),
|
||||||
|
None => query.to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let resolver = Resolver::default();
|
||||||
|
resolver.set_timeout(TIMEOUT);
|
||||||
|
|
||||||
|
match NetworkAddress::parse_uri(&request, DEFAULT_PORT) {
|
||||||
|
Ok(connectable) => resolver.lookup_by_name_async(
|
||||||
|
&connectable.hostname(),
|
||||||
|
cancellable,
|
||||||
|
move |resolve| {
|
||||||
|
callback(if resolve.is_ok() {
|
||||||
|
match Uri::parse(&request, UriFlags::NONE) {
|
||||||
|
Ok(uri) => Self::from_uri(uri, None, None),
|
||||||
|
Err(e) => Err(Error::Glib(e)),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Ok(Self::search(&request))
|
||||||
|
})
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Err(_) => callback(Ok(Self::search(&request))), // @TODO not completed yet, fix invalid URI issue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Actions
|
// Actions
|
||||||
|
|
||||||
/// Handle `Self` request
|
/// Handle `Self` request
|
||||||
@ -106,55 +158,3 @@ impl Request {
|
|||||||
1 + count
|
1 + count
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tools
|
|
||||||
|
|
||||||
/// Create new search `Request`
|
|
||||||
/// @TODO
|
|
||||||
// * implement DNS lookup before apply this option
|
|
||||||
// * make search provider optional
|
|
||||||
// * validate request len by gemini specifications
|
|
||||||
pub fn search(query: &str) -> Request {
|
|
||||||
Request::from_uri(search::tgls(query), None, None).unwrap() // no handler as unexpected
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Asynchronously check request string contain resolvable query
|
|
||||||
/// * useful for scheme-less requests, before do search redirect
|
|
||||||
pub fn lookup(
|
|
||||||
query: &str,
|
|
||||||
cancellable: Option<&Cancellable>,
|
|
||||||
callback: impl FnOnce(Result<Request, Error>) + 'static,
|
|
||||||
) {
|
|
||||||
use gtk::{
|
|
||||||
gio::{NetworkAddress, Resolver},
|
|
||||||
prelude::{NetworkAddressExt, ResolverExt},
|
|
||||||
};
|
|
||||||
|
|
||||||
const DEFAULT_SCHEME: &str = "gemini://";
|
|
||||||
const DEFAULT_PORT: u16 = 1965;
|
|
||||||
const TIMEOUT: u32 = 1000;
|
|
||||||
|
|
||||||
let request = match query.trim().strip_prefix(DEFAULT_SCHEME) {
|
|
||||||
Some(postfix) => format!("{DEFAULT_SCHEME}{postfix}"),
|
|
||||||
None => query.to_string(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let resolver = Resolver::default();
|
|
||||||
resolver.set_timeout(TIMEOUT);
|
|
||||||
|
|
||||||
match NetworkAddress::parse_uri(&request, DEFAULT_PORT) {
|
|
||||||
Ok(connectable) => {
|
|
||||||
resolver.lookup_by_name_async(&connectable.hostname(), cancellable, move |resolve| {
|
|
||||||
callback(if resolve.is_ok() {
|
|
||||||
match Uri::parse(&request, UriFlags::NONE) {
|
|
||||||
Ok(uri) => Request::from_uri(uri, None, None),
|
|
||||||
Err(e) => Err(Error::Glib(e)),
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Ok(search(&request))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
Err(_) => callback(Ok(search(&request))), // @TODO not completed yet, fix invalid URI issue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user