concrete-type
A procedural macro library for mapping enum variants to concrete types, enabling type-level programming based on runtime enum values.
Table of Contents
Overview
concrete-type provides procedural macros that create a relationship between enum variants and specific concrete types.
This enables:
- Type-level programming with enums
- Executing code with concrete type knowledge at compile time based on runtime enum values
- Optionally carrying configuration data with enum variants
Installation
Add this to your Cargo.toml:
[]
= "0.3.0"
Features
Path Resolution
When specifying concrete types in the #[concrete = "..."] attribute:
-
Use
crate::path::to::Typefor types defined in the same crate as the enum. The macro transforms this to$crate::path::to::Typefor proper macro hygiene, allowing the generated macro to work both within the defining crate and from external crates. -
Use
other_crate::path::to::Typefor types from external crates (used as-is).
#[derive(Concrete)]
The Concrete derive macro is designed for enums where each variant maps to a specific concrete type.
- Map enum variants to concrete types with
#[concrete = "path::to::Type"]attribute - Auto-generated macros for type-level dispatch using the snake_case name of the enum
Example:
// Generated macro is named 'strategy_kind!'
#[derive(ConcreteConfig)]
The ConcreteConfig derive macro is designed for enums where each variant has associated configuration data and maps to a specific concrete type.
- Map enum variants with configuration data to concrete types
- Variants without configuration provided default to using the unit type
(). - Variants with configuration must have a single field (not a tuple).
- Generated methods:
config(): Returns a reference to the configuration data
- Auto-generated macros for type-level dispatch with access to both the concrete type and config data
Example:
// Generated macro is named 'exchange_config!'
Examples
Basic Usage
use Concrete;
// Use the auto-generated 'exchange!' macro to work with concrete types
let exchange = Binance;
let name = exchange!;
assert_eq!;
Enums with Config Data
use ConcreteConfig;
// Define concrete types and configuration types
// Define the enum with concrete type mappings and config data
// Using the auto-generated macro with access to both type and config
let config = Binance;
let name = exchange_config!;
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT