Skip to content
Sabrina Jewson edited this page Apr 11, 2022 · 5 revisions

Welcome to the RON wiki, which tries to give a very basic specification for the RON format.

Structs

Structs with named fields can optionally start with their type name. The fields of the struct are wrapped with brackets (( and )). Trailing commas are (like everywhere else) allowed.

Examples

(
    field_name: 3.4,
    b: 'b',
)
(a: false,)
Vector2(
    x: 42.0,
    y: 5.0,
)

An empty struct with braces at the end:

struct Empty {}

Note that it gets deserialized like this:

Empty()

As you can see, there is no comma, but two brackets at the end. This is not true for unit structs, which are specified below.

Unit structs

Unit structs have two representations: Their name or ().

They're defined like this:

struct Unit;

Examples

Unit
()

Unit value

The unit value (()) has the same representation in RON.

Examples

()

Tuple structs

A tuple struct can be defined like this:

struct TupleStruct(f32, bool, String);

The RON version looks pretty much the same, but the name is optional.

Examples

TupleStruct(3.4, false, "Hey there!")
(
    4.3,
    true,
    "Looks different, doesn't it?",
)

Optionals

What serde describes as optional is just the representation of Rust's Option. RON again stays very close to Rust, so it's just Some(Value) or None.

Examples

Some(3.1415926535)
None

Lists

Collections of values with a variable element number are represented with [ and ] around them, separated by commas. Please note that serde handles fixed-size arrays as tuples, so this section is only valid for types like &[u32] and Vec<bool>, but not for [f32; 3].

Lists are homogeneous, so all elements have the same type.

Examples

[1, 2, 3,]
[
    22,
    26,
    34,
    41,
    46,
    56,
]

Maps

A map looks similar to a struct, but the keys are also values instead of identifiers. The brackets for a map are { and }.

Map keys are not required to be unique and the Rust implementation of RON does not enforce any restrictions on key uniqueness, but particular implementations of RON may exhibit unexpected behavior or throw errors if keys are not unique. When deriving Deserialize for a container, if you wish to enforce that map keys are unique you may want to use serde_with::rust::maps_duplicate_key_is_error.

Examples

{
    "monkey": "mesh/suzanne.obj",
}
{
    'a': 97,
    'd': 100,
}

Comments

Comments are denoted by //, wherever this appears indicates the rest of the line is a comment.

Examples

// This is a comment.
(
    field_name: 3.4, //This is another comment.
    b: 'b',
)