use crate::winrt::{IInspectable, IActivationFactory};
use crate::error::Result;
use windows::core::IInspectable as CoreIInspectable;
#[derive(Clone)]
pub struct XamlApplication {
inspectable: IInspectable,
}
impl XamlApplication {
pub fn new() -> Result<Self> {
let factory = IActivationFactory::get("Windows.UI.Xaml.Application")
.map_err(|e| crate::error::Error::initialization(format!("Failed to get XAML Application factory: {}", e)))?;
let inspectable: CoreIInspectable = factory.activate_instance()
.map_err(|e| crate::error::Error::initialization(format!("Failed to activate XAML Application: {}", e)))?;
Ok(XamlApplication {
inspectable: IInspectable::from(inspectable),
})
}
pub fn current() -> Result<Self> {
Self::new()
}
pub fn run(&self) -> Result<()> {
let app = crate::app::Application::current()
.ok_or_else(|| crate::error::Error::application("No application instance available"))?;
app.run()
}
pub fn exit(&self, code: i32) -> Result<()> {
let app = crate::app::Application::current()
.ok_or_else(|| crate::error::Error::application("No application instance available"))?;
app.exit_with_code(code);
Ok(())
}
pub fn as_inspectable(&self) -> &IInspectable {
&self.inspectable
}
}
impl Default for XamlApplication {
fn default() -> Self {
Self::new().expect("Failed to create XAML Application")
}
}
unsafe impl Send for XamlApplication {}
unsafe impl Sync for XamlApplication {}