confidence/src/resolve.rs (84 lines of code) (raw):
use std::collections::HashMap;
use async_trait::async_trait;
use mockall::automock;
use serde_json::Value;
use crate::confidence_value::ConfidenceValue;
use crate::models::APIConfig;
use crate::models::APIURL;
use crate::models::NetworkResolvedFlags;
use crate::models::ResolvedFlags;
use crate::models::ResolveError;
use crate::models::ResolveRequest;
use crate::models::SDK;
use crate::{get_sdk_version, SDK_ID};
#[derive(Clone, Default)]
pub struct ConfidenceResolver;
impl ConfidenceResolver {
async fn make_request(
&self,
config: &APIConfig,
flags: Vec<String>,
_evaluation_context: &HashMap<String, ConfidenceValue>,
) -> Result<NetworkResolvedFlags, ResolveError> {
let mut context = HashMap::new();
context.insert("targeting_key".to_string(), Value::String("sample".to_string()));
let flags: Vec<String> = flags.into_iter().map(|flag| {
let flag_name: Vec<&str> = flag.split(".").collect();
format!("flags/{}", flag_name.first().unwrap())
}).collect();
let sdk = SDK::builder().id(SDK_ID).version(get_sdk_version()).build();
let resolve_request = &ResolveRequest::builder()
.client_secret(config.api_key.clone())
.evaluation_context(context)
.apply(true)
.sdk(sdk)
.flags(flags)
.build();
let body =
serde_json::to_string(resolve_request).unwrap();
let client = reqwest::Client::new();
let response = client
.post(format!("{}/v1/flags:resolve", config.region.url()))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.body(body)
.send()
.await?;
match response.text().await {
Ok(body) => {
let resolved_flags: serde_json::Result<NetworkResolvedFlags> =
serde_json::from_str(&body);
match resolved_flags {
Ok(resolved) => Result::Ok(resolved),
Err(err) => {
println!("ERROR ->> {}", err);
Err(ResolveError::SerializationError)
}
}
}
Err(err) => Err(ResolveError::NetworkError(err)),
}
}
}
#[async_trait]
#[automock]
pub trait NetworkFlagResolver {
async fn resolve(
&self,
config: &APIConfig,
flags: Vec<String>,
evaluation_context: &HashMap<String, ConfidenceValue>,
) -> Result<ResolvedFlags, ResolveError>;
}
#[async_trait]
impl NetworkFlagResolver for ConfidenceResolver {
async fn resolve(
&self,
config: &APIConfig,
flags: Vec<String>,
evaluation_context: &HashMap<String, ConfidenceValue>,
) -> Result<ResolvedFlags, ResolveError> {
let network_response = self.make_request(config, flags, evaluation_context).await?;
Ok(network_response.into())
}
}