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 在 配置
每月下载 62 次
140KB
1.5K SLoC
HashMapSettings
HashMap
包装器,用于分层设置
此 crate 促进设置的管理,旨在允许开发者将以前无需设置固定值变为用户可更改的设置,以及使开发者更容易创建多个优先级级别的设置,使用户能够拥有更大的控制和定制,包括跨设备。
此 crate 允许开发者将所有程序设置存储和访问在 Account
上,这是 HashMap
的包装器。
此 crate 旨在与某种类型抽象一起使用,以便可以将不同类型的设置存储在单个 Account
中。此 crate 为此提供了 Stg
类型抽象。
Account
还可以持有其他 Account
,允许存在分层设置,允许创建具有复杂系统的系统。
优点
-
在多个地方更改相同的设置,取值为认为最重要的地方。例如:默认值、主题、扩展、全局设置、操作系统设置、设备设置、临时设置。
-
设置的组织。由于
Account
可以包含账户,并且它们可以包含它们自己的账户,因此可以将小组成员的设置组织在Account
中,这使得查找设置或显示一组设置更方便。重要的是要注意,这种组织不需要(但可以)在所有持有的账户中强制执行。 -
Account
可以单独停用,允许开发人员(或用户)将设置分组在Account
中,并在某些条件下轻松忽略它们。
缺点
-
每个
Account
都保存了其子账户中现有的设置副本,因此存在内存开销,但计划将其更改为对值的引用。 -
内部执行
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.0或MIT LICENSE。除非您明确表示,否则您提交给HashMapSettings的任何有意贡献,根据Apache-2.0许可的定义,应如上所述双重许可,不附加任何额外条款或条件。
依赖项
约250KB