implement gemini redirection handler

This commit is contained in:
yggverse 2025-01-19 02:33:58 +02:00
parent 983655e934
commit 4f7df8ea44
2 changed files with 56 additions and 56 deletions

View file

@ -14,17 +14,20 @@ use gtk::{
pub enum Request {
Gemini {
feature: Feature,
referrer: Vec<Self>,
referrer: Option<Box<Self>>,
uri: Uri,
},
Titan {
referrer: Option<Box<Self>>,
uri: Uri,
},
Titan(Uri),
}
impl Request {
// Constructors
/// Create new `Self` from featured string
pub fn parse(query: &str, referrer: Option<Vec<Self>>) -> Result<Self, Error> {
pub fn parse(query: &str, referrer: Option<Box<Self>>) -> Result<Self, Error> {
let (feature, request) = Feature::parse(query);
match Uri::parse(request, UriFlags::NONE) {
@ -37,15 +40,15 @@ impl Request {
pub fn from_uri(
uri: Uri,
feature: Option<Feature>,
referrer: Option<Vec<Self>>,
referrer: Option<Box<Self>>,
) -> Result<Self, Error> {
match uri.scheme().as_str() {
"gemini" => Ok(Self::Gemini {
feature: feature.unwrap_or_default(),
referrer: referrer.unwrap_or_default(),
referrer,
uri,
}),
"titan" => Ok(Self::Titan(uri)),
"titan" => Ok(Self::Titan { referrer, uri }),
_ => Err(Error::Unsupported),
}
}
@ -65,7 +68,10 @@ impl Request {
referrer,
uri,
} => gemini::send(client, feature, uri, referrer, cancellable, callback),
Self::Titan(_) => todo!(),
Self::Titan {
referrer: _,
uri: _,
} => todo!(),
}
}
@ -79,7 +85,19 @@ impl Request {
referrer: _,
uri,
}
| Self::Titan(uri) => uri,
| Self::Titan { referrer: _, uri } => uri,
}
}
/// Recursively count referrers of `Self`
/// * useful to apply redirection rules by protocol driver selected
pub fn referrers(&self) -> usize {
let count = match self {
Request::Gemini { referrer, .. } => referrer,
Request::Titan { referrer, .. } => referrer,
}
.as_ref()
.map_or(0, |request| request.referrers());
1 + count
}
}