# typemap-meta
[![Crates.io][crates-badge]][crates-url]
[![Docs.rs][docs-badge]][docs-url]
[![Build Status][ci-badge]][ci-url]
[crates-badge]: https://img.shields.io/crates/v/typemap-meta
[crates-url]: https://crates.io/crates/typemap-meta
[docs-badge]: https://img.shields.io/docsrs/typemap-meta
[docs-url]: https://docs.rs/typemap-meta
[ci-badge]: https://github.com/enlightware/typemap-meta/actions/workflows/ci.yml/badge.svg
[ci-url]: https://github.com/enlightware/typemap-meta/actions
An [Enlightware® software](https://enlightware.ch).
## Overview
A simple compile-time (hence the meta) derive macro to create type-to-value maps (hence the typemap).
This approach in contrast to crates such as [`typemap`](https://crates.io/crates/typemap/) or [`type-map`](https://crates.io/crates/type-map/) that perform run-time lookup.
The static typing brings compile-time safety and faster execution at the expense of using a derive macro and generics.
The crate is `no_std` compatible.
## Usage
To use this crate, first add this to your `Cargo.toml`:
```toml
[dependencies]
typemap-meta = "0.2"
```
Then, you can create a tuple struct containing disjoint heterogeneous types, and derive `Typemap`, and then use the `get!` macro (a syntactic sugar around `Typemap::Get`):
```rust
#[derive(Typemap)]
struct Test(i32, f32);
let t = Test(1, 2.0);
assert_eq!(*get!(t, i32), 1);
assert_eq!(*get!(t, f32), 2.0);
```
A mutable version is also available:
```rust
#[derive(Typemap)]
#[typemap_mut]
struct Test(i32, f32);
let mut t = Test(1, 2.0);
*get_mut!(t, i32) = 3;
*get_mut!(t, f32) = 4.0;
assert_eq!(*get!(t, i32), 3);
assert_eq!(*get!(t, f32), 4.0);
```
## Crate structure
As currently procedural macros must be defined [in their own crate](https://doc.rust-lang.org/book/ch19-06-macros.html#how-to-write-a-custom-derive-macro), we have two crates `typemap-meta` and `typemap-meta-derive`, the former re-exporting the macro from the later.
Only the former needs to be imported in your project.
## License
Licensed under either of
* Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license
([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.