update response namespace

This commit is contained in:
yggverse 2024-12-01 08:50:28 +02:00
parent 70fc128c29
commit 4767929050
19 changed files with 59 additions and 50 deletions

View file

@ -3,18 +3,16 @@
pub mod connection; pub mod connection;
pub mod error; pub mod error;
pub mod response;
pub use connection::Connection; pub use connection::Connection;
pub use error::Error; pub use error::Error;
pub use response::Response;
use gio::{ use gio::{
prelude::{IOStreamExt, OutputStreamExt, SocketClientExt, TlsConnectionExt}, prelude::{SocketClientExt, TlsConnectionExt},
Cancellable, SocketClient, SocketClientEvent, SocketProtocol, TlsCertificate, Cancellable, SocketClient, SocketClientEvent, SocketProtocol, TlsCertificate,
TlsClientConnection, TlsClientConnection,
}; };
use glib::{object::Cast, Bytes, Priority, Uri}; use glib::{object::Cast, Priority, Uri};
pub const DEFAULT_TIMEOUT: u32 = 10; pub const DEFAULT_TIMEOUT: u32 = 10;
@ -74,7 +72,7 @@ impl Client {
priority: Priority, priority: Priority,
cancellable: Cancellable, cancellable: Cancellable,
certificate: Option<TlsCertificate>, certificate: Option<TlsCertificate>,
callback: impl Fn(Result<Response, Error>) + 'static, callback: impl Fn(Result<connection::Response, Error>) + 'static,
) { ) {
// Toggle socket mode // Toggle socket mode
// * guest sessions will not work without! // * guest sessions will not work without!
@ -94,12 +92,14 @@ impl Client {
{ {
Ok(connection) => { Ok(connection) => {
// Begin new request // Begin new request
request_async( connection.request_async(
connection,
uri.to_string(), uri.to_string(),
priority, priority,
cancellable, cancellable,
callback, // result move |result| match result {
Ok(response) => callback(Ok(response)),
Err(e) => callback(Err(Error::Connection(e))),
},
) )
} }
Err(e) => callback(Err(Error::Connection(e))), Err(e) => callback(Err(Error::Connection(e))),
@ -112,30 +112,3 @@ impl Client {
} }
} }
} }
/// Middle-level helper, makes new request to available `Connection`
/// * callback with new `Response` on success or `Error` on failure
pub fn request_async(
connection: Connection,
query: String,
priority: Priority,
cancellable: Cancellable,
callback: impl Fn(Result<Response, Error>) + 'static,
) {
connection.stream().output_stream().write_bytes_async(
&Bytes::from(format!("{query}\r\n").as_bytes()),
priority,
Some(&cancellable.clone()),
move |result| match result {
Ok(_) => {
Response::from_connection_async(connection, priority, cancellable, move |result| {
callback(match result {
Ok(response) => Ok(response),
Err(e) => Err(Error::Response(e)),
})
})
}
Err(e) => callback(Err(Error::OutputStream(e))),
},
);
}

View file

@ -1,11 +1,17 @@
pub mod error; pub mod error;
pub mod response;
pub use error::Error; pub use error::Error;
pub use response::Response;
use gio::{ use gio::{
prelude::TlsConnectionExt, IOStream, NetworkAddress, SocketConnection, TlsCertificate, prelude::{IOStreamExt, OutputStreamExt, TlsConnectionExt},
TlsClientConnection, Cancellable, IOStream, NetworkAddress, SocketConnection, TlsCertificate, TlsClientConnection,
};
use glib::{
object::{Cast, IsA, ObjectExt},
Bytes, Priority,
}; };
use glib::object::{Cast, IsA, ObjectExt};
pub struct Connection { pub struct Connection {
pub socket_connection: SocketConnection, pub socket_connection: SocketConnection,
@ -51,6 +57,40 @@ impl Connection {
}) })
} }
// Actions
/// Make new request to available `Connection`
/// * callback with new `Response` on success or `Error` on failure
pub fn request_async(
self,
query: String,
priority: Priority,
cancellable: Cancellable,
callback: impl Fn(Result<Response, Error>) + 'static,
) {
self.tls_client_connection
.output_stream()
.write_bytes_async(
&Bytes::from(format!("{query}\r\n").as_bytes()),
priority,
Some(&cancellable.clone()),
move |result| match result {
Ok(_) => Response::from_connection_async(
self,
priority,
cancellable,
move |result| {
callback(match result {
Ok(response) => Ok(response),
Err(e) => Err(Error::Response(e)),
})
},
),
Err(e) => callback(Err(Error::Stream(e))),
},
);
}
// Getters // Getters
/// Get [IOStream](https://docs.gtk.org/gio/class.IOStream.html) /// Get [IOStream](https://docs.gtk.org/gio/class.IOStream.html)

View file

@ -2,12 +2,20 @@ use std::fmt::{Display, Formatter, Result};
#[derive(Debug)] #[derive(Debug)]
pub enum Error { pub enum Error {
Response(crate::client::connection::response::Error),
Stream(glib::Error),
TlsClientConnection(glib::Error), TlsClientConnection(glib::Error),
} }
impl Display for Error { impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> Result { fn fmt(&self, f: &mut Formatter) -> Result {
match self { match self {
Self::Stream(e) => {
write!(f, "TLS client connection error: {e}")
}
Self::Response(e) => {
write!(f, "Response error: {e}")
}
Self::TlsClientConnection(e) => { Self::TlsClientConnection(e) => {
write!(f, "TLS client connection error: {e}") write!(f, "TLS client connection error: {e}")
} }

View file

@ -3,20 +3,14 @@ use std::fmt::{Display, Formatter, Result};
#[derive(Debug)] #[derive(Debug)]
pub enum Error { pub enum Error {
Connect(glib::Error), Connect(glib::Error),
Connectable(String),
Connection(crate::client::connection::Error), Connection(crate::client::connection::Error),
NetworkAddress(crate::gio::network_address::Error), NetworkAddress(crate::gio::network_address::Error),
OutputStream(glib::Error),
Request(glib::Error), Request(glib::Error),
Response(crate::client::response::Error),
} }
impl Display for Error { impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> Result { fn fmt(&self, f: &mut Formatter) -> Result {
match self { match self {
Self::Connectable(uri) => {
write!(f, "Could not create connectable address for {uri}")
}
Self::Connection(e) => { Self::Connection(e) => {
write!(f, "Connection error: {e}") write!(f, "Connection error: {e}")
} }
@ -26,15 +20,9 @@ impl Display for Error {
Self::NetworkAddress(e) => { Self::NetworkAddress(e) => {
write!(f, "Network address error: {e}") write!(f, "Network address error: {e}")
} }
Self::OutputStream(e) => {
write!(f, "Output stream error: {e}")
}
Self::Request(e) => { Self::Request(e) => {
write!(f, "Request error: {e}") write!(f, "Request error: {e}")
} }
Self::Response(e) => {
write!(f, "Response error: {e}")
}
} }
} }
} }