asl
===

[<img alt="crates.io" src="https://img.shields.io/crates/v/asl.svg?logo=rust">](https://crates.io/crates/asl)
[<img alt="docs.rs" src="https://img.shields.io/docsrs/asl?logo=docs.rs">](https://docs.rs/asl)
[<img alt="build status" src="https://img.shields.io/github/actions/workflow/status/edisongustavo/asl/ci.yml?branch=main">](https://github.com/edisongustavo/asl/actions?query=branch%3Amain)

This library provides an implementation of [Amazon States Language](https://states-language.net/) (ASL) in Rust.

The library can parse and execute state machines defined in ASL.

## Example: Hello world

This example will print the strings `Hello` and `World`:

```rust
struct TaskHandler {}
impl StateExecutionHandler for TaskHandler {
    type TaskExecutionError = String;

    fn execute_task(
        &self,
        resource: &str,
        input: &Value,
        credentials: Option<&Value>,
    ) -> Result<Option<Value>, Self::TaskExecutionError> {
        let result = match resource {
            "SayHello" => "Hello",
            "SayWorld" => "World",
            _ => Err("Unknown resource!")?,
        };
        println!("{}", result);
        Ok(None) // We opt into returning nothing
    }
}

fn main() {
    let definition = r#"{
          "Comment": "A simple minimal example of the States language",
          "StartAt": "State: Hello",
          "States": {
            "State: Hello": {
              "Type": "Task",
              "Resource": "SayHello",
              "Next": "State: World"
            },
            "State: World": {
              "Type": "Task",
              "Resource": "SayWorld",
              "End": true
            }
          }
        }"#;
    let state_machine = StateMachine::parse(definition).unwrap();
    let input = Value::Null;
    let execution: Execution<TaskHandler, EmptyContext> = state_machine.start(&input, TaskHandler {}, EmptyContext {});
    // the Execution type implements Iterator, so we can iterate until there are no more states to execute
    let steps: Vec<StateExecutionOutput> = execution.collect();
}
```

See: [test_hello_world.rs](https://github.com/edisongustavo/asl-rust/blob/main/tests/test_hello_world.rs).

## Amazon States Language (ASL)

The Amazon States Language is a JSON-based, structured language used to define your state machine, a collection of states,
that can do work (Task states), determine which states to transition to next (Choice states),
stop an execution with an error (Fail states), and so on.

For a complete definition of ASL, refer to the [Amazon States Language Specification](https://states-language.net/).

**IMPORTANT**: This project is **NOT** affiliated with Amazon in any way.

ASL is deeply connected to [AWS Step Functions](https://docs.aws.amazon.com/step-functions/). This means that in many
places, the definition from the language specification is not specified, so this library opts into following the
results from AWS Step Functions.

## Feature Matrix

The main features that are already implemented or missing are listed in the following table:

| Feature                        | Status                                                                |
|--------------------------------|-----------------------------------------------------------------------|
| State execution workflow       | Implemented                                                           |
| JSON Paths and Reference Paths | Implemented                                                           |
| States: Pass                   | Implemented                                                           |
| States: Wait                   | Implemented                                                           |
| States: Fail                   | Implemented                                                           |
| States: Choice                 | Implemented                                                           |
| States: Succeed                | Implemented                                                           |
| States: Task                   | Implemented, but not all features. See other features in this table.  |
| States: Task - Timeout         | Not implemented (https://github.com/edisongustavo/asl-rust/issues/9)  |
| States: Task - Hearbeat        | Not implemented (https://github.com/edisongustavo/asl-rust/issues/10) |
| States: Task - Retry           | Not implemented (https://github.com/edisongustavo/asl-rust/issues/11) |
| State: Parallel                | Not Implemented (https://github.com/edisongustavo/asl-rust/issues/2)  |
| State: Map                     | Not Implemented (https://github.com/edisongustavo/asl-rust/issues/1)  |
| Intrinsic Functions            | Not Implemented (https://github.com/edisongustavo/asl-rust/issues/4)  |

## License

This project is licensed under the MIT License.