| Crates.io | doless |
| lib.rs | doless |
| version | 0.3.0 |
| created_at | 2025-02-27 08:58:52.770212+00 |
| updated_at | 2025-03-01 07:15:31.867674+00 |
| description | A Rust macro to simplify struct mapping and function utilities. |
| homepage | |
| repository | https://github.com/nawajar/DoLess |
| max_upload_size | |
| id | 1571496 |
| size | 34,877 |
DoLess is a Rust procedural macro that allows structs to be initialized from a HashMap<String, String>. It automatically maps field values, providing type-safe conversions.
From<HashMap<String, String>> for structs.String, u8, u16, i32, f64, Option, Vec<T>, Vec<Option<T>>, etc.).. notation.Add DoLess to your Cargo.toml:
[dependencies]
doless = "0.3.0"
use doless::FromHashMap;
use std::collections::HashMap;
#[derive(FromHashMap, Debug, PartialEq)]
struct Car {
model: String,
year: u16,
}
fn main() {
let mut data = HashMap::new();
data.insert("model".to_string(), "GT-R".to_string());
data.insert("year".to_string(), "2023".to_string());
let car: Car = Car::from(data);
println!("Car: Model = {}, Year = {}", car.model, car.year);
}
use doless::FromHashMap;
use std::collections::HashMap;
#[derive(FromHashMap, Debug)]
struct Car {
model: String,
brand: String,
number: u8,
details: CarDetails, // ✅ Nested Struct Support
}
#[derive(FromHashMap, Debug)]
struct CarDetails {
name: String,
description: String,
}
fn main() {
let mut data = HashMap::new();
data.insert("model".to_string(), "GT-R".to_string());
data.insert("brand".to_string(), "Nissan".to_string());
data.insert("number".to_string(), "8".to_string());
// ✅ Nested Fields with Prefix Notation
data.insert("details.name".to_string(), "Skyline".to_string());
data.insert("details.description".to_string(), "Legendary Sports Car".to_string());
let car: Car = Car::from(data);
println!("{:?}", car);
}
Vec<T> and Vec<Option<T>>use doless::FromHashMap;
use std::collections::HashMap;
#[derive(FromHashMap, Debug)]
struct ItemCollection {
items: Vec<String>, // ✅ Supports Vec<String>
numbers: Vec<u8>, // ✅ Supports Vec<u8>
optional_items: Vec<Option<String>>, // ✅ Supports Vec<Option<T>>
}
fn main() {
let mut data = HashMap::new();
data.insert("items".to_string(), "apple, banana, orange".to_string());
data.insert("numbers".to_string(), "1,2,3".to_string());
data.insert("optional_items".to_string(), "apple,,orange".to_string()); // Empty string = None
let collection: ItemCollection = ItemCollection::from(data);
println!("{:?}", collection);
}
ItemCollection {
items: ["apple", "banana", "orange"],
numbers: [1, 2, 3],
optional_items: [Some("apple"), None, Some("orange")],
}
From<HashMap<String, String>> implementations.Vec<T> and Vec<Option<T>> supportHappy coding! ✨