use serde_json::Value;
use tauri::AppHandle;
use crate::broker;
use crate::state::AppState;
mod dialog;
mod notification;
mod store;
mod stubs;
mod webview;
pub use dialog::DialogProvider;
pub use notification::NotificationProvider;
pub use store::StoreProvider;
#[allow(unused_imports)]
pub use stubs::{LinStubProvider, MsStubProvider, UnsupportedProvider};
pub use webview::WebviewProvider;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CapSupport {
Full,
Partial,
Unsupported,
}
pub trait CapabilityProvider: Send + Sync {
fn id(&self) -> &str;
fn supported(&self) -> CapSupport;
fn try_invoke(
&self,
app: &AppHandle,
state: &AppState,
cmd: &str,
args: &Value,
) -> Option<Result<Value, String>>;
}
pub fn try_caps(
app: &AppHandle,
state: &AppState,
cmd: &str,
args: &Value,
) -> Option<Result<Value, String>> {
let providers: [&dyn CapabilityProvider; 4] = [
&NotificationProvider,
&DialogProvider,
&StoreProvider,
&WebviewProvider,
];
for p in providers {
if let Some(r) = p.try_invoke(app, state, cmd, args) {
return Some(r);
}
}
None
}
#[allow(dead_code)]
pub fn unsupported_result(cmd: &str) -> Value {
broker::unsupported(cmd)
}