tyzen-macro 0.1.8

Procedural macros for the tyzen crate.
Documentation

Tyzen ⚑

Tyzen is a high-performance developer tool that bridges the gap between Rust and TypeScript. Its primary goal is to provide a seamless, type-safe development experience (DX) by automating the synchronization of data structures and API definitions.

While Tyzen was built with Tauri in mind, its core is a generic, lightning-fast type generator that can be used in any Rust/TS project.

✨ Why Tyzen?

  • πŸš€ Performance: Generates complex TypeScript bindings in milliseconds.
  • πŸ› οΈ Developer Experience (DX): Zero-config command registration and strongly-typed events.
  • πŸ“¦ Transparency: Keeps your code clear and explicit.
  • πŸ”Œ Tauri Integration: First-class support for Tauri commands and events with automatic registration.

πŸš€ Quick Start

1. Add Dependencies

For core type generation:

cargo add tyzen
cargo add serde --features derive

For Tauri integration (Optional):

cargo add tyzen-tauri

2. Define Your Types (Rust)

Tyzen uses simple attributes to mark structs, enums, and functions.

use serde::{Serialize, Deserialize};

// 1. Convert any Rust struct/enum to TS
#[derive(tyzen::Type, Serialize, Deserialize)]
pub struct User {
    pub id: u32,
    pub name: String,
}

// 2. Define a typed Event
#[derive(tyzen::Type, tyzen::Event, Serialize)]
pub struct WelcomeEvent {
    pub message: String,
}

3. Setup the Generator

In your main.rs (or any build/tool script), initialize the generator:

fn main() {
    tyzen::generate("../src/bindings.ts");
}

πŸ”Œ Tauri Integration

For Tauri projects, tyzen-tauri provides a wrapper that automates command registration and event handling.

1. Define Tauri Commands

#[tauri::command]
#[tyzen_tauri::command] // Marks for TS generation & auto-registration
pub fn create_user(name: String) -> Result<User, String> {
    Ok(User { id: 1, name })
}

2. Setup Generator & Handler

fn main() {
    // 1. Generate TS bindings with Tauri support
    #[cfg(debug_assertions)]  
    tyzen_tauri::generate("../src/bindings.ts"); 

    // 2. Setup Tauri with auto-registration
    tauri::Builder::default()
        .invoke_handler(tyzen_tauri::handler!()) // Auto-registers all #[tyzen_tauri::command]
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

πŸ’» Frontend Usage (TypeScript/React)

Tyzen creates a clean, intuitive API for your frontend.

import { useEffect, useState } from 'react';
import { commands, events } from "./bindings";

function App() {
  const [status, setStatus] = useState("Ready");

  useEffect(() => {
    // 1. Call a command (Type-safe Promise)
    commands.createUser("rzust").then(res => {
       if (res.status === 'ok') console.log("Success:", res.data);
    });

    // 2. Listen to an event (Fluent API)
    const unlisten = events.welcome.listen((payload) => {
      setStatus(`Message: ${payload.message}`);
    });

    return () => { unlisten.then(f => f()); };
  }, []);

  return <h1>{status}</h1>;
}

πŸ“– Feature Guide

Standard Type Conversion

Use #[derive(tyzen::Type)] on any Rust type. It supports primitives, Vec, Option, HashMap, and even complex Generics.

Tauri Commands

Tyzen requires both #[tauri::command] and #[tyzen_tauri::command] for clarity.

  • #[tauri::command]: Tells Tauri this is an invocable command.
  • #[tyzen_tauri::command]: Tells Tyzen to generate TS metadata and include it in the handler!() macro.

Typed Events

When you derive tyzen::Event, Tyzen adds a helper .emit(&handle) method to your struct:

let event = WelcomeEvent { message: "Hi!".into() };
event.emit(&handle).ok(); // Correctly types the payload for the frontend

πŸ—ΊοΈ Roadmap & Status

Feature Importance Notes
Full Serde Parity BASELINE flatten, alias, default, and rename_all support. Requires inter-type metadata.
Validation Sync BASELINE Bridge validator rules (Rust) directly into Zod schemas (TS).
Namespaces NON-NEGOTIABLE Crucial for organization; prevents naming collisions in large projects.
Zod Support NON-NEGOTIABLE Generate Zod schemas alongside types for runtime frontend validation.
Result & Error NON-NEGOTIABLE Deep support for custom Rust error types in command return signatures.
Constant Export NON-NEGOTIABLE Sync pub const logic values from Rust to TS.
Mock Client NON-NEGOTIABLE Generate mock JS/TS clients for testing/UI prototyping without the backend.
Doc Propagation TAKE-A-LOOK Transform Rust doc comments (///) into TSDoc (/** ... */).
Binary Data TAKE-A-LOOK Map Vec<u8> to Uint8Array/ArrayBuffer for optimized Tauri IPC.

πŸ“¦ Packages

  • tyzen: The core engine for type conversion.
  • tyzen-macro: Procedural macros for Type and Event.
  • tyzen-tauri: Specialized integration for Tauri (commands, event emitters, and TS glue code).

πŸ“œ License

Distributed under the MIT / Apache-2.0 License.