use async_trait::async_trait;
use crate::{EvaluationContext, EvaluationResult, StructValue};
use super::ResolutionDetails;
#[cfg_attr(feature = "test-util", mockall::automock)]
#[async_trait]
pub trait FeatureProvider: Send + Sync + 'static {
#[allow(unused_variables)]
async fn initialize(&mut self, context: &EvaluationContext) {}
fn status(&self) -> ProviderStatus {
ProviderStatus::Ready
}
fn metadata(&self) -> &ProviderMetadata;
fn hooks(&self) -> &[crate::hooks::HookWrapper] {
&[]
}
async fn resolve_bool_value(
&self,
flag_key: &str,
evaluation_context: &EvaluationContext,
) -> EvaluationResult<ResolutionDetails<bool>>;
async fn resolve_int_value(
&self,
flag_key: &str,
evaluation_context: &EvaluationContext,
) -> EvaluationResult<ResolutionDetails<i64>>;
async fn resolve_float_value(
&self,
flag_key: &str,
evaluation_context: &EvaluationContext,
) -> EvaluationResult<ResolutionDetails<f64>>;
async fn resolve_string_value(
&self,
flag_key: &str,
evaluation_context: &EvaluationContext,
) -> EvaluationResult<ResolutionDetails<String>>;
async fn resolve_struct_value(
&self,
flag_key: &str,
evaluation_context: &EvaluationContext,
) -> EvaluationResult<ResolutionDetails<StructValue>>;
}
#[derive(Clone, Default, Debug, PartialEq)]
pub struct ProviderMetadata {
pub name: String,
}
impl ProviderMetadata {
pub fn new<S: Into<String>>(name: S) -> Self {
Self { name: name.into() }
}
}
#[derive(Default, PartialEq, Eq, Debug)]
pub enum ProviderStatus {
#[default]
NotReady,
Ready,
Error,
STALE,
}