sigstat 0.0.4

Statsig Rust SDK for usage in multi-user server environments.
Documentation
use crate::evaluation::evaluation_details::EvaluationDetails;
use crate::evaluation::evaluation_types::BaseEvaluation;
use crate::event_logging::exposure_utils::{get_metadata_with_details, make_exposure_key};
use crate::event_logging::statsig_event::StatsigEvent;
use crate::event_logging::statsig_event_internal::StatsigEventInternal;
use crate::event_logging::statsig_exposure::StatsigExposure;
use crate::statsig_user_internal::StatsigUserInternal;

pub const CONFIG_EXPOSURE_EVENT_NAME: &str = "statsig::config_exposure";

pub struct ConfigExposure {
    pub user: StatsigUserInternal,
    pub config_name: String,
    pub evaluation: Option<BaseEvaluation>,
    pub evaluation_details: EvaluationDetails,
    pub rule_passed: Option<bool>,
    pub version: Option<u32>,
    pub is_manual_exposure: bool,
}

impl StatsigExposure for ConfigExposure {
    fn make_dedupe_key(&self) -> String {
        let rule_id = self.evaluation.as_ref().map(|eval| &eval.rule_id);
        make_exposure_key(&self.user.user_data, &self.config_name, rule_id, None)
    }

    fn to_internal_event(self) -> StatsigEventInternal {
        let (rule_id, secondary_exposures) = match self.evaluation {
            Some(evaluation) => (evaluation.rule_id, Some(evaluation.secondary_exposures)),
            None => ("".into(), None),
        };

        let mut metadata = get_metadata_with_details(self.evaluation_details);
        metadata.insert("config".into(), self.config_name);
        metadata.insert("ruleID".into(), rule_id);
        if let Some(version) = self.version {
            metadata.insert("configVersion".into(), version.to_string());
        }
        if let Some(rule_passed) = self.rule_passed {
            metadata.insert("rulePassed".into(), rule_passed.to_string());
        }
        if self.is_manual_exposure {
            metadata.insert("isManualExposure".into(), "true".into());
        }

        let event = StatsigEvent {
            event_name: CONFIG_EXPOSURE_EVENT_NAME.into(),
            value: None,
            metadata: Some(metadata),
        };

        StatsigEventInternal::new(
            self.user,
            event,
            Some(secondary_exposures.unwrap_or_default()),
        )
    }
}