SML
SML
is a simple markup language. It is designed to convert human readable information into
Rust data-structures. The focus is on simplicity, usability and hands-on control (no magic).
The format looks this,
hobbit:
name: "Frodo Baggins"
age: "98"
friends:
hobbit:
name: "Bilbo Baggins"
age: "176"
hobbit:
name: "Samwise Gamgee"
age: "66"
Data Format Rules
-
Indentation has meaning and is 4 spaces, relative to the top key.
-
All values must be double quoted.
-
Every key/value combination must be nested in a key. For example
hobbit: "Frodo"
by itself is invalid. It can be written:
hobbit:
name: "Frodo"
The motivation behind this is for the data format to distinguish clearly between whole data structures, which are headed by a key only, and parts of a data structure which are either key/value pairs, representing fields or variants, or other data-structures, which again are headed by a key only.
-
Separation of lines has meaning.
-
Keys may not include
:
. -
Double quotes in values must be escaped using
\"
. -
Everything after the second double quote is ignored (and can be used for commenting).
-
Empty lines or lines with whitespace only are ignored.
Basic Organization
------------------------from_str()-------------------------
| -------------path()-------------------- |
| | | |
| | FromSmall trait | |
| | --from_small()-- -- apply_path()-- | --from_str()--- |
| | | | | | | | | |
v v v | v | | v | |
-------- ---------- ------- ----------
|Hobbit| |SmallRef|-ref into->|Small| | String |
-------- ---------- ------- ----------
^ ^ | ^
| | | |
------------to_small()------------- --to_string()--
ToSmall trait
But most of the time, you can go directly from string to data-structure and back to string,
ignoring the Small
type in the middle. For example,
Example 1: From Small
-formatted String to Your Data-structure.
The following two examples should cover 90 percent of use cases. data-structure.
use ;
Most standard-library types are implemented for FromSmall
. To custom convert strings from
Small
values to your data-type, use from_val(s: &SmallRef, key_path: &str)
which returns a
Vec
of String
s or from_unique_val(s: &SmallRef, key_path: &str)
which provides a single
String
value. These can then be used in the FromSmall
implementation for your
data-structure.
Example 2: From Your Data-structure to a Small-formatted String.
To convert from a data-structure to a string,
use ;
println!;
// hobbit:
// name: "Frodo Baggins"
// age: "98"
// friends:
// hobbit:
// name: "Bilbo Baggins"
// age: "176"
// hobbit:
// name: "Samwise Gamgee"
// age: "66"