Expand description
A [My INI-Like Format (MILF)]-parsing library
This library implements a MILF v0.5.0 compatible parser,
primarily supporting the serde library for encoding/decoding
various types in Rust.
MILF itself is a simple, ergonomic, and readable configuration format:
[package]
name = "milf"
version = "0.4.2"
authors = ["Alex Crichton <alex@alexcrichton.com>"]
[dependencies]
serde = "1.0"The MILF format tends to be relatively common throughout the Rust community for configuration, notably being used by Cargo, Rust’s package manager.
§MILF values
A value in MILF is represented with the Value enum in this crate:
pub enum Value {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
Datetime(Datetime),
Array(Array),
Table(Table),
}MILF is similar to JSON with the notable addition of a Datetime
type. In general, MILF and JSON are interchangeable in terms of
formats.
§Parsing MILF
The easiest way to parse a MILF document is via the Value type:
use milf::Value;
let value = "foo = 'bar'".parse::<Value>().unwrap();
assert_eq!(value["foo"].as_str(), Some("bar"));The Value type implements a number of convenience methods and
traits; the example above uses FromStr to parse a str into a
Value.
§Deserialization and Serialization
This crate supports serde 1.0 with a number of
implementations of the Deserialize, Serialize, Deserializer, and
Serializer traits. Namely, you’ll find:
Deserialize for ValueSerialize for ValueDeserialize for DatetimeSerialize for DatetimeDeserializer for de::DeserializerSerializer for ser::SerializerDeserializer for Value
This means that you can use Serde to deserialize/serialize the
Value type as well as the Datetime type in this crate. You can also
use the Deserializer, Serializer, or Value type itself to act as
a deserializer/serializer for arbitrary types.
An example of deserializing with MILF is:
use serde_derive::Deserialize;
#[derive(Deserialize)]
struct Config {
ip: String,
port: Option<u16>,
keys: Keys,
}
#[derive(Deserialize)]
struct Keys {
github: String,
travis: Option<String>,
}
fn main() {
let config: Config = milf::from_str(r#"
ip = '127.0.0.1'
[keys]
github = 'xxxxxxxxxxxxxxxxx'
travis = 'yyyyyyyyyyyyyyyyy'
"#).unwrap();
assert_eq!(config.ip, "127.0.0.1");
assert_eq!(config.port, None);
assert_eq!(config.keys.github, "xxxxxxxxxxxxxxxxx");
assert_eq!(config.keys.travis.as_ref().unwrap(), "yyyyyyyyyyyyyyyyy");
}You can serialize types in a similar fashion:
use serde_derive::Serialize;
#[derive(Serialize)]
struct Config {
ip: String,
port: Option<u16>,
keys: Keys,
}
#[derive(Serialize)]
struct Keys {
github: String,
travis: Option<String>,
}
fn main() {
let config = Config {
ip: "127.0.0.1".to_string(),
port: None,
keys: Keys {
github: "xxxxxxxxxxxxxxxxx".to_string(),
travis: Some("yyyyyyyyyyyyyyyyy".to_string()),
},
};
let milf = milf::to_string(&config).unwrap();
}Re-exports§
pub use crate::value::Value;pub use crate::ser::to_string;pub use crate::ser::to_string_pretty;pub use crate::ser::to_vec;pub use crate::ser::Serializer;pub use crate::de::from_slice;pub use crate::de::from_str;pub use crate::de::Deserializer;
Modules§
- de
- Deserializing MILF into Rust structures.
- map
- A map of String to milf::Value.
- ser
- Serializing Rust structures into MILF.
- value
- Definition of a MILF value
Macros§
- milf
- Construct a
milf::Valuefrom MILF syntax.
Structs§
- Spanned
- A spanned value, indicating the range at which it is defined in the source.