statsig-rust 0.19.1-beta.2604110309

Statsig Rust SDK for usage in multi-user server environments.
Documentation
use serde::Serialize;

use crate::{
    id_lists_adapter::{IdListMetadata, IdListUpdate},
    unwrap_or_noop,
};
use std::collections::HashSet;

#[derive(Clone, Serialize)]
pub struct IdList {
    pub metadata: IdListMetadata,

    #[serde(skip_serializing)]
    pub ids: HashSet<String>,
}

impl IdList {
    pub fn new(metadata: IdListMetadata) -> Self {
        let mut local_metadata = metadata;
        local_metadata.size = 0;

        Self {
            metadata: local_metadata,
            ids: HashSet::new(),
        }
    }

    pub fn apply_update(&mut self, update: IdListUpdate) {
        let updated_meta = update.new_metadata;
        let current_meta = &self.metadata;

        if updated_meta.file_id != current_meta.file_id
            && updated_meta.creation_time >= current_meta.creation_time
        {
            self.update_metadata(updated_meta);
        }

        let changeset_data = unwrap_or_noop!(&update.raw_changeset);

        for change in changeset_data.lines() {
            let trimmed = change.trim();
            if trimmed.len() <= 1 {
                continue;
            }

            let op = change.chars().next();
            let id = &change[1..];

            match op {
                Some('+') => {
                    self.ids.insert(id.to_string());
                }
                Some('-') => {
                    self.ids.remove(id);
                }
                _ => continue,
            }
        }

        self.metadata.size += changeset_data.len() as u64;
    }

    fn update_metadata(&mut self, metadata: IdListMetadata) {
        self.metadata = metadata;
        self.metadata.size = 0;
        self.ids.clear();
    }
}