cueward-adapter-macos 0.5.0

macOS adapter for Cueward with Safari, Notes, Messages, Reminders, Calendar, Screenshot, Clipboard, and OCR integrations.
use serde::Serialize;

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariTab {
    pub window_id: i64,
    pub window_name: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub profile: Option<String>,
    pub index: usize,
    pub title: String,
    pub url: String,
    pub active: bool,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariEvalResult {
    pub result: serde_json::Value,
    pub value_type: String,
}

#[cfg(test)]
mod eval_result_tests {
    use super::SafariEvalResult;

    #[test]
    fn exec_result_preserves_array_type() {
        let result = SafariEvalResult {
            result: serde_json::json!([1, 2]),
            value_type: "array".to_string(),
        };
        let output = serde_json::to_value(result).expect("serialize result");
        assert_eq!(output["result"], serde_json::json!([1, 2]));
        assert_eq!(output["value_type"], "array");
    }

    #[test]
    fn exec_result_distinguishes_null_from_undefined() {
        let null = SafariEvalResult {
            result: serde_json::Value::Null,
            value_type: "null".to_string(),
        };
        let undefined = SafariEvalResult {
            result: serde_json::Value::Null,
            value_type: "undefined".to_string(),
        };
        assert_ne!(
            serde_json::to_value(null).expect("null result"),
            serde_json::to_value(undefined).expect("undefined result")
        );
    }
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariReadResult {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub selector: Option<String>,
    pub content: String,
}

#[derive(Clone, Debug, Serialize, PartialEq, Eq)]
pub struct SafariScrollReadChunk {
    pub iteration: u64,
    pub content: String,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariScrollReadResult {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub selector: Option<String>,
    pub times: u64,
    pub chunks: Vec<SafariScrollReadChunk>,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariSourceResult {
    pub html: String,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariCloseResult {
    pub closed: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub index: Option<usize>,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariClickResult {
    pub clicked: bool,
    pub selector: String,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariFillResult {
    pub filled: bool,
    pub selector: String,
    pub text: String,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariWaitResult {
    pub found: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub selector: Option<String>,
    pub condition: String,
    pub timeout_seconds: u64,
}

#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct SafariScrollResult {
    pub scroll_x: i64,
    pub scroll_y: i64,
}

#[derive(Debug, serde::Deserialize, PartialEq, Eq)]
pub(super) struct SafariScrollReadSnapshot {
    pub(super) item_count: usize,
    pub(super) content: String,
    #[serde(default)]
    pub(super) blocks: Vec<String>,
}