use crate::error::PlatformError;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AppKeyboardModifier {
Command,
Shift,
Option,
Control,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum AppKeyboardAction {
Type { text: String },
Press {
key: String,
#[serde(default)]
modifiers: Vec<AppKeyboardModifier>,
},
}
impl AppKeyboardAction {
pub fn kind(&self) -> &'static str {
match self {
Self::Type { .. } => "type",
Self::Press { .. } => "press",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppKeyboardRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub window_id: Option<String>,
pub action: AppKeyboardAction,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppKeyboardResult {
pub window_id: String,
pub action: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub modifier_reliability: Option<String>,
}
#[async_trait]
pub trait AppKeyboard: Send + Sync {
async fn perform_app_keyboard(
&self,
request: AppKeyboardRequest,
) -> Result<AppKeyboardResult, PlatformError> {
let _ = request;
Err(PlatformError::NotSupported(
"app keyboard input is not implemented for this platform".to_string(),
))
}
}