Skip to content

thalo-rs/esdl

Repository files navigation

ESDL

Event-sourcing Schema Definition Language


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.

Code generation

ESDL schemas can be used for code generation.

The Rust crate currently supports code generation for:

Additional languages may be added in the future. Contributions are welcome!

Example

aggregate BankAccount {
  open_account(initial_balance: Float!) OpenedAccount!
  deposit_funds(amount: Float!): ReceivedFunds!
  withdraw_funds(amount: Float!): SentFunds!
  transact(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

Scalar Rust Type TypeScript Type
String String string
Int i64 number
Float f64 number
Bool bool boolean
Timestamp DateTime<FixedOffset> Date

Optional & Required

Types can be marked as required by adding the ! suffix.

Type Syntax Example
Optional T String
Required T! String!

Repeating Types

Types can be repeated by wrapping them in [].

Type Syntax Example
Single T String
Array [T] [String]

Remember, we can mark types as required, even in arrays.

Type Syntax Example
Optional Array [T] [String]
Required Array [T]! [String]!
Required Array Items [T!] [String!]
Required Array Items [T!]! [String!]!

Integrates with Thalo to generate Rust code.