#flags #toggle #features #flipper

feattle-core

为Rust提供的功能开关,可扩展,具有后台同步和管理UI

15个版本 (2个稳定版)

2.0.0 2024年6月26日
1.0.0 2023年6月28日
0.9.0 2022年7月11日
0.8.0 2022年3月16日
0.2.5 2020年10月23日

#796 in 配置

Download history 153/week @ 2024-04-14 109/week @ 2024-04-21 164/week @ 2024-04-28 119/week @ 2024-05-05 153/week @ 2024-05-12 156/week @ 2024-05-19 261/week @ 2024-05-26 173/week @ 2024-06-02 83/week @ 2024-06-09 221/week @ 2024-06-16 253/week @ 2024-06-23 277/week @ 2024-06-30 201/week @ 2024-07-07 85/week @ 2024-07-14 129/week @ 2024-07-21 246/week @ 2024-07-28

每月661次 下载
3 crates 中使用

MIT/Apache

64KB
1K SLoC

feattle-core

Crates.io Docs.rs CI Coverage Status

此crate是功能标志(简称"feattle")的核心实现。

其主要部分是宏 feattles! 与特质 Feattles。有关更多信息,请参阅主要包 - feattle

使用示例

use std::sync::Arc;
use feattle_core::{feattles, Feattles};
use feattle_core::persist::NoPersistence;

// Declare the struct
feattles! {
    struct MyFeattles {
        /// Is this usage considered cool?
        is_cool: bool = true,
        /// Limit the number of "blings" available.
        /// This will not change the number of "blengs", though!
        max_blings: i32,
        /// List the actions that should not be available
        blocked_actions: Vec<String>,
    }
}

// Create a new instance (`NoPersistence` is just a mock for the persistence layer)
let my_feattles = MyFeattles::new(Arc::new(NoPersistence));

// Read values (note the use of `*`)
assert_eq!(*my_feattles.is_cool(), true);
assert_eq!(*my_feattles.max_blings(), 0);
assert_eq!(*my_feattles.blocked_actions(), Vec::<String>::new());

工作原理

该宏将生成一个具有给定名称和可见性修饰符(默认为私有)的结构体。生成的结构体实现了 Feattles,并为每个feattle公开一个方法。

为每个feattle创建的方法允许读取它们的当前值。例如,对于feattle is_cool: bool,将有一个类似的方法 pub fn is_cool(&self) -> MappedRwLockReadGuard<bool>。请注意使用了 parking_lot::MappedRwLockReadGuard,因为结构体的内部存储在 RwLock 后面,以控制并发访问。

可以使用以下语法创建一个Feattle:$key: $type [= $default]。您可以使用文档注释(以///开头)来描述它们在系统中的功能。您可以使用实现FeattleValue的任何类型,并可选地提供默认值。如果没有提供,将使用Default::default()创建默认值。

更新值

此crate只提供低级方法来使用Feattles::reload()加载当前Feattle,并使用Feattles::update()更新它们的值。请查找feattle-syncfeattle-ui以获取更高级的功能。

限制

由于对宏编写的某些限制,您只能在每个模块中一次使用feattles!。例如,以下代码无法编译

use feattle_core::feattles;

feattles! { struct A { } }
feattles! { struct B { } }

您可以通过创建子模块然后重新导出生成的结构体来绕过此限制。注意第二个情况中使用pub struct

use feattle_core::feattles;

feattles! { struct A { } }

mod b {
    use feattle_core::feattles;
    feattles! { pub struct B { } }
}

use b::B;

可选功能

  • uuid:将添加对uuid::Uuid的支持。

许可

在以下任一许可下使用:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可定义的,任何有意提交给作品包含在内的贡献,都将根据上述许可双重许可,没有额外的条款或条件。

CONTRIBUTING.md

依赖

~2.1–8.5MB
~67K SLoC