rename mod to Request, reorganize featurelogic

This commit is contained in:
yggverse 2025-01-15 08:25:32 +02:00
parent e5e3f9956a
commit cfaa0152d6
5 changed files with 60 additions and 47 deletions

View File

@ -1,9 +1,9 @@
mod protocol; mod feature;
mod redirect; mod redirect;
mod status; mod status;
// Children dependencies // Children dependencies
use protocol::Protocol; use feature::Feature;
use redirect::Redirect; use redirect::Redirect;
use status::Status; use status::Status;
@ -88,9 +88,10 @@ impl Client {
} }
// Route request by protocol // Route request by protocol
match Protocol::from_string(query) { match Feature::from_string(query) {
Protocol::Gemini { uri } | Protocol::Titan { uri } => todo!("{uri}"), Feature::Default { request }
Protocol::Undefined => todo!(), | Feature::Download { request }
| Feature::Source { request } => request.send(), // @TODO
} }
} }
} }

View File

@ -1,12 +1,17 @@
mod request;
// Local dependencies
use request::Request;
/// Special features enumeration /// Special features enumeration
/// * may not be available for some protocols /// * may not be available for some protocols
pub enum Feature { pub enum Feature {
/// Common feature for protocol selected (e.g. browser view) /// Common feature for protocol selected (e.g. browser view)
Default { request: String }, Default { request: Request },
/// Download request with externally selected method (e.g. to file) /// Download request with externally selected method (e.g. to file)
Download { request: String }, Download { request: Request },
/// View request as the source (like `source-view`) /// View request as the source (like `source-view`)
Source { request: String }, Source { request: Request },
} }
impl Feature { impl Feature {
@ -17,18 +22,18 @@ impl Feature {
pub fn from_string(request: &str) -> Self { pub fn from_string(request: &str) -> Self {
if let Some(postfix) = request.strip_prefix("download:") { if let Some(postfix) = request.strip_prefix("download:") {
return Self::Download { return Self::Download {
request: postfix.to_string(), request: Request::from_string(postfix),
}; };
} }
if let Some(postfix) = request.strip_prefix("source:") { if let Some(postfix) = request.strip_prefix("source:") {
return Self::Source { return Self::Source {
request: postfix.to_string(), request: Request::from_string(postfix),
}; };
} }
Self::Default { Self::Default {
request: request.to_string(), request: Request::from_string(request),
} }
} }
} }

View File

@ -0,0 +1,41 @@
mod uri;
// Global dependencies
use gtk::glib::{Uri, UriFlags};
pub enum Request {
Gemini { uri: Uri },
Titan { uri: Uri },
Undefined,
}
impl Request {
// Constructors
/// Create new `Self` from parsable request string
pub fn from_string(request: &str) -> Self {
match Uri::parse(request, UriFlags::NONE) {
Ok(uri) => match uri.scheme().as_str() {
"gemini" => Self::Gemini { uri },
"titan" => Self::Titan { uri },
_ => Self::Undefined,
},
// Search request if the request could not be parsed as the valid [URI](https://docs.gtk.org/glib/struct.Uri.html)
// * @TODO implement DNS resolver lookup before assign this option
Err(_) => Self::Gemini {
uri: uri::tgls(request),
},
}
}
// Actions
/// Send request using protocol driver constructed
pub fn send(&self) {
match self {
Request::Gemini { uri } => todo!("{uri}"),
Request::Titan { uri } => todo!("{uri}"),
Request::Undefined => todo!(),
}
}
}

View File

@ -4,7 +4,7 @@
use gtk::glib::{Uri, UriFlags}; use gtk::glib::{Uri, UriFlags};
/// Build TGLS [Uri](https://docs.gtk.org/glib/struct.Uri.html) /// Build TGLS [Uri](https://docs.gtk.org/glib/struct.Uri.html)
pub fn tgls(request: &str) -> Uri { pub fn tgls(query: &str) -> Uri {
Uri::build( Uri::build(
UriFlags::NONE, UriFlags::NONE,
"gemini", "gemini",
@ -12,7 +12,7 @@ pub fn tgls(request: &str) -> Uri {
Some("tlgs.one"), Some("tlgs.one"),
1965, 1965,
"search", "search",
Some(&Uri::escape_string(request, None, false)), // @TODO is `escape_string` really wanted in `build` context? Some(&Uri::escape_string(query, None, false)), // @TODO is `escape_string` really wanted in `build` context?
None, None,
) )
} }

View File

@ -1,34 +0,0 @@
mod feature;
mod uri;
use feature::Feature;
use gtk::glib::{Uri, UriFlags};
pub enum Protocol {
Gemini { /*feature: Feature,*/ uri: Uri },
Titan { /*feature: Feature,*/ uri: Uri },
Undefined,
}
impl Protocol {
// Constructors
/// Create new `Self` from parsable request string
pub fn from_string(request: &str) -> Self {
match Feature::from_string(request) {
Feature::Default { request }
| Feature::Download { request }
| Feature::Source { request } => match Uri::parse(&request, UriFlags::NONE) {
Ok(uri) => match uri.scheme().as_str() {
"gemini" => Self::Gemini { uri },
"titan" => Self::Titan { uri },
_ => Self::Undefined,
},
Err(_) => Self::Gemini {
uri: uri::tgls(&request),
},
},
}
}
}