# unitscale_macros
## Overview
unitscale_macros provides procedural macros to simplify creating unit types and scale constants. This crate depends on unitscale_core and is intended to reduce boilerplate.
It exports two attribute macros:
- `#[unit_scale(to = float)]`: Declares a scale struct implementing `UnitScaleF32`.
- `#[unit_data]`: Generates a generic struct for the unit and implements `TryFrom<f32>`, `Scaled<U>`, and `new()`.
- **Optional** `with` to specify `"f32"` or `"f64"` precision (Defaults to `f32`).
- **Note** You cannot mix and match `f32` and `f64` versions of _UnitTypeF*_ and _UnitScaleF*_.
## Example
```rust
use unitscale_core::*;
use unitscale_macros::*;
// Default is `f32`. If you want f64 then you can add `with = "f64"`.
// #[unit_scale(to = 0.1, with = "f64")]
#[unit_scale(to = 0.1)]
struct Scale0_1;
// #[unit_type(with = "f64")]
#[unit_type]
struct Volts;
let v = Volts::<Scale0_1, u16>::try_from(3.2).unwrap();
// v.to_f32()) gives back 3.2 within the precision limit of the type (e.g. u16)
assert_eq!(v.scaled_value(), 32);
```