#arri #ronky #schema-version #section

ronky

A simple way to export Rust definitions to Arri types

57 releases (4 stable)

Uses new Rust 2024

new 1.0.3 May 3, 2025
0.0.36 Mar 17, 2025
0.0.23 Dec 23, 2024
0.0.20 Nov 27, 2024
0.0.1-a Jul 30, 2024

#233 in Rust patterns

Download history 176/week @ 2025-01-15 5/week @ 2025-01-22 101/week @ 2025-01-29 106/week @ 2025-02-05 145/week @ 2025-02-12 101/week @ 2025-02-19 152/week @ 2025-02-26 206/week @ 2025-03-05 159/week @ 2025-03-12 28/week @ 2025-03-19 210/week @ 2025-04-09 888/week @ 2025-04-16 465/week @ 2025-04-23 861/week @ 2025-04-30

2,424 downloads per month

GPL-3.0-or-later

115KB
1.5K SLoC

๐Ÿฑ RONKY ๐Ÿฑ

Crates.io Version Purrs Per Minute Cat Approved Rustacean Friendly

"Converting Rust types shouldn't be this purr-fect, but here we are..."

๐Ÿ˜บ What in the Whiskers is Ronky?

Imagine if your Rust types could speak other languages without learning a single foreign word. That's Ronky โ€“ your code's personal polyglot translator that speaks fluent Arri, turning your carefully crafted Rust types into schemas that even JavaScript developers can understand.

Born from the frustration of manual schema creation (and named after a particularly vocal cat), Ronky does the tedious work so you can focus on the important stuff โ€“ like deciding whether your next variable should be called data or info (we both know you'll pick data).

๐Ÿšง Paws at Work: Like a cat that's not quite finished knocking everything off your desk, Ronky is still under construction. Object serialization and deserialization are coming soon, probably right after this catnap. ๐Ÿšง

โœจ Features That Make You Go "Meow!"

Ronky doesn't just toss your types over the fence to Arri-land. It crafts them with the same attention to detail that a cat gives to knocking your most precious possessions off shelves:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          RONKY'S REPERTOIRE                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿงฌ Type Wizardry          โ”‚ - Transforms primitives with grace        โ”‚
โ”‚                           โ”‚ - Handles generic types without whining   โ”‚
โ”‚                           โ”‚ - Makes associated types feel welcome     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿงฉ Collection Conjuring   โ”‚ - Vectors become elegant "elements"       โ”‚
โ”‚                           โ”‚ - Maps manifest as "values" schemas       โ”‚
โ”‚                           โ”‚ - Optional types know when to disappear   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿ›ก๏ธ Guardian Features      โ”‚ - Strict mode keeps schemas pristine      โ”‚
โ”‚                           โ”‚ - Discriminators tag unions properly      โ”‚
โ”‚                           โ”‚ - Circular refs handled without dizziness โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿ”„ Transformation Magic   โ”‚ - Case transformations (snake โ†’ UPPER)    โ”‚
โ”‚                           โ”‚ - Field renaming for multilingual joy     โ”‚
โ”‚                           โ”‚ - Nullable marking for optional presence  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๐Ÿ“ Documentation Delight  โ”‚ - Comments become documentation           โ”‚
โ”‚                           โ”‚ - Deprecation warnings that don't nag     โ”‚
โ”‚                           โ”‚ - Metadata that brings joy to readers     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

With Ronky, your type schema generation is both:

  1. Compile-time verified - Errors at compile time, not at 3 AM when you're deploying
  2. Automatically generated - Because life's too short to manually update schemas

๐Ÿ’ก Pro Tip: Ronky's powers grow with your documentation. The more doc comments you add, the more magnificent your schemas become. It's like feeding treats to a cat โ€“ the rewards are well worth it.

๐Ÿค The Cool Cats Club (Compatible Crates)

Ronky has an extensive social network. Think of these crates as the neighborhood cats that regularly visit your backyard โ€“ they're all welcome and get special treatment:

TEMPORAL FRIENDS         ๐Ÿ•ฐ๏ธ  chrono, time
IDENTITY SPECIALISTS     ๐Ÿชช  uuid
BIG NUMBER EXPERTS       ๐Ÿ”ข  bigdecimal, num-bigint, num-bigfloat
PRECISION MASTERS        ๐Ÿ’ฐ  rust_decimal, decimal
WEB-SAVVY NAVIGATORS     ๐ŸŒ  url
DATA-HANDLING WIZARDS    ๐Ÿ“Š  bytes
CONCURRENT COMPANIONS    ๐Ÿงต  dashmap
ORDERLY ORGANIZERS       ๐Ÿ“‹  indexmap
OPTIMIZED PERFORMERS     โšก  smallvec

Each of these crates gets the VIP (Very Important Purring) treatment from Ronky. Their types are handled with the care and respect they deserve.

๐Ÿˆ Missing your favorite companion? Check if an issue exists, and if not, create one! The more the merrier in Ronky's compatible crates collection.

๐Ÿ“š The Illustrated Guide to Ronky

๐Ÿ”„ The Basic Transformation

use ronky::{Exportable, Exported, SCHEMA_VERSION};
use serde_json::{Value, from_str, to_string_pretty};

// Just add water (and a derive macro)
#[derive(Exported)]
#[arri(transform = "uppercase")] // LOUD NOISES
enum Result<T: Exportable, E: Exportable> {
    /// When things go right (rarely, if you're me)
    Ok(T),
    /// When things go wrong (my default state)
    Err(E),
}

fn main() {
    // Announce our intentions to the world
    println!("๐Ÿงช Creating an Arri {} schema and hoping for the best...", SCHEMA_VERSION);

    // The cat-alchemy happens here
    let schema_json = Result::<String, ()>::export()
        .serialize()
        .expect("this to work (please, I have deadlines)");

    // Humans like pretty things
    let pretty_json = to_string_pretty(&from_str::<Value>(&schema_json).unwrap()).unwrap();

    // Admire our handiwork
    println!("{}", pretty_json);

    // Now go make a cup of tea, you've earned it
}

๐Ÿงฉ The Advanced Cat-egory: Building Complex Types

use ronky::{Exportable, Exported, SCHEMA_VERSION};

/// Metadata about things (and sometimes other things)
#[derive(Exported)]
struct About<T: Exportable> {
    /// What we called it before marketing got involved
    #[deprecated(since = "1.0.0", note = "Use `firstName` and `lastName` instead")]
    name: String,

    /// The name that appears on your coffee cup at Starbucks
    first_name: String,

    /// The name your parents use when you're in trouble
    last_name: Option<String>,

    /// The number that makes you sigh at birthday parties
    age: u32,

    /// The subject of our obsession
    of: T,
}

/// A creature that creates Rust crates, ironically
#[derive(Exported)]
#[arri(strict)] // No surprises allowed! Like a cat with a cucumber
struct Human {
    /// Fellow code-monkeys who review your PRs
    friends: Vec<Human>, // Recursive types? No problem!

    /// The real owners of your home
    pets: Vec<About<Pet>>,
}

/// Fashion choices for the discerning feline
#[derive(Exported)]
#[arri(transform = ["snake_case", "uppercase"])] // MULTI_STYLE_TRANSFORMATION
enum CatColor {
    /// Like my coffee and my humor
    Black,

    /// Like my documentation standards and error handling
    White,

    /// Like my moral compass when it comes to optimization
    Gray,

    /// Like my commit history after a weekend hackathon
    MixedGrayWhite,
}

/// Entities that interrupt your Zoom calls at the worst possible moment
#[derive(Exported)]
#[arri(transform = "uppercase", discriminator = "species")]
enum Pet {
    Dog {
        /// The word you'll repeat 37 times at the dog park
        name: String,

        /// What you'll forget when the vet asks
        #[arri(nullable)]
        breed: Option<String>,
    },

    #[arri(rename = "cat")] // All hail the cat overlords!
    Lion {
        /// A suggestion they might consider responding to someday
        name: String,

        /// Their royal garment
        #[arri(nullable)]
        color: Option<CatColor>,
    },
}

๐Ÿ”ฅ Hot Tip: These examples aren't just decorative โ€“ they're functional! Copy, paste, and experience the magic of Ronky firsthand. Your future self will thank you when your API documentation is automatically up-to-date.

๐Ÿ“‹ Quick Reference

The Basics

  1. Add ronky to your Cargo.toml:

    [dependencies]
    ronky = "1.0.0"  # Check crates.io for the latest version
    
  2. Import the essentials:

    use ronky::{Exported, SCHEMA_VERSION};
    
  3. Decorate your types:

    #[derive(Exported)]
    struct MyType { /* fields */ }
    
  4. Export and serialize:

    let schema = MyType::export().serialize().unwrap();
    
  5. Profit! (This step is not automated by Ronky, sorry)

Attribute Options

  • #[arri(strict)] - No extra properties allowed
  • #[arri(transform = "snake_case")] - Transform enum variant names
  • #[arri(discriminator = "type")] - Set discriminator field name
  • #[arri(rename = "newName")] - Rename a field or variant
  • #[arri(nullable)] - Mark a field as nullable

๐Ÿˆ The Ronky Memorial Section

     /\_/\
    ( o.o )
     > ^ <
    /  O  \  "Meow meow, transform types meow."
                                    - Ronky (2010-2024)

This library immortalizes a magnificent cat named Ronky, named for his thunderous purrs (or "ronks" in Dutch). For 14 remarkable years, this whiskered genius supervised everything that happened in the house.

Despite battling acromegaly, Ronky maintained a proud dignity and an uncanny ability to walk across keyboards and make his presence known. His legacy continues in this library!

He passed away peacefully, surrounded by those who loved him, and will be deeply missed.

A beautiful picture of Ronky Photo by Startshot

๐ŸŒŸ Final Thought

Remember: Type conversion should be like a cat's nap โ€“ automatic, elegant, and requiring no effort on your part. Let Ronky handle the tedious work while you focus on building something amazing.

Now go pet your cat (or dog, or rubber duck) โ€“ they've been waiting patiently while you read this documentation. โค๏ธ

Dependencies

~0โ€“8MB
~51K SLoC