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:
| 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.