use std::{cell::Cell, str::from_utf8}; use macroconf::config; use miniconf::JsonCoreSlash; fn set_cell( cell: &Cell, 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, } #[config] struct WithSetterAndDefault { #[config( default = "42", typ = "i32", get = "Cell::get", set = "set_cell::<{i32::MIN}, {i32::MAX}>" )] field: Cell, } #[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"); }