# tsync
A utility to generate typescript types from rust code.
# Install
There are two parts to this:
1. The CLI tool:
```
cargo install tsync
```
2. The dependency for rust projects (to use the `#[tsync]` attribute; see usage below)
```
/// Cargo.toml
tsync = "X.Y.Z"
```
# Usage
Mark structs with `#[tsync]` as below:
```rust
/// src/main.rs
use tsync::tsync;
/// Doc comments are preserved too!
#[tsync]
struct Book {
name: String,
chapters: Vec,
user_reviews: Option>
}
#[tsync]
struct Chapter {
title: String,
pages: u32
}
#[tsync]
/// Time in UTC seconds
type UTC = usize;
```
Then use the CLI tool:
```sh
tsync -i ./src -o types.d.ts
```
And voilĂ !
```ts
/// types.d.ts
/* This file is generated and managed by tsync */
// Doc comments are preserved too!
interface Book {
name: string
chapters: Array
user_reviews: Array | undefined
}
interface Chapter {
title: string
pages: number
}
// Time in UTC seconds
type UTC = number
```
## Multiple Inputs
You can specify many inputs (directories and/or files) using the `-i` flag multiple times, like so:
```sh
tsync -i directory1 -i directory2 -o types.d.ts
```
## Multiple Outputs
It might help to create multiple typing files for your project. It's easy, just call tsync multiple times:
```sh
tsync -i src/models -o models.d.ts
tsync -i src/api -o api.d.ts
```
# Usage as a library
In the case that installing `tsync` globally isn't an option (or causes other concerns), you can use it as a library.
1. Add the library to your project:
```sh
cargo add tsync@1
```
2. Create a new binary in your project which uses the crate (for example, `bin/tsync.rs`):
```rust
// bin/tsync.rs
use std::path::PathBuf;
pub fn main() {
let dir = env!("CARGO_MANIFEST_DIR");
let inputs = vec![PathBuf::from_iter([dir, "backend"])];
let output = PathBuf::from_iter([dir, "frontend/src/types/rust.d.ts"]);
tsync::generate_typescript_defs(inputs, output, false);
}
```
3. Create a `Cargo.toml` binary entry:
```toml
[[bin]]
name = "tsync"
path = "bin/tsync.rs"
```
4. Execute!
```sh
cargo run --bin tsync
```
**Protip**: to use `cargo tsync`, create an alias in `.cargo/config`:
```toml
[alias]
tsync="run --bin tsync"
```
# Errors
A list of files which can't be opened or parsed successfully are listed after executing `tsync`. For other errors, try using the `--debug` flag to pinpoint issues. Please use the Github issue tracker to report any issues.
# Docs
See `tsync --help` for more information.
Feel free to open tickets for support or feature requests.
# Development/Testing
Use `./test/test_all.sh` to run tests.
After running the test, there should be no unexpected changes to files in `./test` (use `git status` and `git diff` to see if there were any changes).
# License
This tool is distributed under the terms of both the MIT license and the Apache License (Version 2.0).
See LICENSE-APACHE, LICENSE-MIT, and COPYRIGHT for details.