#configuration #data-structures #plugin

plugx-input

简单灵活的数据结构,具有差异、合并和验证功能

6 个版本 (3 个重大更新)

0.3.1 2023年12月28日
0.3.0 2023年12月28日
0.2.0 2023年11月26日
0.1.1 2023年10月17日
0.0.1 2023年9月23日

#217 in 配置

Download history 2/week @ 2024-05-21 2/week @ 2024-06-11 47/week @ 2024-06-18 6/week @ 2024-07-02

每月 112 次下载
用于 plugx-config

BSD-3-Clause

150KB
4.5K SLoC

Plugx Input (开发中)

用于插件配置和状态操作的一个简单灵活的数据结构。

| 文档 | 仓库


示例

use plugx_input::Input;

let mut map = Input::new_map();
map.map_mut().insert("key".into(), Input::from([1, 2, 3]));
let inner_list = map
    .map_mut()       // &mut Hashmap<String, Input>
    .get_mut("key")  // Option<&mut Input>
    .unwrap()        // &mut Input (which is a list)
    .list_mut();     // &mut Vec<Input>
*inner_list.get_mut(0).unwrap() = 3.14.into();
*inner_list.get_mut(1).unwrap() = true.into();
*inner_list.get_mut(2).unwrap() = "hello world".into();
println!("{map}");
// prints:
// {"key": [3.14, true, "hello world"]}

功能

差异

use plugx_input::Input;
use plugx_input::diff::{diff, InputDiff};

let mut map = Input::new_map();                       // {}
map.map_mut().insert("foo".into(), Input::new_map()); // {"foo": {}}
map                                                   // {"foo": {"bar": [50, 60, 70]}}
    .map_mut()
    .get_mut("foo").unwrap()
    .map_mut()
    .insert("bar".into(), Input::from([50, 60, 70]));

let mut map2 = map.clone();                           // {"foo": {"bar": [50,  60, 70]}}
*map2                                                 // {"foo": {"bar": [100, 60, 70]}}
    .map_mut()
    .get_mut("foo").unwrap()
    .map_mut()
    .get_mut("bar").unwrap()
    .list_mut()
    .get_mut(0).unwrap()
    .int_mut() = 100;

diff(
    &map,
    &map2,
    &mut |diff: InputDiff| {
        println!("value {} {}", diff.position(), diff.action())
    }
);
// prints:
//     value [foo][bar][0] increased by 50

合并

use plugx_input::Input;
use plugx_input::merge::merge;

let mut map = Input::new_map();                       // {}
map.map_mut().insert("foo".into(), Input::new_map()); // {"foo": {}}
map                                                   // {"foo": {"bar": false}}
    .map_mut()
    .get_mut("foo").unwrap()
    .map_mut()
    .insert("bar".into(), false.into());

let mut map2 = Input::new_map();                       // {}
map2.map_mut().insert("foo".into(), Input::new_map()); // {"foo": {}}
map2                                                   // {"foo": {"baz": true}}
    .map_mut()
    .get_mut("foo").unwrap()
    .map_mut()
    .insert("baz".into(), true.into());

merge(&mut map, &map2);
println!("{map}");
// prints:
//     {"foo": {"bar": false, "baz": true}}

Cargo 功能

  • default: 无
  • schema: 启用 schema 和验证 Input
  • logging: 通过 log crate 启用日志记录。
  • tracing: 通过 tracing crate 启用日志记录。

给贡献者

我喜欢来自每个人的 PR,并感谢您的帮助,但在打开 PR 之前,请先提交一个问题,并描述您的功能、修复等。

依赖关系

~0.5–2MB
~36K SLoC