Crates.io | utility-types |
lib.rs | utility-types |
version | 0.0.3 |
source | src |
created_at | 2021-11-26 02:20:23.511942 |
updated_at | 2024-06-16 04:40:39.422465 |
description | This crate use proc-macro to realize several utility types of TypeScript |
homepage | |
repository | https://github.com/duskmoon314/utility-rs.git |
max_upload_size | |
id | 487864 |
size | 37,987 |
This crate use proc-macro to realize several utility types of Typescript in Rust.
macro | Typescript Utility Type |
---|---|
[Partial] | Partial<Type> |
[Pick] | Pick<Type, Keys> |
[Omit] | Omit<Type, Keys> |
[Extract] | Extract<Type, Union> |
[Exclude] | Exclude<UnionType, ExcludedMembers> |
Here is an example of how to use this crate.
use utility_types::{Omit, Partial, Pick, Required};
#[derive(Clone, Partial, Required, Pick, Omit)]
#[partial(ident = PartialFoo, derive(Debug, PartialEq))]
#[required(ident = RequiredFoo, derive(Debug, PartialEq))]
#[pick(arg(ident = PickAB, fields(a, b), derive(Debug, PartialEq)))]
#[omit(arg(ident = OmitCD, fields(c, d), derive(Debug, PartialEq)))]
pub struct Foo {
a: u8,
b: Option<u8>,
c: Option<Vec<u8>>,
}
The above code will generate the following code.
#[derive(Debug, PartialEq)]
pub struct PartialFoo {
a: Option<u8>,
b: Option<Option<u8>>,
c: Option<Option<Vec<u8>>>,
}
#[derive(Debug, PartialEq)]
pub struct RequiredFoo {
a: u8,
b: u8,
c: Vec<u8>,
}
#[derive(Debug, PartialEq)]
pub struct PickAB {
a: u8,
b: Option<u8>,
}
#[derive(Debug, PartialEq)]
pub struct OmitCD {
a: u8,
b: Option<u8>,
}
Some useful traits are also generated:
From<Foo>
for PartialFoo
, PickAB
, OmitCD
From<PartialFoo>
for Foo
Currently I don't analyze which generic is used in the generated struct or enum. So rustc will complain if the field with generic is not included in the generated struct or enum.