55 lines
1.2 KiB
Rust
55 lines
1.2 KiB
Rust
|
use std::{cell::Cell, str::from_utf8};
|
||
|
|
||
|
use macroconf::config;
|
||
|
use miniconf::JsonCoreSlash;
|
||
|
|
||
|
fn set_cell<const MIN: i32, const MAX: i32>(
|
||
|
cell: &Cell<i32>,
|
||
|
val: i32,
|
||
|
) -> Result<(), &'static str> {
|
||
|
if (MIN..=MAX).contains(&val) {
|
||
|
cell.set(val);
|
||
|
Ok(())
|
||
|
} else {
|
||
|
Err("value out of bounds")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[config]
|
||
|
struct Config {
|
||
|
#[config(
|
||
|
min = "-128",
|
||
|
max = "128",
|
||
|
default,
|
||
|
typ = "i32",
|
||
|
get = "Cell::get",
|
||
|
set = "set_cell::<-128,128>"
|
||
|
)]
|
||
|
field: Cell<i32>,
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn get() {
|
||
|
let mut buffer = [0u8; 32];
|
||
|
let config = Config {
|
||
|
field: __ConfigField::new(Cell::new(42)),
|
||
|
};
|
||
|
let len = config.get_json("/field", &mut buffer).unwrap();
|
||
|
assert_eq!(from_utf8(&buffer[..len]), Ok("42"));
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn set() {
|
||
|
let mut config = Config {
|
||
|
field: __ConfigField::new(Cell::new(42)),
|
||
|
};
|
||
|
config.set_json("/field", b"-32").unwrap();
|
||
|
assert_eq!(config.field.get(), -32);
|
||
|
config
|
||
|
.set_json("/field", b"256")
|
||
|
.expect_err("result not checked");
|
||
|
config
|
||
|
.set_json("/field", b"-256")
|
||
|
.expect_err("result not checked");
|
||
|
}
|