# Command Engine
Transform string instructions into code execution.
## Engine
This crate provides a default engine, that is present if default features are enabled.
It is simply a container for your Commands that can also execute them based on the input.
There are 2 versions of the default Engine:
- `sync` - Default.
- `async` - Enabled with `async` feature.
## Instruction
The given input is deserialized into a specific format defined in `Instruction` structure.
It allows for one Command `caller`, multiple positional `args`, additional `o_args` which act like flags
that can contain `sub_args`.
Format:
```pseudo
-- --
```
Example:
```pseudo
example argument1 argument2 --flag2 child1 child2 --flag3 --flag1
```
Deserializes to:
```rust
Instruction {
caller: "example",
args: vec!["argument1", "argument2"],
o_args: {
let mut map = HashMap::new();
map.insert("--flag2", Some(vec!["child1", "child2"]));
map.insert("--flag3", None);
map.insert("--flag1", None);
map
},
input: "example argument1 argument2 --flag2 child1 child2 --flag3 --flag1",
};
```
To add spaces in arguments use double quotes `"`:
```pseudo
example "argument 1" "--flag 2" "child 1"
```
If there are double quotes in the argument it's suggested to use collector `#`:
```pseudo
example #"argument "quotes" 1"#
```
There are no escape characters to avoid any heap allocations. Each argument is a string slice taken from the input.
## Example
Sync version:
```rust
use command_engine::*;
pub struct Example;
impl CommandInfo for Example {
fn caller(&self) -> &'static str {
"ex"
}
}
impl Command for Example {
type Output = String;
fn on_execute(&self, ins: Instruction) -> Self::Output {
format!("{:?}", ins)
}
}
fn main() {
let input = "ex arg --o_arg sub_arg";
let mut engine = Engine::new();
engine.insert(Example);
// Will return formatted string of the Instruction.
let output = engine.execute(input).unwrap();
println!("{}", output);
}
```
## Disclaimer
#### ToDo _(in future)_:
- [ ] Custom Instructions (just like the Outputs)
- [ ] Integrated help command
#### Versioning:
- `*.*.*` - Released.
- `*.*.*-rc.*` - Release Candidate.
- `*.*.*-dev` - Unreleased in production.
- `0.*.*` - Deprecated.