#update #value #cache #subscription #refresh #access #updated

refreshable

围绕随时间变化的价值的简单包装器

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缓存 分类中

Download history 1415/week @ 2024-04-23 2170/week @ 2024-04-30 1531/week @ 2024-05-07 2005/week @ 2024-05-14 1324/week @ 2024-05-21 1377/week @ 2024-05-28 1700/week @ 2024-06-04 1848/week @ 2024-06-11 1462/week @ 2024-06-18 1410/week @ 2024-06-25 2086/week @ 2024-07-02 1516/week @ 2024-07-09 1781/week @ 2024-07-16 2159/week @ 2024-07-23 2078/week @ 2024-07-30 2598/week @ 2024-08-06

8,851 每月下载量
3 crate 中使用

Apache-2.0

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