| Crates.io | named-item-derive |
| lib.rs | named-item-derive |
| version | 0.2.0 |
| created_at | 2025-01-02 19:09:07.359453+00 |
| updated_at | 2025-01-17 00:14:26.615172+00 |
| description | A single procedural macro that implements NamedItem and optionally enables name history or aliases based on struct fields. |
| homepage | https://github.com/klebs6/klebs-general |
| repository | https://github.com/klebs6/klebs-general |
| max_upload_size | |
| id | 1501784 |
| size | 40,867 |
A single procedural macro crate that integrates with named-item to provide robust name-management for Rust structs.
#[derive(NamedItem)]: The single macro that implements:
Named, SetName, DefaultName, ResetNameNameHistory if #[named_item(history="true")] is specified.NamedAlias (including clear_aliases) if #[named_item(aliases="true")] is specified.#[named_item(default_name="...")].#[named_item(default_aliases="foo,bar")].name: String field. If history="true", it also requires name_history: Vec<String>; if aliases="true", requires aliases: Vec<String>.First, add this crate and its companion named-item as dependencies in your Cargo.toml:
[dependencies]
named-item = "x.y.z"
named-item-derive = { path = "../named-item-derive" } # or your version
Then, in your code:
use named_item_derive::NamedItem;
use named_item::{Named, SetName, ResetName, NameAlias, NameHistory, NameError};
#[derive(NamedItem)]
#[named_item(
default_name="TomeOfSecrets",
aliases="true",
default_aliases="alpha,beta",
history="true"
)]
pub struct MagicalTome {
pub name: String,
pub name_history: Vec<String>,
pub aliases: Vec<String>,
}
fn main() -> Result<(), NameError> {
let mut tome = MagicalTome {
name: "Prototype".to_string(),
name_history: vec![],
aliases: vec![],
};
// Standard name handling
tome.set_name("Revised Tome")?;
assert_eq!(tome.name(), "Revised Tome");
// NameHistory tracking
assert_eq!(tome.name_history(), vec!["Revised Tome"]);
// NamedAlias
tome.add_alias("Secret Volume");
assert_eq!(tome.aliases(), vec!["Secret Volume"]);
tome.clear_aliases();
assert!(tome.aliases().is_empty());
// Reset to default => "TomeOfSecrets"
tome.reset_name()?;
assert_eq!(tome.name(), "TomeOfSecrets");
// Default aliases => ["alpha", "beta"]
let defaults = MagicalTome::default_aliases();
assert_eq!(defaults, vec!["alpha", "beta"]);
Ok(())
}
When history="true", each call to set_name automatically appends the new name to name_history, while aliases="true" implements the NamedAlias trait with add_alias, aliases, and clear_aliases.
We include:
tests/integration.rs.tests/ui/.Run:
cargo test
to ensure all tests pass.
This project is licensed under the MIT license. See LICENSE for details.
Pull requests are welcome! Please open an issue for major changes to discuss them first.