#account #settings #hash-map

nightly hashmap_settings

分层 Settings 的 HashMap 包装器

7 个版本 (4 个破坏性更新)

0.5.1 2024年2月18日
0.5.0 2024年1月31日
0.4.1 2024年1月7日
0.3.0 2023年11月15日
0.1.0 2023年10月30日

#201配置

Download history 10/week @ 2024-03-09 1/week @ 2024-03-16 37/week @ 2024-03-30 9/week @ 2024-04-06 1/week @ 2024-05-18

每月下载 62 次

MIT/Apache

140KB
1.5K SLoC

HashMapSettings 版本 Rust 版本 文档 构建状态

HashMap 包装器,用于分层设置

此 crate 促进设置的管理,旨在允许开发者将以前无需设置固定值变为用户可更改的设置,以及使开发者更容易创建多个优先级级别的设置,使用户能够拥有更大的控制和定制,包括跨设备。

此 crate 允许开发者将所有程序设置存储和访问在 Account 上,这是 HashMap 的包装器。

此 crate 旨在与某种类型抽象一起使用,以便可以将不同类型的设置存储在单个 Account 中。此 crate 为此提供了 Stg 类型抽象。

Account 还可以持有其他 Account,允许存在分层设置,允许创建具有复杂系统的系统。

优点

  1. 在多个地方更改相同的设置,取值为认为最重要的地方。例如:默认值、主题、扩展、全局设置、操作系统设置、设备设置、临时设置。

  2. 设置的组织。由于 Account 可以包含账户,并且它们可以包含它们自己的账户,因此可以将小组成员的设置组织在 Account 中,这使得查找设置或显示一组设置更方便。重要的是要注意,这种组织不需要(但可以)在所有持有的账户中强制执行。

  3. Account 可以单独停用,允许开发人员(或用户)将设置分组在 Account 中,并在某些条件下轻松忽略它们。

缺点

  1. 每个Account都保存了其子账户中现有的设置副本,因此存在内存开销,但计划将其更改为对值的引用。

  2. 内部执行HashMap的.get()操作可能比其他替代方案要慢。

示例

以下示例展示了某些子账户中的值如何优先于其他子账户,但也演示了没有值丢失,以及如何仍然可以访问它们。

use hashmap_settings::prelude::*;
use std::collections::HashMap;

//creating the Parent Account
let mut account = Account::<
    String, //Account's name
    &str, //HashMap<K,V> K key
    Stg  //HashMap<K,v> V value
    >::default();

// inserting child Accounts
account.push(
    Account::new(
        "Default".to_string(), //Name of the Account
        true,//is the account active
        HashMap::from([
            ("lines", 3.stg()), // .stg() turns a type into the type abstraction Stg
            ("word_repetition", 10.stg()),
            ("word", "default".to_string().stg()),
        ]), //settings
        vec![], //child Accounts
    ),
    Valid::new_true(), // not relevant for this example and can be ignored.
);

account.push(
    Account::new(
        "Global Settings".to_string(),
        true,
        HashMap::from([
            ("word_repetition", 2.stg()),
            ("word", "global".to_string().stg()),
        ]), //this account is in a layer above the "Default" Account, so it's values will have priority
        vec![],
    ),
    Valid::new_true(),
);// we could be getting this from a database

account.push(
    Account::new(
        "Local Settings".to_string(),
        true,
        HashMap::from([("word", "local".to_string().stg())]),
        //this account is in a layer that's above "Default" and "Global Settings" Accounts,
        //so it's values will have priority over it
        vec![],
    ),
    Valid::new_true(),
);// we could be getting this Account from a local file

account.push(
    Account::new(
        "Inactive Account".to_string(),
        false, //this account is inactive so its settings will be ignored.
        HashMap::from([("word", "inactive".to_string().stg())]),
        vec![],
    ),
    Valid::new_true(),
);

//getting values from the account
let word: String = account.get(&"word").unstg()?;
let word_repetition = account.get(&"word_repetition").unstg()?;
let lines =account.get(&"lines").unstg()?;

//example of using the values
let mut sentence = String::new();
for _ in 0..word_repetition {
    sentence.push_str(&word);
    sentence.push(' ');
}
sentence.pop();
for _ in 0..lines {
    println!("{sentence}");
}
//this will print the following:
/*
local local
local local
local local
*/

//values in child accounts are still accessible
let ref_child_account: &Account<_, _, _> = account
    .deep(&mut vec![&"Default".to_string()])
    .unwrap();
let inactive_word: String = ref_child_account.get(&"word").unstg()?;
println!("{inactive_word}");
//this will print "default"

//this includes inactive accounts
let ref_child_account: &Account<_, _, _> = account
    .deep(&mut vec![&"Inactive Account".to_string()])
    .unwrap();
let inactive_word: String = ref_child_account.get(&"word").unstg()?;
println!("{inactive_word}");
//this will print "inactive"
# Ok::<(), StgError>(())

*/

如何使用

此crate依赖于rust 1.76.0中应该稳定的nightly功能dyn trait upcasting,不幸的是,它已被推迟,因此目前需要使用nightly编译器。

将以下行添加到您的Cargo.toml文件中

[dependencies]
hashmap_settings = "0.5"

将以下行添加到您的.rs文件中

use hashmap_settings::prelude*;

许可证

根据您的要求,许可为Apache License, Version 2.0MIT LICENSE。除非您明确表示,否则您提交给HashMapSettings的任何有意贡献,根据Apache-2.0许可的定义,应如上所述双重许可,不附加任何额外条款或条件。

依赖项

约250KB