# ESDL
**E**vent-sourcing **S**chema **D**efinition **L**anguage
---
Schema definition language for defining aggregates, commands, events & custom types.
Heavily inspired by GraphQL syntax, you can describe aggregates which can be used for codegen in different languages.
## Install
> Due to the wit-bindgen project not having their crates published yet (see https://github.com/bytecodealliance/wit-bindgen/issues/180),
> `esdl` is not up to date on crates.io and it's advised to use the git url as the dependency for now.
```toml
esdl = { git = "https://github.com/thalo-rs/esdl", features = ["codegen-rust"] }
```
_Possible features include `codegen-rust`, `codegen-rust-wasm` and `codegen-typescript`._
## Code generation
ESDL schemas can be used for code generation.
The [Rust crate](https://crates.io/crates/esdl) currently supports code generation for:
- [Rust](https://docs.rs/esdl/latest/esdl/codegen/rust/struct.RustCompiler.html) (`codegen-rust`)
- [Rust WASM](https://docs.rs/esdl/latest/esdl/codegen/rust/wasm/struct.RustWasmCompiler.html) (`codegen-rust-wasm`)
- [TypeScript](https://docs.rs/esdl/latest/esdl/codegen/typescript/struct.TypeScriptCompiler.html) (`codegen-typescript`)
Additional languages may be added in the future. Contributions are welcome!
## Example
```
version = "0.1.0"
aggregate BankAccount {
open_account(initial_balance: Float) -> OpenedAccount
deposit_funds(amount: Float) -> ReceivedFunds
withdraw_funds(amount: Float) -> SentFunds
send_funds(amount: Float, user: User) -> (SentFunds? | ReceivedFunds?)
}
event OpenedAccount {
initial_balance: Float
}
event SentFunds {
amount: Float
user: User?
}
event ReceivedFunds {
amount: Float
user: User?
}
type User {
id: String
name: String?
}
```
### Scalar Types
| `String` | [`String`] | [`string`][ts] |
| `Int` | [`i32`] | [`number`][ts] |
| `Long` | [`i64`] | [`number`][ts] |
| `Float` | [`f32`] | [`number`][ts] |
| `Double` | [`f64`] | [`number`][ts] |
| `Bool` | [`bool`] | [`boolean`][ts] |
| `Bytes` | [`Vec<u8>`] | [`string`][ts] |
[`string`]: https://doc.rust-lang.org/stable/std/string/struct.String.html
[`i32`]: https://doc.rust-lang.org/stable/std/primitive.i32.html
[`i64`]: https://doc.rust-lang.org/stable/std/primitive.i64.html
[`f32`]: https://doc.rust-lang.org/stable/std/primitive.f32.html
[`f64`]: https://doc.rust-lang.org/stable/std/primitive.f64.html
[`bool`]: https://doc.rust-lang.org/stable/std/primitive.bool.html
[`vec<u8>`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html
[ts]: https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#the-primitives-string-number-and-boolean
### Optional & Required
Types can be marked as optional by adding the `?` suffix.
| Required | `T` | `String` |
| Optional | `T?` | `String?` |
### Repeating Types
Types can be repeated by wrapping them in `[]`.
| Single | `T` | `String` |
| Array | `[T]` | `[String]` |
Remember, we can mark types as optional, even in arrays.
| Optional Array | `[T?]?` | `[String?]?` |
| Required Array | `[T?]` | `[String?]` |
| Required Array Items | `[T]?` | `[String]?` |
| Required Array Items | `[T]` | `[String]` |
---
Integrates with [Thalo](https://github.com/thalo-rs/thalo) to generate Rust code.