mod database; mod widget; use database::Database; use widget::Widget; use crate::app::browser::action::Action as BrowserAction; use gtk::{ gio::SimpleAction, glib::{Uri, UriFlags}, prelude::EditableExt, }; use sqlite::Transaction; use std::rc::Rc; // Main pub struct Request { widget: Rc, } impl Request { // Construct pub fn new( // Actions browser_action: Rc, action_page_reload: SimpleAction, // @TODO local `action_page_open`? ) -> Self { Self { widget: Rc::new(Widget::new(browser_action, action_page_reload)), } } // Actions pub fn update(&self, progress_fraction: Option) { self.widget.update(progress_fraction); } pub fn clean( &self, transaction: &Transaction, app_browser_window_tab_item_page_navigation_id: &i64, ) -> Result<(), String> { match Database::records(transaction, app_browser_window_tab_item_page_navigation_id) { Ok(records) => { for record in records { match Database::delete(transaction, &record.id) { Ok(_) => { // Delegate clean action to the item childs self.widget.clean(transaction, &record.id)?; } Err(e) => return Err(e.to_string()), } } } Err(e) => return Err(e.to_string()), } Ok(()) } pub fn restore( &self, transaction: &Transaction, app_browser_window_tab_item_page_navigation_id: &i64, ) -> Result<(), String> { match Database::records(transaction, app_browser_window_tab_item_page_navigation_id) { Ok(records) => { for record in records { // Delegate restore action to the item childs self.widget.restore(transaction, &record.id)?; } } Err(e) => return Err(e.to_string()), } Ok(()) } pub fn save( &self, transaction: &Transaction, app_browser_window_tab_item_page_navigation_id: &i64, ) -> Result<(), String> { match Database::add(transaction, app_browser_window_tab_item_page_navigation_id) { Ok(_) => { let id = Database::last_insert_id(transaction); // Delegate save action to childs self.widget.save(transaction, &id)?; } Err(e) => return Err(e.to_string()), } Ok(()) } // Getters pub fn widget(&self) -> &Rc { &self.widget } pub fn uri(&self) -> Option { match Uri::parse(&self.widget.gobject().text(), UriFlags::NONE) { Ok(uri) => Some(uri), _ => None, } } } // Tools pub fn migrate(tx: &Transaction) -> Result<(), String> { // Migrate self components if let Err(e) = Database::init(tx) { return Err(e.to_string()); } // Delegate migration to childs widget::migrate(tx)?; // Success Ok(()) }