0.0.11 - This version is safe to use because it has no known security vulnerabilities at this time. Find out if your coding project uses this component and get notified of any reported security vulnerabilities with Meterian-X Open Source Security Platform
Maintain your licence declarations and avoid unwanted licences to protect your IP the way you intended.
MIT - MIT Licensefn 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 |
Basic types work, structs/enums in progress |
| OpenAPI | 🚧 Partial | specta-openapi |
Primitives work, complex types in progress |
| Go | 🚧 Planned | specta-go |
Go structs and interfaces |
| Kotlin | 🚧 Planned | specta-kotlin |
Kotlin data classes and sealed classes |
| JSON Schema | 🚧 Planned | specta-jsonschema |
JSON Schema generation |
| Zod | 🚧 Planned | specta-zod |
Zod schema validation |
| Python | 🚧 Planned | specta-python |
Python dataclasses and type hints |
| C# | 🚧 Planned | specta-csharp |
C# classes and enums |
| Java | 🚧 Planned | specta-java |
Java POJOs and enums |
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:
# Core Specta library
cargo add specta
# Language exporters (choose one or more)
cargo add specta_typescript # TypeScript (stable)
cargo add specta_swift # Swift (stable)
cargo add specta_rust # Rust (partial - basic types)
cargo add specta_openapi # OpenAPI/Swagger (partial - primitives)
# cargo add specta_go # Go (planned)
# cargo add specta_kotlin # Kotlin (planned)
# cargo add specta_jsonschema # JSON Schema (planned)
# cargo add specta_zod # Zod schemas (planned)Then you can use Specta like following:
use specta::{Type, Types};
use specta_typescript::Typescript;
#[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() {
let types = Types::default()
// You don't need to specify `GenericType` or `MyEnum` because they are referenced by `TypeOne`
.register::<TypeOne>();
Typescript::default()
.export_to("./bindings.ts", &types)
.unwrap();
// if you need more control over file saving
assert_eq!(
Typescript::default().export(&types).unwrap(),
r#"// This file has been generated by Specta. DO NOT EDIT.
export type GenericType<A> = { my_field: string; generic: A };
export type MyEnum = "A" | "B" | "C";
export type TypeOne = { a: string; b: GenericType<number>; cccccc: MyEnum };
"#
);
}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<String>,
}
fn main() {
let types = Types::default()
.register::<User>();
// 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<L, R> {
Left(L),
Right(R),
}
#[derive(Type)]
pub struct GenericType<A> {
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.