mod dialog;
mod event;
mod redirect;
mod socket;
use super::Profile;
use dialog::Dialog;
use event::Event;
use gtk::{gio::SocketAddress, prelude::IsA};
use redirect::Redirect;
use socket::Socket;
pub struct Info {
event: Vec<Event>,
header: Option<String>,
mime: Option<String>,
redirect: Option<Redirect>,
request: Option<String>,
size: Option<usize>,
socket: Option<Socket>,
}
impl Info {
pub fn new() -> Self {
Self {
event: Vec::with_capacity(50), header: None,
mime: None,
redirect: None,
request: None,
size: None,
socket: None,
}
}
pub fn into_permanent_redirect(self) -> Self {
let mut this = Self::new();
this.redirect = Some(Redirect::permanent(self));
this
}
pub fn into_temporary_redirect(self) -> Self {
let mut this = Self::new();
this.redirect = Some(Redirect::temporary(self));
this
}
pub fn dialog(&self, parent: &impl IsA<gtk::Widget>, profile: &Profile) {
use adw::{PreferencesDialog, prelude::AdwDialogExt};
PreferencesDialog::info(profile, self).present(Some(parent))
}
pub fn reset(&mut self, is_unset_redirect: bool) -> &mut Self {
if is_unset_redirect {
self.set_redirect(None);
}
self.clear_events()
.set_header(None)
.set_mime(None)
.set_request(None)
.set_size(None)
.set_socket(None)
}
pub fn add_event(&mut self, name: String) -> &mut Self {
self.event.push(Event::now(name));
self
}
pub fn clear_events(&mut self) -> &mut Self {
self.event.clear();
self
}
pub fn set_header(&mut self, header: Option<String>) -> &mut Self {
self.header = header;
self
}
pub fn set_mime(&mut self, mime: Option<String>) -> &mut Self {
self.mime = mime;
self
}
pub fn set_redirect(&mut self, redirect: Option<Redirect>) -> &mut Self {
self.redirect = redirect;
self
}
pub fn set_socket(&mut self, address: Option<(SocketAddress, SocketAddress)>) -> &mut Self {
self.socket = address.map(|(local_address, remote_address)| Socket {
local_address,
remote_address,
});
self
}
pub fn set_request(&mut self, request: Option<String>) -> &mut Self {
self.request = request;
self
}
pub fn set_size(&mut self, size: Option<usize>) -> &mut Self {
self.size = size;
self
}
pub fn request(&self) -> Option<&str> {
self.request.as_deref()
}
pub fn matches(&self, request: &str) -> bool {
self.request.as_ref().is_some_and(|r| r == request)
}
}
impl Default for Info {
fn default() -> Self {
Self::new()
}
}