9 个版本

0.2.4 2024 年 8 月 12 日
0.2.3 2024 年 4 月 17 日
0.2.2 2024 年 3 月 2 日
0.2.1 2024 年 2 月 13 日
0.1.2 2023 年 9 月 27 日

#25 in 配置

Download history 9/week @ 2024-05-20 2/week @ 2024-06-03 7/week @ 2024-08-05 130/week @ 2024-08-12

137 每月下载量
用于 2 crates

Apache-2.0

110KB
2K SLoC

OpenFeature Logo

OpenFeature Rust SDK

Specification Release
Crates.io Min rust version Repo status

OpenFeature 是一个开放标准,提供了一种供应商无关、社区驱动的 API,用于功能标志,可以与您喜欢的功能标志管理工具配合使用。

🚀 快速入门

需求

此包是用 Rust 版本 1.70.0 构建的。早期版本可能也可以工作,但不保证。

安装

将以下内容添加到 Cargo.toml 文件中

open-feature = "0.2.4"

用法

async fn example() -> Result<(), Error> {
    // Acquire an OpenFeature API instance.
    // Note the `await` call here because asynchronous lock is used to
    // guarantee thread safety.
    let mut api = OpenFeature::singleton_mut().await;

    // Configure a provider.
    // By default [`NoOpProvider`] is used.
    api.set_provider(NoOpProvider::default()).await;

    // create a client
    let client = api.get_client();

    // get a bool flag value
    let is_feature_enabled = client
        .get_bool_value("v2_enabled", None, None)
        .unwrap_or(false)
        .await;

    Ok(())
}

请注意,默认的 NoOpProvider 总是为任何给定的输入返回 Err

扩展示例

#[tokio::test]
async fn extended_example() {
    // Acquire an OpenFeature API instance.
    let mut api = OpenFeature::singleton_mut().await;

    // Set the default (unnamed) provider.
    api.set_provider(NoOpProvider::default()).await;

    // Create an unnamed client.
    let client = api.create_client();

    // Create an evaluation context.
    // It supports types mentioned in the specification.
    let evaluation_context = EvaluationContext::default()
        .with_targeting_key("Targeting")
        .with_custom_field("bool_key", true)
        .with_custom_field("int_key", 100)
        .with_custom_field("float_key", 3.14)
        .with_custom_field("string_key", "Hello".to_string())
        .with_custom_field("datetime_key", time::OffsetDateTime::now_utc())
        .with_custom_field(
            "struct_key",
            EvaluationContextFieldValue::Struct(Arc::new(MyStruct::default())),
        )
        .with_custom_field("another_struct_key", Arc::new(MyStruct::default()))
        .with_custom_field(
            "yet_another_struct_key",
            EvaluationContextFieldValue::new_struct(MyStruct::default()),
        );

    // This function returns a `Result`.
    // You can process it with functions provided by std.
    let is_feature_enabled = client
        .get_bool_value("SomeFlagEnabled", Some(&evaluation_context), None)
        .await
        .unwrap_or(false);

    if is_feature_enabled {
        // Let's get evaluation details.
        let _result = client
            .get_int_details("key", Some(&evaluation_context), None)
            .await;
    }
}

从提供者获取结构

可以从提供者中提取结构。内部,此 SDK 定义了一个类型 StructValue 来存储任何结构值。函数 client.get_struct_value() 接受一个类型参数 T。它将尝试将提供者解析的 StructValue 转换为 T,只要 T 实现了特例 TryFrom<StructValue>

您可以将满足此特例约束的类型传递进来。当转换失败时,它返回一个带有 EvaluationReason::TypeMismatchErr

API 参考

请参阅 此处 的 API 文档。

🌟 功能

状态 功能 描述
提供者 集成商业、开源或内部特性管理工具。
目标 使用评估上下文进行上下文感知的标志评估。
钩子 向标志评估生命周期的各个阶段添加功能。
日志记录 集成流行的日志包。
命名客户端 在单个应用程序中使用多个提供者。
事件 对提供者或标志管理系统中的状态变化做出反应。
关闭 在应用程序关闭期间优雅地清理提供者。
扩展 使用自定义提供者和钩子扩展OpenFeature。

已实现:✅ | 进行中:⚠️ | 尚未实现:❌

提供者

提供者是标志管理系统和OpenFeature SDK之间的抽象。请在此查看所有可用的提供者列表。如果您正在寻找的提供者尚未创建,请参阅开发提供者部分以了解如何自己构建。

一旦将提供者作为依赖项添加,就可以像这样将其注册到OpenFeature

// Set the default feature provider. Please replace the `NoOpProvider` with the one you want.
// If you do not do that, [`NoOpProvider`] will be used by default.
//
// [`NoOpProvider`] always returns `Err` despite any input. You can use functions like 
// `unwrap_or()` to specify default values.
//
// If you set a new provider after creating some clients, the existing clients will pick up
// the new provider you just set.
//
// You must `await` it to let the provider's initialization to finish.
let mut api = OpenFeature::singleton_mut().await;
api.set_provider(NoOpProvider::default()).await;

在某些情况下,在同一个应用程序中注册多个提供者可能有益。这可以通过使用命名客户端来实现,下面将详细介绍。

目标

有时,标志的值必须考虑关于应用程序或用户的某些动态标准,例如用户的地理位置、IP、电子邮件地址或服务器的位置。在OpenFeature中,我们将其称为目标。如果您使用的标志管理系统支持目标,则可以使用评估上下文提供输入数据。

// Create a global evaluation context and set it into the API.
// Note that this is optional. By default it uses an empty one.
let mut api = OpenFeature::singleton_mut().await;
api.set_evaluation_context(global_evaluation_context).await;

// Set client level evaluation context.
// It will overwrite the global one for the existing keys.
let mut client = api.create_client();
client.set_evaluation_context(client_evaluation_context);

// Pass evaluation context in evaluation functions.
// This one will overwrite the globla evaluation context and 
// the client level one.
client.get_int_value("flag", Some(&evaluation_context), None);

钩子

钩子尚未在Rust SDK中提供。

日志记录

日志自定义尚未在Rust SDK中提供。

命名客户端

可以为客户端指定一个名称。名称是一个逻辑标识符,可以用于将客户端与特定提供者相关联。如果没有与名称关联的提供者,则使用全局提供者。

// Create a named provider and bind it.
api.set_named_provider("named", NoOpProvider::default()).await;

// This named client will use the feature provider bound to this name.
let client = api.create_named_client("named");

assert_eq!(client.get_int_value("key", None, None).await.unwrap(), 42);

事件

事件尚未在Rust SDK中提供。

关闭

OpenFeature API提供了一个关闭函数来清理所有注册的提供者。仅在您的应用程序正在关闭过程中时才应调用此函数。

// This will clean all the registered providers and invoke their `shutdown()` function.
let api = OpenFeature::singleton_mut().await;
api.shutdown();

扩展

开发提供者

要开发提供者,您需要创建一个新项目并将OpenFeature SDK作为依赖项。这可以是一个新的存储库,也可以包含在OpenFeature组织下的现有 contrib 存储库中。然后您需要通过实现OpenFeature SDK导出的FeatureProvider接口来编写提供者。

请检查NoOpProvider的源代码以获取示例。

已构建新的提供者?告诉我们,以便我们可以将其添加到文档中!

开发钩子

钩子尚未在Rust SDK中提供。

⭐️ 支持项目

🤝 贡献

有兴趣贡献?太好了,我们非常乐意得到您的帮助!要开始,请查看CONTRIBUTING指南。

感谢所有已经做出贡献的人

Pictures of the folks who have contributed to the project

contrib.rocks 制作。

依赖项

~3.5–10MB
~92K SLoC