playtron-core 1.0.0

Playtron GameOS core utilities for Rust
Documentation
use std::fmt;

use zbus::Connection;

use crate::dbus::{
    sdk_manager_interface::SdkManagerInterfaceProxy,
    sdk_pact_interface::{SdkPactInterfaceProxy, SessionInfo},
};

#[derive(Debug, Clone, PartialEq)]
pub enum ManagerError {
    DbusConnectionFailed(zbus::Error),
    DbusMessageFailed(zbus::fdo::Error),
}

impl fmt::Display for ManagerError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            ManagerError::DbusConnectionFailed(e) => write!(f, "D-Bus connection failed: {e}"),
            ManagerError::DbusMessageFailed(e) => write!(f, "D-Bus message failed: {e}"),
        }
    }
}

pub struct Manager {
    connection: Connection,
}

impl Manager {
    pub async fn new() -> Result<Self, ManagerError> {
        let connection = Connection::session()
            .await
            .map_err(ManagerError::DbusConnectionFailed)?;

        Ok(Manager { connection })
    }

    pub async fn is_playtron(&self) -> Result<bool, ManagerError> {
        let proxy = self.get_manager_proxy().await?;
        proxy
            .is_playtron()
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    pub async fn is_keyboard_open(&self) -> Result<bool, ManagerError> {
        let proxy = self.get_manager_proxy().await?;
        proxy
            .is_keyboard_open()
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    pub async fn show_keyboard(&self) -> Result<(), ManagerError> {
        let proxy = self.get_manager_proxy().await?;
        proxy
            .show_keyboard()
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    pub async fn hide_keyboard(&self) -> Result<(), ManagerError> {
        let proxy = self.get_manager_proxy().await?;
        proxy
            .hide_keyboard()
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    pub async fn open_browser(&self, url: String) -> Result<(), ManagerError> {
        let proxy = self.get_manager_proxy().await?;
        proxy
            .open_browser(url)
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    pub async fn close_browser(&self) -> Result<(), ManagerError> {
        let proxy = self.get_manager_proxy().await?;
        proxy
            .close_browser()
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    async fn get_manager_proxy(&self) -> Result<SdkManagerInterfaceProxy<'_>, ManagerError> {
        SdkManagerInterfaceProxy::builder(&self.connection)
            .build()
            .await
            .map_err(ManagerError::DbusConnectionFailed)
    }

    pub async fn create_pact_session(&self) -> Result<SessionInfo, ManagerError> {
        let proxy = self.get_pact_proxy().await?;
        proxy
            .create_session()
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    pub async fn get_pact_quote(&self, nonce: Vec<u8>) -> Result<String, ManagerError> {
        let proxy = self.get_pact_proxy().await?;
        proxy
            .get_quote(nonce)
            .await
            .map_err(ManagerError::DbusMessageFailed)
    }

    async fn get_pact_proxy(&self) -> Result<SdkPactInterfaceProxy<'_>, ManagerError> {
        SdkPactInterfaceProxy::builder(&self.connection)
            .build()
            .await
            .map_err(ManagerError::DbusConnectionFailed)
    }
}