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,
text
hobbit:
name: "Frodo Baggins"
age: "98"
friends:
hobbit:
name: "Bilbo Baggins"
age: "176"
hobbit:
name: "Samwise Gamgee"
age: "66"
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.
text
------------------------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,
Small-formatted String to Your Data-structure.The following two examples should cover 90 percent of use cases. data-structure.
```rust use small::{Small, FromSmall, SmallError};
struct Hobbit {
name: String,
age: u32,
friends: Vec
impl FromSmall for Hobbit {
fn from_small(s: SmallRef) -> Result
fn main() { let s = r#" hobbit: name: "Frodo Baggins" age: "98" friends: hobbit: name: "Bilbo Baggins" age: "176" hobbit: name: "Samwise Gamgee" age: "66""#;
let frodo = Hobbit::from_str_debug(s);
} ```
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 Strings 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.
To convert from a data-structure to a string,
```rust use sml::{Small, ToSmall, SmallError};
struct Hobbit {
name: String,
age: u32,
friends: Vec
impl ToSmall for Hobbit {
fn tosmall(&self, key: &str) -> Result {
Small::join("hobbit", &vec!(
self.name.tosmall("name")?,
self.age.tosmall("age")?,
self.friends.tosmall("friends")?,
self.bicycle.to_small("bicycle")?,
))
}
}
println!("{}", frodo::key("hobbit"));
// hobbit: // name: "Frodo Baggins" // age: "98" // friends: // hobbit: // name: "Bilbo Baggins" // age: "176" // hobbit: // name: "Samwise Gamgee" // age: "66" ```