-
Notifications
You must be signed in to change notification settings - Fork 123
Specification
Welcome to the RON wiki, which tries to give a very basic specification for the RON format.
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.
(
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 have two representations: Their name or ()
.
They're defined like this:
struct Unit;
Unit
()
The unit value (()
) has the same representation in RON.
()
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.
TupleStruct(3.4, false, "Hey there!")
(
4.3,
true,
"Looks different, doesn't it?",
)
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
.
Some(3.1415926535)
None
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.
[1, 2, 3,]
[
22,
26,
34,
41,
46,
56,
]
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
.
{
"monkey": "mesh/suzanne.obj",
}
{
'a': 97,
'd': 100,
}
Comments are denoted by //
, wherever this appears indicates the rest of the line is a comment.
// This is a comment.
(
field_name: 3.4, //This is another comment.
b: 'b',
)