KEON is a human readable object notation / serialization format that syntactic similar to Rust and completely supports Serde's data model.
Cheat sheet
Unit | () |
---|---|
Booleans | true , false |
Numbers | 42 , 0x1123 , -1 , 3.14 , inf , NaN |
Chars | 'A' , '✱' , '\n' , '\u{3000}' |
Strings | "Hello" , `"raw string ^o^/"` |
Bytes | b"Hello" , b`"raw bytes ^o^/"` , b64"Sy0tQWV0aGlheA" |
Options | ? , ? Thing |
Tuples | (T,) , (T, U, V) |
Lists | ["abc", "def"] |
Maps | { 1 => 2, 3 => 4 } |
Structs | (Struct) { field1: "value1", field2: "value2" } |
Variants | Enum::Variant , Variant |
And the Paragraphs, leave anything after the start sign of each line intact:
As is newline |
|
Space-joined line (will trim spaces) |
|
Joined line (will trim spaces) |
|
The start signs can be mixed, but the first must be the vertical-bar |
.
(Save) { // <- optional struct name.
greeting: "Hello world!",
keybinds: {
Action::Up => 'W', // <- optional enum name.
Action::Down => 'S',
Action::Left => 'A',
Action::Right => 'D',
},
difficulty_factor: 4.3,
respawn_point: ( // <- can use parentheses `(` for tuple `)`.
1107.1487,
1249.0458,
),
inventory: [
Item::Water,
Item::CannedFood,
Item::IdCard > 101, // <- newtype variant.
Item::RocketLauncher {
damage: 250,
explosion_radius: 60.0,
},
],
}
{
"greeting": "Hello world!",
"keybinds": {
"A": "Left",
"D": "Right",
"S": "Down",
"W": "Up"
},
"difficulty_factor": 4.3,
"respawn_point": [
1107.1487,
1249.0458
],
"inventory": [
"Water",
"CannedFood",
{
"IdCard": 101
},
{
"RocketLauncher": {
"damage": 250,
"explosion_radius": 60.0
}
}
]
}
- Less syntactic noise, more intuitive look.
- Allow comments and trailing commas.
- Write KEON almost like you write Rust:
- Humanized optional type annotation.
- Distinguishable between tuples and lists (seqs).
- Arbitrary type as dictionary (map) keys.
- ...
- Shorthand for newtypes.
- Support use Base64, Base32 and Base16 to represent bytes.
- Provide paragraphs may be helpful when writing something by hand.
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct MyData {
msg: String,
float: f32,
}
fn main() {
let dat: MyData = keon::from_str(r#"{ msg: "Hello!", float: 1123. }"#).unwrap();
println!("KEON: {}", keon::to_string(&dat).unwrap());
println!("Pretty KEON: {}", keon::to_string_pretty(&dat).unwrap());
}