Props-Util
A Rust library for easily loading and parsing properties files into strongly-typed structs.
Overview
Props-Util provides a procedural macro that allows you to derive a Properties trait for your structs, enabling automatic parsing of properties files into your struct fields. This makes configuration management in Rust applications more type-safe and convenient.
Features
- Derive macro for automatic properties parsing
- Support for default values
- Type conversion from string to your struct's field types
- Error handling for missing or malformed properties
- Support for both file-based and default initialization
Installation
Add the following to your Cargo.toml:
[]
= "0.1.0" # Replace with the actual version
Usage
Basic Example
- Define a struct with the
Propertiesderive macro:
use Properties;
- Load properties from a file:
- Create a properties file (e.g.,
config.properties):
Attribute Parameters
The #[prop] attribute accepts the following parameters:
key: The property key to look for in the properties file (required)default: A default value to use if the property is not found in the file (optional)
Field Types
Props-Util supports any type that implements FromStr. This includes:
String- Numeric types (
u8,u16,u32,u64,i8,i16,i32,i64,f32,f64) - Boolean (
bool) Vec<T>whereTimplementsFromStr(values are comma-separated in the properties file)- Custom types that implement
FromStr
Example of using Vec types:
In the properties file:
Error Handling
The from_file method returns a std::io::Result<T>, which will contain:
Ok(T)if the properties file was successfully parsedErrwith an appropriate error message if:- The file couldn't be opened or read
- A required property is missing (and no default is provided)
- A property value couldn't be parsed into the expected type
- The properties file is malformed (e.g., missing
=character)
Default Initialization
You can also create an instance with default values without reading from a file:
let config = default?;
This will use the default values specified in the #[prop] attributes.
Initialization from HashMap
You can also create an instance directly from a std::collections::HashMap<&str, &str>:
use HashMap;
let mut props = new;
props.insert;
props.insert;
props.insert;
let config = from_hash_map?;
This method is useful if you already have the configuration data in a HashMap, for example, loaded from a different source or constructed dynamically. Property keys and values are expected to be string slices (&str), and type conversion and default values work the same way as from_file.
Advanced Example
Here's a more comprehensive example showing nested configuration:
use Properties;
Properties File Format
The properties file follows a simple key-value format:
- Each line represents a single property
- The format is
key=value - Lines starting with
#or!are treated as comments and ignored - Empty lines are ignored
- Leading and trailing whitespace around both key and value is trimmed
Example:
# Application settings
# Database configuration
# Logging settings
# Network settings
# Features
Limitations
- Only named structs are supported (not tuple structs or enums)
- All fields must have the
#[prop]attribute - The
keyparameter is required for all fields - Properties files must use the
key=valueformat