75 lines
1.8 KiB
Markdown
75 lines
1.8 KiB
Markdown
# CeleryScript
|
|
|
|
CeleryScript is an AST definition of commands, rpcs, and functions that
|
|
can all be executed by Farmbot. The basic syntax is as follows:
|
|
|
|
```elixir
|
|
%{
|
|
kind: :some_command,
|
|
args: %{non_order_arg1: 1, non_order_arg2: "data"},
|
|
body: []
|
|
}
|
|
```
|
|
|
|
Note the three main fields: `kind`, `args` and `body`.
|
|
There is also another field `comment` that is optional. While technically
|
|
optional, `body` should be supplied when working with any and all modules
|
|
in this project.
|
|
|
|
## kind
|
|
|
|
`kind` is the identifier for a command. Examples include:
|
|
* `move_absolute`
|
|
* `sync`
|
|
* `read_status`
|
|
* `wait`
|
|
|
|
Each `kind` will have it's own set of rules for execution. These rules will
|
|
define what is required inside of both `args` and `body`.
|
|
|
|
## args
|
|
|
|
`args` is arguments to be passed to `kind`. Each `kind` defines it's own
|
|
set of optional and required `args`. Args can any of the following types:
|
|
* `number`
|
|
* `string` (with possible enum types)
|
|
* `boolean`
|
|
* another AST.
|
|
|
|
in the case of another AST, that AST will likely need to be evaluated before
|
|
executing the parent AST. Examples of `args` include:
|
|
* `x`
|
|
* `y`
|
|
* `z`
|
|
* `location`
|
|
* `milliseconds`
|
|
|
|
## body
|
|
|
|
`body` is the only way a `list` or `array` type is aloud in CeleryScript.
|
|
It may only contain _more CeleryScript nodes_. This is useful for
|
|
enumeration, scripting looping etc. Here's a syntacticly correct example:
|
|
```elixir
|
|
%{
|
|
kind: :script,
|
|
args: %{},
|
|
body: [
|
|
%{kind: :command, args: %{x: 1}, body: []}
|
|
%{kind: :command, args: %{x: 2}, body: []}
|
|
%{kind: :command, args: %{x: 3}, body: []}
|
|
]
|
|
}
|
|
```
|
|
|
|
Note there is nesting limit for CeleryScript body nodes, and nodes can
|
|
even be self referential. Example:
|
|
```elixir
|
|
%{
|
|
kind: :self_referencing_script,
|
|
args: %{id: 1},
|
|
body: [
|
|
%{kind: :execute_self_referencing_script, args: %{id: 1}, body: []}
|
|
]
|
|
}
|
|
```
|