sysd-manager 2.19.4

Application to empower user to manage their <b>systemd units</b> via Graphical User Interface. Not only are you able to make changes to the enablement and running status of each of the units, but you will also be able to view and modify their unit files and check the journal logs.
mod imp;
mod launch_creator_page;
mod service_creator_page;
mod timer_creator_page;
mod unit_file;
mod unit_file_creator_page;
use crate::widget::app_window::AppWindow;
use adw::subclass::prelude::ObjectSubclassIsExt;
use gtk::glib::{self};
use tracing::warn;

glib::wrapper! {

    pub struct UnitCreatorWindow(ObjectSubclass<imp::UnitCreatorWindowImp>)
    @extends adw::Window, gtk::Window, gtk::Widget,
    @implements gtk::Accessible,  gtk::Buildable,  gtk::ConstraintTarget,
    gtk::Native, gtk::Root, gtk::ShortcutManager;
}

impl UnitCreatorWindow {
    pub fn new(app_window: &AppWindow) -> Self {
        let obj: UnitCreatorWindow = glib::Object::new();
        let _ = obj.imp().app_window.set(app_window.clone());
        obj
    }

    pub fn action_group(&self) -> gio::SimpleActionGroup {
        self.imp().action_group.borrow().clone()
    }
}

#[derive(Debug, Copy, Clone, PartialEq, Eq, glib::Enum, Default, Hash)]
#[enum_type(name = "UnitCreateType")]
pub enum UnitCreateType {
    #[default]
    Service,
    Timer,
    TimerService,
}

impl UnitCreateType {
    pub fn max_sufix_len(&self) -> usize {
        match self {
            UnitCreateType::Service => ".service".len(),
            UnitCreateType::Timer => ".timer".len(),
            UnitCreateType::TimerService => ".service".len(),
        }
    }
}

impl From<&glib::Variant> for UnitCreateType {
    fn from(value: &glib::Variant) -> Self {
        match value.get::<String>().as_deref() {
            Some("service") => UnitCreateType::Service,
            Some("timer") => UnitCreateType::Timer,
            Some("timer_service") => UnitCreateType::TimerService,
            other => {
                warn!("Unkown type {:?}", other);
                UnitCreateType::Service
            }
        }
    }
}

#[derive(Debug, PartialEq)]
enum CreateUnitErr {
    WrongChar,
    Limit255,
    FileExits,
    Empty,
    FileNotExits,
    NotFile,
    NotExecutable,
    NoErr,
    Malformed,
}

impl CreateUnitErr {
    fn title_err(&self, prefix: &str) -> String {
        match self {
            CreateUnitErr::WrongChar => format!("{prefix} - Wrong Char"),
            CreateUnitErr::Limit255 => format!("{prefix} - Unit File over 255 characters"),
            CreateUnitErr::FileExits => format!("{prefix} - Unit File already exists"),
            CreateUnitErr::Empty => format!("{prefix} - Nae Empty"),
            CreateUnitErr::FileNotExits => format!("{prefix} - File not exists"),
            CreateUnitErr::NotFile => format!("{prefix} - Not a File"),
            CreateUnitErr::NotExecutable => format!("{prefix} - Not Exec"),
            CreateUnitErr::Malformed => format!("{prefix} - Malformed"),
            CreateUnitErr::NoErr => prefix.to_owned(),
        }
    }
}