#信心 #Spotify #实验 #A/B测试 #功能标志

spotify_confidence_openfeature_provider

Confidence SDK for Rust的OpenFeature提供程序

2个版本

0.1.2 2024年7月8日
0.1.1 2024年6月5日

##288音频

Download history 126/week @ 2024-06-04 4/week @ 2024-06-11 64/week @ 2024-07-02 51/week @ 2024-07-09

每月115次下载

Apache-2.0

71KB
2K SLoC

OpenFeature Rust Confidence提供程序

Rust对Confidence功能提供程序的实现,与OpenFeature SDK一起使用。

使用

启用提供程序,设置评估上下文和解析标志

setProvider 使openfeature api能够将confidence作为标志的提供程序。

首先,我们需要设置包含client_secretregion的api配置,然后我们可以创建如下提供程序

let api_config = APIConfig {
api_key: "API_KEY".to_string(),
region: Region::Global,
};
let confidence = Confidence::new(api_config);
let provider = ConfidenceProvider::new(confidence);

此时我们可以按如下方式设置OpenFeatureAPI的提供程序

let mut api = OpenFeature::singleton_mut().await;

api.set_provider(provider).await;

在完成初始设置后,我们可以开始访问标志。每次请求任何标志时,提供程序都会从网络中获取它们并解析请求的属性。

属性的架构在解析属性中起着至关重要的作用,如果架构类型与请求的类型匹配,则返回值,否则我们期望从EvaluationError中收到一个MismatchType错误。

// wrong type, should return error
let details_string = api
.create_client()
.get_bool_details("test.struct-key.string-key", Some(&context), None)
.await;

// correct type, should return value
let details_boolean = api
.create_client()
.get_bool_details("my-test.struct-key.boolean-key", Some(&context), None)
.await;

println!("details string -> {:?}", details_string);
println!("details boolean -> {:?}", details_boolean.unwrap().value);

上述代码的结果将是

details string -> Err(EvaluationError { code: TypeMismatch, message: Some("schema type is different for my-test.struct-key.string-key") })
details boolean -> true

读取整个标志为结构体

还可以像以下那样读取整个标志并获取整个标志作为结构体

let details_flag = api
.create_client()
.get_struct_details::<MyStructValue>("my-test.struct-key", Some(&context), None)
    .await
    .unwrap();

    println!("details boolean struct -> {:?}", details_flag.value.my_boolean);
    println!("details string struct -> {:?}", details_flag.value.my_string);
}

struct MyStructValue {
    my_boolean: bool,
    my_string: String
}

impl FromStructValue for MyStructValue {
    fn from_struct_value(value: &StructValue) -> anyhow::Result<Self> {
        return Ok(MyStructValue {
            my_boolean: value.fields.get("boolean-key").unwrap().as_bool().unwrap_or_default(),
            my_string: value.fields.get("string-key").unwrap().as_str().unwrap_or_default().to_string(),
        })
    }
}

依赖

~8–20MB
~295K SLoC