Easily export your Rust types to other languages
fn demo() -> impl Type| Language | Status | Exporter | Features |
|---|---|---|---|
| TypeScript | ✅ Stable | specta-typescript |
Full type support, generics, unions |
| Swift | ✅ Stable | specta-swift |
Idiomatic Swift, custom Codable, Duration support |
| Rust | Partial | specta-rust |
Rust source, modules, generics; structural wire-only shapes error |
| OpenAPI | Partial | specta-openapi |
OpenAPI 3.0 schemas, generics, JSON and YAML |
| Go | Partial | specta-go |
Structs, generics, string enums, layouts, Serde |
| Kotlin | Partial | specta-kotlin |
Data/sealed classes, generics, optional Kotlinx |
| JSON Schema | Partial | specta-jsonschema |
Draft 7/2019-09/2020-12, generics, Serde |
| Zod | Partial | specta-zod |
Zod 4 schemas, inferred types, generics, layouts |
| Valibot | Partial | specta-valibot |
Valibot schemas, inferred types, generics, layouts |
| Python | Partial | specta-python |
Python 3.13 TypedDicts and type hints |
| C# | Partial | specta-csharp |
Records, enums, generics, namespaces, file layouts |
| Java | Partial | specta-java |
Java 17 records, enums, and sealed interfaces |
The Specta ecosystem is actively developed with varying levels of completeness:
For the most up-to-date status of each exporter, check the individual crate documentation and issue trackers.
Specta can be used in your application either directly or through a library which simplifies the process of using it.
Add the specta crate along with any Specta language exporter crate:
…Then you can use Specta like following:
…You can export the same types to multiple languages:
use specta::{Type, Types};
use specta_typescript::Typescript;
use specta_swift::Swift;
#[derive(Type)]
pub struct User {
pub id: u32,
pub name: String,
pub email: Option,
}
fn main() {
let types = Types::default()
.register::();
// Export to TypeScript (stable)
Typescript::default()
.export_to("./types.ts", &types)
.unwrap();
// Export to Swift (stable)
Swift::default()
.export_to("./Types.swift", &types)
.unwrap();
// Note: Other exporters are in development
}A common use case is to export all types for which specta::Type is derived into a single file:
//! NOTE: This example requires the `export` feature on the `specta` crate
use specta::Type;
use specta_typescript::Typescript;
#[derive(Type)]
pub enum MyEither {
Left(L),
Right(R),
}
#[derive(Type)]
pub struct GenericType {
pub my_field: String,
pub generic: A,
}
#[derive(Type)]
pub enum MyEnum {
A,
B,
C,
}
#[derive(Type)]
#[specta(collect = false)]
pub struct DontExportMe {
field: String,
}
fn main() {
Typescript::default()
.export_to("./bindings.ts", &specta::export())
.unwrap();
}Check out the docs for more information.
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 early development on this library.
No open issues yet, or sync has not completed.