update ggemini api version

This commit is contained in:
yggverse 2024-10-25 14:59:38 +03:00
parent 2cc69288fb
commit 47f254c372
2 changed files with 188 additions and 186 deletions

View file

@ -14,10 +14,10 @@ use widget::Widget;
use meta::{Meta, Status}; use meta::{Meta, Status};
use gtk::{ use gtk::{
gio::{Cancellable, SimpleAction}, gio::SimpleAction,
glib::{ glib::{
gformat, uuid_string_random, GString, Priority, Regex, RegexCompileFlags, RegexMatchFlags, gformat, uuid_string_random, GString, Regex, RegexCompileFlags, RegexMatchFlags, Uri,
Uri, UriFlags, UriFlags,
}, },
prelude::{ActionExt, StaticVariantType, ToVariant}, prelude::{ActionExt, StaticVariantType, ToVariant},
Box, Box,
@ -188,188 +188,133 @@ impl Page {
"gemini" => { "gemini" => {
// Define local NS // Define local NS
use gemini::client::{ use gemini::client::{
request_async,
response::header::{Mime as ResponseMime, Status as ResponseStatus}, response::header::{Mime as ResponseMime, Status as ResponseStatus},
simple_socket_request_async,
}; };
// Update page status // Update page status
meta.borrow_mut().status = Some(Status::Prepare); meta.borrow_mut().status = Some(Status::Connecting);
meta.borrow_mut().description = Some(gformat!("Connect.."));
action_update.activate(Some(&id)); action_update.activate(Some(&id));
// Begin request // Begin request
request_async( simple_socket_request_async(uri.clone(), move |result| match result {
uri.clone(), Ok(response) => {
Some(Cancellable::new()), // Format response
Some(Priority::DEFAULT), meta.borrow_mut().status = Some(Status::Connected);
move |result| match result { meta.borrow_mut().title = uri.host();
Ok(response) => {
// Format response
meta.borrow_mut().status = Some(Status::Response);
meta.borrow_mut().title = uri.host();
action_update.activate(Some(&id)); action_update.activate(Some(&id));
match response.header().status() { match response.header().status() {
// 10 | 11 // 10 | 11
Some(ResponseStatus::Input) Some(ResponseStatus::Input)
| Some(ResponseStatus::SensitiveInput) => { | Some(ResponseStatus::SensitiveInput) => {
// Format response // Format response
let status = Status::Input; let status = Status::Input;
let title = gformat!("Input expected"); let title = gformat!("Input expected");
let description = match response.header().meta() { let description = match response.header().meta() {
Some(meta) => match meta.to_gstring() { Some(meta) => match meta.to_gstring() {
Ok(value) => value, Ok(value) => value,
Err(_) => title.clone(), Err(_) => title.clone(),
}, },
None => title.clone(), None => title.clone(),
}; };
// Make input form // Make input form
match response.header().status() { match response.header().status() {
Some(ResponseStatus::SensitiveInput) => input Some(ResponseStatus::SensitiveInput) => input
.set_new_sensitive( .set_new_sensitive(
action_page_open,
uri,
Some(&description),
Some(1024),
),
_ => input.set_new_response(
action_page_open, action_page_open,
uri, uri,
Some(&description), Some(&description),
Some(1024), Some(1024),
), ),
} _ => input.set_new_response(
action_page_open,
// Update meta uri,
meta.borrow_mut().status = Some(status); Some(&description),
meta.borrow_mut().description = Some(description); Some(1024),
meta.borrow_mut().title = Some(title); ),
// Update page
action_update.activate(Some(&id));
} }
// 20
Some(ResponseStatus::Success) => match response
.header()
.mime()
{
Some(ResponseMime::TextGemini) => {
// Update data
match response.body().to_gstring() {
Ok(source) => {
meta.borrow_mut().status =
Some(Status::Success);
// This content type may return parsed title // Update meta
meta.borrow_mut().title = meta.borrow_mut().status = Some(status);
content.set_text_gemini(&uri, &source); meta.borrow_mut().description = Some(description);
meta.borrow_mut().title = Some(title);
// Add new history record // Update page
let request = uri.to_str(); action_update.activate(Some(&id));
}
// 20
Some(ResponseStatus::Success) => match response.header().mime()
{
Some(ResponseMime::TextGemini) => {
// Update data
match response.body().to_gstring() {
Ok(source) => {
meta.borrow_mut().status =
Some(Status::Success);
match navigation.history_current() { // This content type may return parsed title
Some(current) => { meta.borrow_mut().title =
if current != request { content.set_text_gemini(&uri, &source);
navigation.history_add(request);
} // Add new history record
let request = uri.to_str();
match navigation.history_current() {
Some(current) => {
if current != request {
navigation.history_add(request);
} }
None => navigation.history_add(request),
} }
None => navigation.history_add(request),
// Update window components
action_update.activate(Some(&id));
} }
Err(_) => todo!(),
// Update window components
action_update.activate(Some(&id));
} }
} Err(_) => todo!(),
Some(ResponseMime::TextPlain) => {
meta.borrow_mut().status = Some(Status::Success);
action_update.activate(Some(&id));
todo!()
}
Some(ResponseMime::ImagePng)
| Some(ResponseMime::ImageGif)
| Some(ResponseMime::ImageJpeg)
| Some(ResponseMime::ImageWebp) => {
// Update meta
meta.borrow_mut().status = Some(Status::Success);
meta.borrow_mut().title = Some(gformat!("Picture")); // @TODO
// Update content
content.set_image(); // @TODO
// Add new history record
let request = uri.to_str();
match navigation.history_current() {
Some(current) => {
if current != request {
navigation.history_add(request);
}
}
None => navigation.history_add(request),
}
// Update window components
action_update.activate(Some(&id));
}
_ => {
// Define common data
let status = Status::Failure;
let title = gformat!("Oops");
let description =
gformat!("Content type not supported");
// Update widget
content.set_status_failure(
title.as_str(),
description.as_str(),
);
// Update meta
meta.borrow_mut().status = Some(status);
meta.borrow_mut().title = Some(title);
meta.borrow_mut().description = Some(description);
// Update window
action_update.activate(Some(&id));
}
},
// 32
Some(ResponseStatus::Redirect) => {
// Update meta
meta.borrow_mut().status = Some(Status::Redirect);
meta.borrow_mut().title = Some(gformat!("Redirect"));
action_update.activate(Some(&id));
// Select widget
match response.header().meta() {
Some(meta) => {
let _ = content.set_text_gemini(
&uri,
// @TODO use template file
&gformat!(
"# Redirect\n\nAuto-follow disabled, click on link below to continue\n\n=> {}",
match meta.to_gstring() {
Ok(url) => url,
Err(_) => todo!()
}
)
);
}
None => todo!(),
} }
} }
// @TODO Some(ResponseMime::TextPlain) => {
None => { meta.borrow_mut().status = Some(Status::Success);
action_update.activate(Some(&id));
todo!()
}
Some(ResponseMime::ImagePng)
| Some(ResponseMime::ImageGif)
| Some(ResponseMime::ImageJpeg)
| Some(ResponseMime::ImageWebp) => {
// Update meta
meta.borrow_mut().status = Some(Status::Success);
meta.borrow_mut().title = Some(gformat!("Picture")); // @TODO
// Update content
content.set_image(); // @TODO
// Add new history record
let request = uri.to_str();
match navigation.history_current() {
Some(current) => {
if current != request {
navigation.history_add(request);
}
}
None => navigation.history_add(request),
}
// Update window components
action_update.activate(Some(&id));
}
_ => {
// Define common data // Define common data
let status = Status::Failure; let status = Status::Failure;
let title = gformat!("Oops"); let title = gformat!("Oops");
let description = gformat!("Status code not supported"); let description =
gformat!("Content type not supported");
// Update widget // Update widget
content.set_status_failure( content.set_status_failure(
@ -385,28 +330,87 @@ impl Page {
// Update window // Update window
action_update.activate(Some(&id)); action_update.activate(Some(&id));
} }
}; },
} // 32
Err(_) => { Some(ResponseStatus::Redirect) => {
// Define common data // Update meta
let status = Status::Failure; meta.borrow_mut().status = Some(Status::Redirect);
let title = gformat!("Oops"); meta.borrow_mut().title = Some(gformat!("Redirect"));
let description = gformat!("Failed to request");
// Update widget action_update.activate(Some(&id));
content
.set_status_failure(title.as_str(), description.as_str());
// Update meta // Select widget
meta.borrow_mut().status = Some(status); match response.header().meta() {
meta.borrow_mut().title = Some(title); Some(meta) => {
meta.borrow_mut().description = Some(description); let _ = content.set_text_gemini(
&uri,
// @TODO use template file
&gformat!(
"# Redirect\n\nAuto-follow disabled, click on link below to continue\n\n=> {}",
match meta.to_gstring() {
Ok(url) => url,
Err(_) => todo!()
}
)
);
}
None => todo!(),
}
}
// @TODO
None => {
// Define common data
let status = Status::Failure;
let title = gformat!("Oops");
let description = gformat!("Status code not supported");
// Update window // Update widget
action_update.activate(Some(&id)); content.set_status_failure(
} title.as_str(),
}, description.as_str(),
); );
// Update meta
meta.borrow_mut().status = Some(status);
meta.borrow_mut().title = Some(title);
meta.borrow_mut().description = Some(description);
// Update window
action_update.activate(Some(&id));
}
};
}
Err(reason) => {
// Define common data
let status = Status::Failure;
let title = gformat!("Oops");
let description = match reason {
gemini::client::Error::Connection => {
gformat!("Failed to connect")
}
gemini::client::Error::Request => {
gformat!("Failed to send request")
}
gemini::client::Error::Response => {
gformat!("Failed to read response")
}
gemini::client::Error::Close => {
gformat!("Failed to close connection")
}
}; // @TODO explain
// Update widget
content.set_status_failure(title.as_str(), description.as_str());
// Update meta
meta.borrow_mut().status = Some(status);
meta.borrow_mut().title = Some(title);
meta.borrow_mut().description = Some(description);
// Update window
action_update.activate(Some(&id));
}
});
} }
/* @TODO /* @TODO
"nex" => {} "nex" => {}
@ -544,10 +548,10 @@ impl Page {
pub fn progress_fraction(&self) -> Option<f64> { pub fn progress_fraction(&self) -> Option<f64> {
// Interpret status to progress fraction // Interpret status to progress fraction
match self.meta.borrow().status { match self.meta.borrow().status {
Some(Status::Prepare | Status::Reload) => Some(0.0), Some(Status::Reload) => Some(0.0),
Some(Status::Connect) => Some(0.25), Some(Status::Connecting) => Some(0.25),
Some(Status::Request) => Some(0.50), Some(Status::Connected) => Some(0.50),
Some(Status::Response) => Some(0.75), // Some(Status::Response) => Some(0.75),
Some(Status::Failure | Status::Redirect | Status::Success | Status::Input) => Some(1.0), Some(Status::Failure | Status::Redirect | Status::Success | Status::Input) => Some(1.0),
_ => None, _ => None,
} }

View file

@ -3,20 +3,18 @@ use gtk::glib::GString;
pub enum Status { pub enum Status {
// SensitiveInput, // SensitiveInput,
// Complete, // Complete,
Connect,
// Connected,
// Connecting,
Failure, Failure,
Input, Input,
Prepare, Connecting,
Connected,
// ProxyNegotiated, // ProxyNegotiated,
// ProxyNegotiating, // ProxyNegotiating,
Redirect, Redirect,
Reload, Reload,
Request, // Request,
// Resolved, // Resolved,
// Resolving, // Resolving,
Response, // Response,
Success, Success,
// TlsHandshaked, // TlsHandshaked,
// TlsHandshaking, // TlsHandshaking,