pulse-schema-derive 0.1.0-alpha.1

Rust proc-macro attributes for generating Pulse Schema Language (PSL) from native Rust types
Documentation

pulse-schema-derive

Rust proc-macro attributes for generating Pulse Schema Language (PSL) from native Rust types.

Overview

Write your schemas as standard Rust structs, enums, and traits — the proc macros emit canonical .psl files at compile time, giving you type-safe schema definitions verified by the Rust compiler.

Quick Start

Add to your Cargo.toml:

[dependencies]
pulse-schema-derive = "0.1"

Define your schema:

use pulse_schema_derive::{pulse_type, pulse_enum, pulse_error, pulse_service, collection, auth};

#[pulse_type]
#[collection]
struct User {
    id: String,
    name: String,
    age: i32,
    preferences: Vec<String>,
    avatar: Vec<u8>,
    is_active: bool,
    optional_bio: Option<String>,
}

#[pulse_enum]
enum Role {
    Admin,
    Moderator,
    User,
}

#[pulse_error]
enum ProfileError {
    NotFound { id: String },
    ValidationFailed { message: String },
}

#[pulse_service]
trait UserService {
    #[auth("bearer")]
    fn create_user(name: String, age: i32) -> Result<User, ProfileError>;
}

Running cargo build generates a schema.psl file:

@collection
message User {
  id: string;
  name: string;
  age: int;
  preferences: string[];
  avatar: bytes;
  is_active: boolean;
  optional_bio: string?;
}

enum Role {
  Admin,
  Moderator,
  User,
}

error ProfileError {
  NotFound {
    id: string;
  },
  ValidationFailed {
    message: string;
  },
}

service UserService {
  @auth("bearer")
  rpc create_user(name: string, age: int) -> User ! ProfileError;
}

Type Mappings

Rust Type PSL Type
String string
i32, i64, u32, u64 int
f32, f64 float
bool boolean
Vec<u8> bytes
Vec<T> T[]
Option<T> T?
HashMap<K, V> map<K, V>
Result<T, E> -> T ! E (in services)

Attributes

Attribute Target PSL
#[pulse_type] struct message Name { ... }
#[pulse_enum] enum enum Name { ... }
#[pulse_error] enum error Name { ... }
#[pulse_service] trait service Name { ... }
#[collection] struct @collection
#[auth("...")] fn @auth("...")

Cross-Format Compatibility

This crate produces identical PSL output to the TypeScript DSL (@pulse/schema). Both are on-ramps to native PSL — the canonical format used for codegen, validation, and database mapping.

License

MIT