22 releases (5 stable)

2.0.0-rc.12 May 9, 2024
2.0.0-rc.7 Dec 4, 2023
2.0.0-rc.6 Oct 22, 2023
2.0.0-rc.1 Jul 17, 2023
0.0.2 Jul 31, 2022

#87 in Web programming

Download history 685/week @ 2024-02-03 691/week @ 2024-02-10 962/week @ 2024-02-17 1493/week @ 2024-02-24 810/week @ 2024-03-02 938/week @ 2024-03-09 734/week @ 2024-03-16 1780/week @ 2024-03-23 1869/week @ 2024-03-30 1164/week @ 2024-04-06 1014/week @ 2024-04-13 1030/week @ 2024-04-20 1577/week @ 2024-04-27 1716/week @ 2024-05-04 1370/week @ 2024-05-11 1355/week @ 2024-05-18

6,156 downloads per month
Used in 18 crates (14 directly)

MIT license

270KB
5.5K SLoC

Specta Logo

Specta

Easily export your Rust types to other languages

Discord Crates.io crates.io docs.rs License

Features

  • Export structs and enums to Typescript
  • Get function types to use in libraries like tauri-specta
  • Supports wide range of common crates in Rust ecosystem
  • Supports type inference - can determine type of fn demo() -> impl Type.

Ecosystem

Specta can be used in your application either directly or through a library which simplifies the process of using it.

  • rspc - Easily building end-to-end typesafe APIs
  • tauri-specta - Typesafe Tauri commands and events
  • TauRPC - Tauri extension to give you a fully-typed IPC layer.

Usage

Add specta as a dependency to your project, enabling the languages you want to export to:

cargo add specta --features typescript # only 'typescript' is currently supported

Then you can use Specta like so:

use specta::{ts, Type};

#[derive(Type)]
pub struct TypeOne {
    pub a: String,
    pub b: GenericType<i32>,
    #[serde(rename = "cccccc")]
    pub c: MyEnum,
}

#[derive(Type)]
pub struct GenericType<A> {
    pub my_field: String,
    pub generic: A,
}

#[derive(Type)]
pub enum MyEnum {
    A,
    B,
    C,
}

fn main() {
    assert_eq!(
        ts::export::<TypeOne>(&Default::default()).unwrap(),
        "export type TypeOne = { a: string; b: GenericType<number>; cccccc: MyEnum }".to_string()
    );
}

Check out the docs for more information.

Motivation

This library was originally created to power the type exporting functionality of rspc, but after building it we realized that it could be useful for other projects as well so we decided to move it into a dedicated library.

A huge thanks to Brendonovich for doing a heap of development on this library.

Dependencies

~0.5–13MB
~165K SLoC