Skip to content

nobane/reflect_to

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Reflect To

  • Generate type information in other languages based on rust types.
    • Adhere to serde serialization behaviors whenever possible.
  • Builds upon a reusable rtti foundation in rust.
  • Supported language type conversions:
    • typescript via typescriptflag (on by default)
    • python via python flag
      • NOTE: Still an active WIP!

Typescript Example

By using the Reflect derive:

use reflect_to::Reflect;
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, path::PathBuf};

#[derive(Reflect, Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct User {
    email: String,
    is_active: bool,
    uploaded_files: Vec<UserPost>,
    profile_image: Option<String>,
    settings: UserSettings,
    status: UserStatus,
}

#[derive(Reflect, Serialize, Deserialize, Debug, Clone)]
pub enum UserStatus {
    Offline,
    Online { status: String },
    Unknown(String),
}

#[derive(Reflect, Serialize, Deserialize, Debug, Clone)]
pub struct UserPost {
    post_name: Option<String>,
    contents: Vec<String>,
}

#[derive(Reflect, Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct UserSettings {
    theme_path: PathBuf,
    email_notifications: bool,
    #[serde(rename = "custom")]
    custom_settings: HashMap<String, String>,
}

the following type information can be generated at runtime (for instance as part of a wasm build process):

export interface User {
    email: string;
    isActive: boolean;
    uploadedFiles: UserPost[];
    profileImage: string | null;
    settings: UserSettings;
    status: UserStatus;
}

export type UserStatus =
    "Offline"
    | { "Online": {
        status: string;
    } }
    | { "Unknown": string }

export interface UserPost {
    post_name: string | null;
    contents: string[];
}

export interface UserSettings {
    themePath: string
    emailNotifications: boolean
    custom: Record<string, string>;
}

Demo

Run one of the examples via

cargo run --example to_python

or

cargo run --example to_typescript

Documentation

For now, the best documentation is the typescript and python examples.

About

Generate type information in other languages based on rust types.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages