sigstat 0.0.4

Statsig Rust SDK for usage in multi-user server environments.
Documentation
use crate::evaluation::evaluator_result::EvaluatorResult;
use crate::spec_store::SpecStoreData;
use crate::SpecsSource;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
pub struct EvaluationDetails {
    pub reason: String,
    pub lcut: Option<u64>,
    pub received_at: Option<u64>,
}

impl EvaluationDetails {
    pub fn unrecognized(spec_store_data: &SpecStoreData) -> Self {
        Self::create_from_data(spec_store_data, "Unrecognized", &EvaluatorResult::default())
    }

    pub fn recognized(spec_store_data: &SpecStoreData, eval_result: &EvaluatorResult) -> Self {
        Self::create_from_data(spec_store_data, "Recognized", eval_result)
    }

    pub fn recognized_but_overridden(
        spec_store_data: &SpecStoreData,
        override_reason: &str,
    ) -> Self {
        Self {
            reason: format!("{}:Recognized", override_reason),
            lcut: Some(spec_store_data.values.time),
            received_at: spec_store_data.time_received_at,
        }
    }

    pub fn unrecognized_no_data() -> Self {
        Self {
            reason: SpecsSource::NoValues.to_string(),
            lcut: None,
            received_at: None,
        }
    }

    pub fn error(sub_reason: &str) -> Self {
        Self {
            reason: format!("Error:{}", sub_reason),
            lcut: None,
            received_at: None,
        }
    }

    fn create_from_data(
        data: &SpecStoreData,
        sub_reason: &str,
        eval_result: &EvaluatorResult,
    ) -> Self {
        if data.source == SpecsSource::Uninitialized || data.source == SpecsSource::NoValues {
            return Self {
                reason: data.source.to_string(),
                lcut: None,
                received_at: None,
            };
        }

        if eval_result.unsupported {
            return Self {
                reason: format!("{}:Unsupported", data.source),
                lcut: Some(data.values.time),
                received_at: data.time_received_at,
            };
        }

        Self {
            reason: format!("{}:{}", data.source, sub_reason),
            lcut: Some(data.values.time),
            received_at: data.time_received_at,
        }
    }
}