# bincode-typescript

Generates TypeScript serialisation and deserialisation code from Rust structs
and enums

## Goals

- Generate TypeScript code directly from Rust source
- TypeScript must compile with [`strict` mode enabled](https://github.com/timfish/bincode-typescript/blob/master/tests/build.rs)
- Avoid Object Orientated TypeScript for better tree-shaking and optimisation
- TypeScript should be ergonomic and high performance
  - Use `const enum` for Unit enums and respect discriminant values!
  - Use `TypedArray` and copy byte blocks for `Vec<{integer,float}>` for greater performance

## Status

I'm pretty new to Rust and I've just hacked around until the tests pass 🤷‍♂️

There is much room for improvement and PRs are welcome!

Check the source for [currently supported Rust types and their TypeScript
equivalents](https://github.com/timfish/bincode-typescript/blob/master/src/types.rs#L30).

You may also like to look at the [Rust
types](https://github.com/timfish/bincode-typescript/blob/master/tests/test_types.rs)
used in the tests and the [TypeScript
generated](https://github.com/timfish/bincode-typescript/blob/master/tests/test_types.ts)
from these.

## Current Issues & Limitations

- All values must be owned
- Generic structs/enums will almost certainly cause a panic
- All types must be in a single file
- Serde attributes are not currently respected
- `Vec<T>` are always converted to `Uint8Array/Int8Array/etc` whenever possible
  and this might not always be desired.
- Generated code will not work on node < v11 due to the global usage of `TextEncoder/TextDecoder`

## Example via `build.rs`

There is currently a single `bool` option to enable support for node.js
`Buffer`, so if you are running in the browser you probably don't want this enabled.

```rust
bincode_typescript::from_file("./src/types.rs", "./ts/types.ts", false);
```

## Example via CLI

There is currently a single option (`--buffer-support`) to enable support for node.js
`Buffer`.

```shell
./bincode-typescript --support-buffer ./src/types.rs > ./ts/types.ts
```

## Tests

Before running the tests, ensure that you have all the node.js dependencies
installed by running `yarn` or `npm i`.

The tests check serialisation and deserialisation from generated TypeScript by
round-tripping encoded data via stdio and asserting the expected values.

## Prior Art

This builds on (ie. much TypeScript stolen from) the following projects.

_The stated pros and cons are just personal opinion!_

### [`ts-rust-bridge`](https://github.com/twop/ts-rust-bridge)

### Pros:

- Function based TypeScript API
- Great ergonomics for enums with combination of `type` + `interface` + `module`

### Cons:

- Generates both Rust and TypeScript from a DSL. (**I want Rust to be the source
  of truth**).
- Does not use `const enum` for Unit enums

### [`serde-reflection/serde-generate`](https://github.com/novifinancial/serde-reflection/pull/59)

### Pros:

- Uses `serde` so no messing around parsing Rust

### Cons:

- All types have to be run through the registry after build so wont work from `build.rs`
- TypeScript classes wrap every type and use inheritance (ie. no `const enum`)
- Runtime TypeScript is separate
