1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
//! # ๐ฑ RONKY ๐ฑ
//!
//! [](https://crates.io/crates/ronky)
//! [](https://github.com/modiimedia/arri)
//! [](https://github.com/modiimedia/arri)
//! [](https://github.com/modiimedia/arri)
//!
//! _"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](https://github.com/modiimedia/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:
//!
//! ```text
//! โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
//! โ 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:
//!
//! ```text
//! 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
//! 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?** Open an issue to suggest a new addition to Ronky's
//! > compatible crates collection. The more the merrier!
//!
//! ## ๐จโ๐ป The Story Behind Ronky
//!
//! Let me share the real origin story โ Ronky wasn't born from late-night caffeine-fueled frustration
//! (though there's been plenty of that in my coding career). It all started when a friend dropped a
//! Discord message with a link to the [Arri project](https://github.com/modiimedia/arri). One look at
//! what Arri was doing with type conversions and I was hooked.
//!
//! As a passionate Rustacean, I immediately thought: "This is brilliant! But it needs Rust support."
//! And thus Ronky was born โ creating a bridge between the elegant type system of Rust and the universal
//! schema language of Arri.
//!
//! I named it after my cat not just because he was adorable (though he absolutely was), but because
//! he embodied what good libraries should be โ helpful, reliable, and occasionally surprising you
//! with something delightful. Like Ronky the cat finding innovative ways to get treats without
//! moving, Ronky the library finds ways to update your API schemas without you lifting a finger.
//!
//! My hope is that this library saves you time, prevents those pesky "the API contract changed but
//! the docs didn't" bugs, and maybe โ just maybe โ frees up enough of your day to spend time with
//! your own four-legged friend (or fish, or rubber duck - whatever brings you joy).
//!
//! ## ๐ The Illustrated Guide to Ronky
//!
//! ### ๐ The Basic Transformation
//!
//! ```rust,ignore
//! 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),
//! }
//!
//!
//! // 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
//!
//! ```rust,ignore
//! 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.
//!
//! ## ๐ The Ronky Memorial Section
//!
//! ```text
//! /\_/\
//! ( o.o )
//! > ^ <
//! / O \ "Meow meow, transform types meow."
//! - Ronky (2010-2024)
//! ```
//!
//! This library immortalizes a magnificent cat named Ronky, whose thunderous purrs
//! (or "ronks" in Dutch) could wake the neighbors. 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. His legacy continues in this library!
//!
//! Ronky taught me important programming principles:
//!
//! - **Persistence**: If at first you don't succeed, meow louder until someone fixes it for you
//! - **Efficiency**: Why do something yourself when you can delegate?
//! - **Work-Life Balance**: No bug is so important that it can't wait until after a nap
//! - **Code Reviews**: Sometimes the best feedback is just silently judging from a distance
//!
//! This library aims to embody these principles by automating the tedious parts of
//! API development so you can focus on the parts that matter โ like figuring out why
//! your application works in development but not production (it's always CORS).
//!
//! ## ๐ Quick Reference
//!
//! ### The Basics
//!
//! 1. Add `ronky` to your `Cargo.toml`:
//! ```toml
//! [dependencies]
//! ronky = "1.0.0" # Check crates.io for the latest version
//! ```
//!
//! 2. Import the essentials:
//! ```rust,ignore
//! use ronky::{Exported, SCHEMA_VERSION};
//! ```
//!
//! 3. Decorate your types:
//! ```rust,ignore
//! #[derive(Exported)]
//! struct MyType { /* fields */ }
//! ```
//!
//! 4. Export and serialize:
//! ```rust,ignore
//! 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
//!
//! ## ๐ 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. โค๏ธ
extern crate ronky_derive;
pub use ;
extern crate arri_repr;
pub use *;
pub use ;
pub static SCHEMA_VERSION: &str = "v0.0.8";
// TODO: implement conversion from ATD to Rust types
// | ATD Type | Rust Type |
// |---|---|
// | string | String |
// | boolean | bool |
// | timestamp | DateTime |
// | float32 | f32 |
// | float64 | f64 |
// | int8 | i8 |
// | uint8 | u8 |
// | int16 | i16 |
// | uint16 | u16 |
// | int32 | i32 |
// | uint32 | u32 |
// | int64 | i64 |
// | uint64 | u64 |