mod widget; use widget::Widget; use crate::profile::Profile; use gtk::{ gio::{prelude::TlsCertificateExt, TlsCertificate}, glib::Uri, prelude::IsA, }; use std::rc::Rc; pub struct Gemini { // profile: Rc, widget: Rc, } impl Gemini { // Construct /// Create new `Self` for given Profile pub fn new(profile: Rc, auth_uri: Uri) -> Self { // Init widget let widget = Rc::new(Widget::new()); // Add new identity option widget.form.list.append(None, "Create new.."); // Collect additional options from database match profile.identity.gemini.database.records() { Ok(identities) => { for identity in identities { // Get certificate details let certificate = match TlsCertificate::from_pem(&identity.pem) { Ok(certificate) => certificate, Err(reason) => todo!("{reason}"), }; // Get expiration time let expires = certificate .not_valid_after() .unwrap() .format_iso8601() .unwrap(); // Append record option widget.form.list.append( Some(identity.id), &match identity.name { Some(name) => format!("{name} ({expires})"), None => format!("{expires}"), }, ); } } Err(_) => todo!(), } // Init events widget.connect_response({ let profile = profile.clone(); move |value| { match value { Some(id) => { // Activate selected identity ID } None => { // Create and select new identity } } // @TODO handle result } }); // Return activated `Self` Self { // profile, widget, } } // Actions /// Show dialog for parent [Widget](https://docs.gtk.org/gtk4/class.Widget.html) pub fn present(&self, parent: Option<&impl IsA>) { self.widget.present(parent); } }