osakit 0.1.1

OSAKit macOS Framework adapted for Rust
# osakit

`osakit` aims to provide direct access to `OSAKit Framework` of macOS. Is uses ObjC-bindings
to access OSAKit and run both `AppleScript` and `JavaScript`.

`osakit` is built using [`serde`](https://crates.io/crates/serde) for input-output
serialization/deserialization.
Allows passing data to `JavaScript`/`AppleScript` functions and returns back the results.
Input and output data are represented using `Value` from
[`serde_json`](https://crates.io/crates/serde_json).

Comes with `declare_script!` macro (unstable) to simplify working with `OSAKit Framework`.

## Installation

Add `osakit` to the dependencies. Specify `"full"` feature if you want to use `declare_script`
macro or `"stable"` feature to only include stable API.

```toml
[dependencies]
osakit = { version = "0.1.0", features = ["full"] }
```

## Example using `declare_script`

```rust
use serde::{Deserialize, Serialize};
use osakit::declare_script;
                                                                                                       
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\"
            };
        }
    ")]
    MyJsScript {
        fn concat(x: &str, y: &str) -> String;
        fn multiply(a: i32, b: i32) -> i32;
        fn current_user() -> User;
    }
}
                                                                                                       
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq)]
struct User {
    id: u16,
    name: String,
}
                                                                                                       
#[test]
fn it_runs_my_js_script() {
    let script = MyJsScript::new().unwrap();
    assert_eq!(
        script.multiply(3, 2).unwrap(),
        6
    );
    assert_eq!(
        script.concat("Hello, ", "World").unwrap(),
        "Hello, World"
    );
    assert_eq!(
        script.current_user().unwrap(),
        User {
            id: 21,
            name: "root".into()
        }
    );
}
```

## Example using `Script`

```rust
use osakit::{Language, Map, Script, Value, Number};
                                                                                                       
#[test]
fn it_constructs_and_executes_scripts() {
    let mut script = Script::new_from_source(
        Language::AppleScript, "
        on launch_terminal()
            tell application \"Terminal\" to launch
        end launch_terminal
                                                                                                       
        on concat(x, y)
            return x & y
        end concat
                                                                                                       
        return {id: 21, name: \"root\"}
    ");
                                                                                                       
    script.compile().unwrap();
                                                                                                       
    assert_eq!(
        script.execute().unwrap(),
        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())
        ]).unwrap(),
        Value::String("Hello, World!".into())
    );
                                                                                                       
    assert!(
        script.execute_function("launch_terminal", &vec![]).is_ok()
    );
}
```

## Usage

See [Full Documentation](https://docs.rs/osakit/).

## Supported platforms

Due to the fact that OSAKit is Mac-specific, only `macOS` is supported.

## License

Licensed under either of

* Apache License, Version 2.0
  ([LICENSE-APACHE]LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license
  ([LICENSE-MIT]LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

## Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.