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}