provider/src/lib.rs (93 lines of code) (raw):
use async_trait::async_trait;
use open_feature::{self, EvaluationContext, EvaluationError, provider::FeatureProvider, provider::ProviderMetadata, provider::ResolutionDetails, StructValue};
use typed_builder::TypedBuilder;
use spotify_confidence_sdk::{Confidence, contextual_confidence::Contextual};
pub use spotify_confidence_sdk::confidence_value::StructValue as ConfidenceStructValue;
use crate::conversion_traits::{ConvertContext, ResolutionDetailsConverter};
use crate::conversion_traits::ToValueConverter;
pub mod conversion_traits;
mod lib_test;
#[derive(TypedBuilder)]
pub struct ConfidenceProvider {
metadata: ProviderMetadata,
confidence: Confidence
}
impl ConfidenceProvider {
pub fn new(confidence: Confidence) -> Self {
Self {
metadata: ProviderMetadata{ name: "ConfidenceProvider".to_string() },
confidence
}
}
}
#[async_trait]
#[warn(deprecated)]
#[allow(unused_variables)]
impl FeatureProvider for ConfidenceProvider {
fn metadata(&self) -> &ProviderMetadata {
&self.metadata
}
async fn resolve_bool_value(
&self,
_flag_key: &str,
evaluation_context: &EvaluationContext,
) -> Result<ResolutionDetails<bool>, EvaluationError> {
let context = evaluation_context.convert();
let new_confidence = self.confidence.with_context(context);
let result = new_confidence.get_flag(_flag_key, bool::default()).await;
return result.convert()
}
async fn resolve_int_value(
&self,
_flag_key: &str,
evaluation_context: &EvaluationContext,
) -> Result<ResolutionDetails<i64>, EvaluationError> {
let context = evaluation_context.convert();
let new_confidence = self.confidence.with_context(context);
let result = new_confidence.get_flag(_flag_key, i64::default()).await;
return result.convert()
}
async fn resolve_float_value(
&self,
_flag_key: &str,
evaluation_context: &EvaluationContext,
) -> Result<ResolutionDetails<f64>, EvaluationError> {
let context = evaluation_context.convert();
let new_confidence = self.confidence.with_context(context);
let result = new_confidence.get_flag(_flag_key, f64::default()).await;
return result.convert()
}
async fn resolve_string_value(
&self,
_flag_key: &str,
evaluation_context: &EvaluationContext,
) -> Result<ResolutionDetails<String>, EvaluationError> {
let context = evaluation_context.convert();
let new_confidence = self.confidence.with_context(context);
let result = new_confidence.get_flag(_flag_key, "".to_string()).await;
return result.convert()
}
async fn resolve_struct_value(
&self,
_flag_key: &str,
evaluation_context: &EvaluationContext,
) -> Result<ResolutionDetails<StructValue>, EvaluationError> {
let context = evaluation_context.convert();
let new_confidence = self.confidence.with_context(context);
let result = new_confidence.get_flag(_flag_key, ConfidenceStructValue::default()).await;
let returned_type = result.convert();
return match returned_type {
Ok(details) => {
Ok(ResolutionDetails {
value: details.value.convert(),
variant: details.variant,
reason: details.reason,
flag_metadata: details.flag_metadata,
})
}
Err(error) => {
Err(error)
}
}
}
}