props_rs/
lib.rs

1//! `props-rs` is a library which parses a `.properties` file format as specified
2//! by the [Oracle documentation](https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s0204propertiesfileformat01.html)
3//!
4//!
5//! ```
6//! use props_rs::*;
7//!
8//! let properties = br"
9//! key1=value1
10//! key2=value2
11//! key3=value3
12//! ";
13//! let parsed = parse(properties).unwrap();
14//! let properties = to_map(parsed);
15//!
16//! assert_eq!("value1", properties.get("key1").unwrap());
17//! assert_eq!("value2", properties.get("key2").unwrap());
18//! assert_eq!("value3", properties.get("key3").unwrap());
19//! ```
20#![deny(missing_docs)]
21#![deny(rustdoc::missing_crate_level_docs)]
22
23mod parser;
24pub use parser::Property;
25use std::collections::HashMap;
26
27/// Parses a properties file and returns a [`Vec`] of properties. There may
28/// potentially be properties with duplicate keys in the returned [`Vec`].
29///
30/// Use the [`to_map`] convenience function to convert the vec into a set of
31/// properties with unique keys.
32pub fn parse(input: &[u8]) -> Result<Vec<Property>, nom::Err<nom::error::Error<&[u8]>>> {
33    match parser::parser(input) {
34        Ok((_, v)) => Ok(v),
35        Err(e) => Err(e),
36    }
37}
38
39/// A convenience function which converts a [`Vec`] of [`Property`] into a set of
40/// [`Property`] stored in a [`HashMap`]
41pub fn to_map(props: Vec<Property>) -> HashMap<String, String> {
42    let mut map = HashMap::with_capacity(props.len());
43    for prop in props.iter() {
44        map.insert(prop.key.clone(), prop.value.clone());
45    }
46    map
47}
48
49#[cfg(test)]
50mod tests {
51    use super::parse;
52    use super::to_map;
53
54    #[test]
55    pub fn test_parse_simple() {
56        let v = br"
57property=test
58property2=test
59";
60        let res = parse(v);
61        assert_eq!(2, res.unwrap().len());
62    }
63
64    #[test]
65    pub fn test_broken_parse() {
66        let v = br"=test
67";
68        assert_eq!(true, parse(v).is_err());
69    }
70
71    #[test]
72    pub fn test_map_conversion() {
73        let v = br"
74property=test
75property2=test
76property=t
77";
78        let res = to_map(parse(v).unwrap());
79        assert_eq!(2, res.len());
80        assert_eq!("t", res.get("property").unwrap());
81        assert_eq!("test", res.get("property2").unwrap());
82    }
83}