Skip to content

Repository files navigation

Between

A small language to describe DTOs and sync them between languages.

Warning

Very early prototype, many and all things subject to change as well as many feature gaps

Example

Given the following file demo.bt

prod User {
age Int,
name "$name" Str,
email Str?,
hobbies []?Str,
dateOfBirth Date,
Status,
UserData,
}
sumstr Status {
Active,
Disabled,
Pending "pending activation",
}
sum UserData {
AdminData,
CustomerData,
}
prod AdminData {
accessLevel Int,
}
prod CustomerData {
attributes Object,
}

Generates the following TypeScript code

exportinterfaceUser{age: number;$name: string;email?: string;hobbies?: string[];dateOfBirth: string;status: Status;userData: UserData;}exporttypeStatus="Active"|"Disabled"|"pending activation";exporttypeUserData=|{adminData: AdminData}|{customerData: CustomerData};exportinterfaceAdminData{accessLevel: number;}exportinterfaceCustomerData{attributes: Record<string,unknown>;}

and the following Go code

package demo
import (
"time"
)
typeUserstruct {
Ageint`json:"age"`Namestring`json:"$name"`Email*string`json:"email,omitEmpty"`Hobbies*[]string`json:"hobbies,omitEmpty"`DateOfBirth time.Time`json:"dateOfBirth"`StatusStatus`json:"status"`UserDataUserData`json:"userData"`
}
typeStatusstringconstStatus_ActiveStatus="Active"constStatus_DisabledStatus="Disabled"constStatus_PendingStatus="pending activation"typeUserDatastruct {
AdminData*AdminData`json:"adminData,omitEmpty"`CustomerData*CustomerData`json:"customerData,omitEmpty"`
}
typeAdminDatastruct {
AccessLevelint`json:"accessLevel"`
}
typeCustomerDatastruct {
Attributesmap[string]any`json:"attributes"`
}

TODOs

  • Use runes instead of bytes
  • Split ast and codegen input. Tokens should be part of the AST so that it can contain sugar and locations so it can be used for formatting.
  • Add support for doc comments
  • Add type checking
  • Add LSP support
  • Add support for more languages

Installation

go install github.com/brahms116/between/cmd/bt@latest

Usage

bt --input ./demo.bt --output ./result.go && gofmt -w ./result.go

or

bt --input ./demo.bt --output ./result.ts && prettier --write ./result.ts

About

A small language to describe DTOs and sync them between languages.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages