From 0c55d17b7238abd2f3a97b25f1b206e839e37f3f Mon Sep 17 00:00:00 2001 From: Gagan Trivedi Date: Mon, 17 Nov 2025 08:59:29 +0530 Subject: [PATCH] feat: add segment source metadata enum and bump-engine-test-data - Add SegmentSource enum with Api and IdentityOverride variants - Update SegmentMetadata to use typed SegmentSource instead of optional string - Add snake_case serialization to support test data format - Update engine-test-data submodule to v3.4.2 - Export SegmentSource in public API --- .gitmodules | 2 +- src/engine_eval/context.rs | 25 +++++++++++++++++++++---- src/engine_eval/mappers.rs | 6 +++--- src/engine_eval/mod.rs | 2 +- tests/engine_tests/engine-test-data | 2 +- 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/.gitmodules b/.gitmodules index 33975c2..ce387a6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "tests/engine_tests/engine-test-data"] path = tests/engine_tests/engine-test-data url = https://github.com/flagsmith/engine-test-data.git - branch = v1.0.0 + branch = v3.4.2 diff --git a/src/engine_eval/context.rs b/src/engine_eval/context.rs index 7d5e592..f4f84f3 100644 --- a/src/engine_eval/context.rs +++ b/src/engine_eval/context.rs @@ -2,6 +2,15 @@ use crate::types::FlagsmithValue; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum SegmentSource { + /// Segment came from the Flagsmith API. + Api, + /// Segment was created from identity overrides. + IdentityOverride, +} + /// Represents metadata information about a feature. #[derive(Clone, Debug, Serialize, Deserialize, Default, PartialEq)] pub struct FeatureMetadata { @@ -195,14 +204,22 @@ pub struct SegmentRule { } /// Segment metadata. -#[derive(Clone, Debug, Serialize, Deserialize, Default, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct SegmentMetadata { /// Segment ID. #[serde(skip_serializing_if = "Option::is_none")] pub segment_id: Option, - /// Source of the segment (api or identity_override). - #[serde(skip_serializing_if = "Option::is_none")] - pub source: Option, + /// Source of the segment. + pub source: SegmentSource, +} + +impl Default for SegmentMetadata { + fn default() -> Self { + Self { + segment_id: None, + source: SegmentSource::Api, + } + } } /// Represents a segment context for feature flag evaluation. diff --git a/src/engine_eval/mappers.rs b/src/engine_eval/mappers.rs index 871c7ca..9b9b3fc 100644 --- a/src/engine_eval/mappers.rs +++ b/src/engine_eval/mappers.rs @@ -1,7 +1,7 @@ use super::context::{ Condition, ConditionOperator, EngineEvaluationContext, EnvironmentContext, FeatureContext, FeatureMetadata, FeatureValue, IdentityContext, SegmentContext, SegmentMetadata, SegmentRule, - SegmentRuleType, + SegmentRuleType, SegmentSource, }; use crate::environments::Environment; use crate::features::{FeatureState, MultivariateFeatureStateValue}; @@ -100,7 +100,7 @@ fn map_segment_to_segment_context(segment: &Segment) -> SegmentContext { name: segment.name.clone(), metadata: SegmentMetadata { segment_id: Some(segment.id as i32), - source: Some("api".to_string()), + source: SegmentSource::Api, }, overrides: vec![], rules: vec![], @@ -237,7 +237,7 @@ fn map_identity_overrides_to_segments(identities: &[Identity]) -> HashMap