sigstat 0.0.3-beta.2

Statsig Rust SDK for usage in multi-user server environments.
Documentation
use crate::evaluation::evaluation_details::EvaluationDetails;
use crate::evaluation::evaluation_types::SecondaryExposure;
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 GATE_EXPOSURE_EVENT_NAME: &str = "statsig::gate_exposure";

pub struct GateExposure {
    pub user: StatsigUserInternal,
    pub gate_name: String,
    pub value: bool,
    pub rule_id: Option<String>,
    pub secondary_exposures: Option<Vec<SecondaryExposure>>,
    pub evaluation_details: EvaluationDetails,
    pub version: Option<u32>,
    pub is_manual_exposure: bool,
}

impl StatsigExposure for GateExposure {
    fn make_dedupe_key(&self) -> String {
        make_exposure_key(
            &self.user.user_data,
            &self.gate_name,
            self.rule_id.as_ref(),
            None,
        )
    }

    fn to_internal_event(self) -> StatsigEventInternal {
        let mut metadata = get_metadata_with_details(self.evaluation_details);
        metadata.insert("gate".into(), self.gate_name);
        metadata.insert("gateValue".into(), self.value.to_string());
        metadata.insert("ruleID".into(), self.rule_id.unwrap_or_default());
        if self.is_manual_exposure {
            metadata.insert("isManualExposure".into(), "true".into());
        }
        if let Some(version) = self.version {
            metadata.insert("configVersion".into(), version.to_string());
        }

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

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