7 个版本

0.2.3 2024 年 4 月 4 日
0.2.2 2024 年 3 月 20 日
0.1.2 2024 年 3 月 20 日

#31 in macOS 和 iOS API

MIT/Apache

52KB
1K SLoC

osakit

osakit 的目标是提供对 macOS 的 OSAKit 框架 的直接访问。它使用 Objective-C 绑定来访问 OSAKit 并运行 AppleScriptJavaScript

osakit 使用 serde 进行输入输出序列化/反序列化。允许将数据传递到 JavaScript/AppleScript 函数,并返回结果。输入和输出数据使用 Valueserde_json 来表示。

包含 declare_script! 宏(不稳定)以简化与 OSAKit 框架 的工作。

GitHub 上的源代码

安装

osakit 添加到依赖项。如果您想使用 declare_script 宏,请指定 "full" 特性;如果您只想包含稳定 API,请指定 "stable" 特性。

[dependencies]
osakit = { version = "0.2", features = ["full"] }

使用 declare_script 的示例

use serde::{Deserialize, Serialize};
use osakit::declare_script;
use std::error::Error;

declare_script! {
    #[language(JavaScript)]
    #[source("
        function concat(x, y) {
            return x + y;
        }
                                                                                                       
        function multiply(a, b) {
            return a * b;
        }
                                                                                                       
        function current_user() {
            return {
                id: 21,
                name: \"root\"
            };
        }
    ")]
    pub MyJsScript {
        pub fn concat(x: &str, y: &str) -> String;
        pub fn multiply(a: i32, b: i32) -> i32;
        pub fn current_user() -> User;
    }
}
                                                                                                       
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq)]
struct User {
    id: u16,
    name: String,
}

fn main() -> Result<(), Box<dyn Error>> {
    let script = MyJsScript::new()?;
    assert_eq!(
        script.multiply(3, 2)?,
        6
    );
    assert_eq!(
        script.concat("Hello, ", "World")?,
        "Hello, World"
    );
    assert_eq!(
        script.current_user()?,
        User {
            id: 21,
            name: "root".into()
        }
    );
    Ok(())
}

使用 Script 的示例

use osakit::{Language, Map, Script, Value, Number};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    let mut script = Script::new_from_source(Language::AppleScript, "
        on is_app_running()
            tell application \"Hopefully Non-Existing Application\" to running
        end is_app_running
        on concat(x, y)
            return x & y
        end concat
        return {id: 21, name: \"root\"}
    ");
    script.compile()?;
    assert_eq!(
        script.execute()?,
        Value::Object(Map::from_iter(vec![
            ("id".into(), Value::Number(Number::from(21))),
            ("name".into(), Value::String("root".into()))
        ]))
    );
    assert_eq!(
        script.execute_function("concat", vec![
            Value::String("Hello, ".into()),
            Value::String("World!".into())
        ])?,
        Value::String("Hello, World!".into())
    );
    assert_eq!(
        script.execute_function("is_app_running", vec![])?,
        Value::Bool(false)
    );

    Ok(())
}

用法

参见 完整文档

限制

由于 OSAKit 框架 对整数值的限制,从 JavaScript 代码返回的整数类型限制为 i32

支持的平台

由于 OSAKit 是 Mac 特定的,因此仅支持 macOS

许可证

根据您的选择,许可为以下之一

贡献

除非您明确声明,否则您提交给工作的任何贡献(根据 Apache-2.0 许可证定义)均应按上述方式双重许可,而无需任何附加条款或条件。

依赖项

~12MB
~247K SLoC