5 个稳定版本
2.0.0 | 2024年4月2日 |
---|---|
1.1.0 | 2022年11月28日 |
1.0.2 | 2022年3月17日 |
1.0.1 | 2021年1月28日 |
1.0.0 | 2020年10月16日 |
#35 在 缓存 分类中
8,851 每月下载量
在 3 crate 中使用
20KB
327 代码行
Refreshable
随时间变化的价值的简单包装器。
许可证
本存储库根据 Apache 2.0 许可证 提供。
lib.rs
:
随时间变化的价值的简单包装器。
Refreshable
提供对当前值以及通知未来更改的方式的访问。用户可以 订阅 可刷新的,注册一个回调,每当值更改时都会调用该回调。此外,用户可以将一种类型的可刷新映射到另一种类型的可刷新,新的可刷新将根据原始可刷新的更改进行更新。例如,服务的缓存组件可能将 Refreshable<ServiceConfiguration>
映射到 Refreshable<CacheConfiguration>
,以便它可以专门订阅对其重要的配置更改。
当订阅可刷新时返回 Subscription
,它作为守卫类型,在丢弃时注销订阅。如果您打算订阅持续到可刷新的生命周期,您可以使用 Subscription::leak
方法允许 Subscription
超出范围而不注销。
创建新的 Refreshable
时返回 RefreshHandle
,用于更新其值。订阅是可能失败的,并且所有在更新时遇到错误都会通过 RefreshHandle::refresh
方法报告。
示例
use refreshable::Refreshable;
#[derive(PartialEq)]
struct ServiceConfiguration {
cache: CacheConfiguration,
some_other_thing: u32,
}
#[derive(PartialEq, Clone)]
struct CacheConfiguration {
size: usize,
}
let initial_config = ServiceConfiguration {
cache: CacheConfiguration {
size: 10,
},
some_other_thing: 5,
};
let (refreshable, mut handle) = Refreshable::new(initial_config);
let cache_refreshable = refreshable.map(|config| config.cache.clone());
let subscription = cache_refreshable.try_subscribe(|cache| {
if cache.size == 0 {
Err("cache size must be positive")
} else {
println!("new cache size is {}", cache.size);
Ok(())
}
}).unwrap();
let new_config = ServiceConfiguration {
cache: CacheConfiguration {
size: 20,
},
some_other_thing: 5,
};
// "new cache size is 20" is printed.
handle.refresh(new_config).unwrap();
let new_config = ServiceConfiguration {
cache: CacheConfiguration {
size: 20,
},
some_other_thing: 10,
};
// nothing is printed since the cache configuration did not change.
handle.refresh(new_config).unwrap();
drop(subscription);
let new_config = ServiceConfiguration {
cache: CacheConfiguration {
size: 0,
},
some_other_thing: 10,
};
// nothing is printed since the the cache subscription was dropped.
handle.refresh(new_config).unwrap();
依赖项
~0.6–5.5MB
~13K SLoC