From 0103ad398782dd4ad0abb24916f5742023d2565e Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Wed, 18 Mar 2026 21:05:08 +0530 Subject: [PATCH 01/16] fix: more fixes --- .../Io/Superposition/Model/GetConfigInput.hs | 7 + .../Model/ListExperimentGroupsInput.hs | 102 ++++++++++++ .../Model/ListExperimentInput.hs | 7 + .../Model/ListExperimentOutput.hs | 96 ++++++++++++ .../superposition/model/GetConfigInput.java | 8 + .../model/ListExperimentGroupsInput.java | 147 ++++++++++++++++++ .../model/ListExperimentInput.java | 8 + .../model/ListExperimentOutput.java | 116 ++++++++++++++ .../sdk/src/commands/ListExperimentCommand.ts | 7 + .../commands/ListExperimentGroupsCommand.ts | 9 ++ clients/javascript/sdk/src/models/models_0.ts | 16 ++ .../sdk/src/protocols/Aws_restJson1.ts | 7 + .../sdk/superposition_sdk/_private/schemas.py | 71 +++++++++ .../sdk/superposition_sdk/deserialize.py | 9 ++ .../python/sdk/superposition_sdk/models.py | 43 +++++ .../python/sdk/superposition_sdk/serialize.py | 24 +++ .../src/client/list_experiment.rs | 7 + .../src/client/list_experiment_groups.rs | 8 + .../_list_experiment_output.rs | 49 ++++++ .../_list_experiment_groups_input.rs | 44 ++++++ .../list_experiment_groups/builders.rs | 9 ++ .../src/protocol_serde/shape_get_config.rs | 9 ++ .../protocol_serde/shape_list_experiment.rs | 18 +++ .../shape_list_experiment_groups.rs | 9 ++ crates/superposition_sdk/src/serde_util.rs | 7 + crates/superposition_sdk/src/types.rs | 20 +++ docs/docs/api/Superposition.openapi.json | 27 ++++ docs/docs/api/get-config-json.api.mdx | 4 + docs/docs/api/get-config-toml.api.mdx | 4 + docs/docs/api/get-config.api.mdx | 12 ++ docs/docs/api/list-experiment-groups.api.mdx | 14 ++ docs/docs/api/list-experiment.api.mdx | 14 ++ 32 files changed, 932 insertions(+) diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs index c15f5230e..db2b999da 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs @@ -143,7 +143,14 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serQuery "prefix" (prefix self) Io.Superposition.Utility.serQuery "version" (version self) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) +<<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +======= +<<<<<<< HEAD +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs index ec2322a16..5ed62644c 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs @@ -11,8 +11,16 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( setSortOn, setSortBy, setGroupType, +<<<<<<< HEAD setDimensionMatchStrategy, setContext, +======= +<<<<<<< HEAD +======= + setDimensionMatchStrategy, + setContext, +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) build, ListExperimentGroupsInputBuilder, ListExperimentGroupsInput, @@ -27,9 +35,19 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( last_modified_by, sort_on, sort_by, +<<<<<<< HEAD + group_type, + dimension_match_strategy, + context +======= +<<<<<<< HEAD + group_type +======= group_type, dimension_match_strategy, context +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -63,9 +81,19 @@ data ListExperimentGroupsInput = ListExperimentGroupsInput { last_modified_by :: Data.Maybe.Maybe Data.Text.Text, sort_on :: Data.Maybe.Maybe Io.Superposition.Model.ExperimentGroupSortOn.ExperimentGroupSortOn, sort_by :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, +<<<<<<< HEAD + group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), + dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, + context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +======= +<<<<<<< HEAD + group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) +======= group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -85,9 +113,19 @@ instance Data.Aeson.ToJSON ListExperimentGroupsInput where "last_modified_by" Data.Aeson..= last_modified_by a, "sort_on" Data.Aeson..= sort_on a, "sort_by" Data.Aeson..= sort_by a, +<<<<<<< HEAD + "group_type" Data.Aeson..= group_type a, + "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, + "context" Data.Aeson..= context a +======= +<<<<<<< HEAD + "group_type" Data.Aeson..= group_type a +======= "group_type" Data.Aeson..= group_type a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, "context" Data.Aeson..= context a +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) ] @@ -107,8 +145,16 @@ instance Data.Aeson.FromJSON ListExperimentGroupsInput where Control.Applicative.<*> (v Data.Aeson..:? "sort_on") Control.Applicative.<*> (v Data.Aeson..:? "sort_by") Control.Applicative.<*> (v Data.Aeson..:? "group_type") +<<<<<<< HEAD + Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") + Control.Applicative.<*> (v Data.Aeson..:? "context") +======= +<<<<<<< HEAD +======= Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") Control.Applicative.<*> (v Data.Aeson..:? "context") +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) @@ -125,9 +171,19 @@ data ListExperimentGroupsInputBuilderState = ListExperimentGroupsInputBuilderSta last_modified_byBuilderState :: Data.Maybe.Maybe Data.Text.Text, sort_onBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.ExperimentGroupSortOn.ExperimentGroupSortOn, sort_byBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, +<<<<<<< HEAD + group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), + dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, + contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +======= +<<<<<<< HEAD + group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) +======= group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } deriving ( GHC.Generics.Generic ) @@ -145,9 +201,19 @@ defaultBuilderState = ListExperimentGroupsInputBuilderState { last_modified_byBuilderState = Data.Maybe.Nothing, sort_onBuilderState = Data.Maybe.Nothing, sort_byBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD + group_typeBuilderState = Data.Maybe.Nothing, + dimension_match_strategyBuilderState = Data.Maybe.Nothing, + contextBuilderState = Data.Maybe.Nothing +======= +<<<<<<< HEAD + group_typeBuilderState = Data.Maybe.Nothing +======= group_typeBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing, contextBuilderState = Data.Maybe.Nothing +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } type ListExperimentGroupsInputBuilder = Control.Monad.State.Strict.State ListExperimentGroupsInputBuilderState @@ -200,6 +266,11 @@ setGroupType :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) setGroupType value = Control.Monad.State.Strict.modify (\s -> (s { group_typeBuilderState = value })) +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> ListExperimentGroupsInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) @@ -208,6 +279,10 @@ setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) build :: ListExperimentGroupsInputBuilder () -> Data.Either.Either Data.Text.Text ListExperimentGroupsInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -223,8 +298,16 @@ build builder = do sort_on' <- Data.Either.Right (sort_onBuilderState st) sort_by' <- Data.Either.Right (sort_byBuilderState st) group_type' <- Data.Either.Right (group_typeBuilderState st) +<<<<<<< HEAD + dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) + context' <- Data.Either.Right (contextBuilderState st) +======= +<<<<<<< HEAD +======= dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) context' <- Data.Either.Right (contextBuilderState st) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) Data.Either.Right (ListExperimentGroupsInput { count = count', page = page', @@ -237,9 +320,19 @@ build builder = do last_modified_by = last_modified_by', sort_on = sort_on', sort_by = sort_by', +<<<<<<< HEAD + group_type = group_type', + dimension_match_strategy = dimension_match_strategy', + context = context' +======= +<<<<<<< HEAD + group_type = group_type' +======= group_type = group_type', dimension_match_strategy = dimension_match_strategy', context = context' +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) }) @@ -256,11 +349,20 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w Io.Superposition.Utility.serQuery "sort_by" (sort_by self) Io.Superposition.Utility.serQuery "group_type" (group_type self) Io.Superposition.Utility.serQuery "created_by" (created_by self) +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) Io.Superposition.Utility.serQuery "sort_on" (sort_on self) Io.Superposition.Utility.serQuery "name" (name self) Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs index 49d8949cd..48b27511d 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs @@ -330,7 +330,14 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serQuery "to_date" (to_date self) Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serQuery "status" (status self) +<<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +======= +<<<<<<< HEAD +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs index 03a0aa25b..648099c0f 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs @@ -2,14 +2,30 @@ module Io.Superposition.Model.ListExperimentOutput ( setTotalPages, setTotalItems, setData', +<<<<<<< HEAD setLastModified, +======= +<<<<<<< HEAD +======= + setLastModified, +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) build, ListExperimentOutputBuilder, ListExperimentOutput, total_pages, total_items, +<<<<<<< HEAD + data', + last_modified +======= +<<<<<<< HEAD + data' +======= data', last_modified +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -30,8 +46,17 @@ import qualified Network.HTTP.Types data ListExperimentOutput = ListExperimentOutput { total_pages :: Data.Int.Int32, total_items :: Data.Int.Int32, +<<<<<<< HEAD data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, last_modified :: Data.Time.UTCTime +======= +<<<<<<< HEAD + data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse +======= + data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, + last_modified :: Data.Time.UTCTime +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -42,8 +67,17 @@ instance Data.Aeson.ToJSON ListExperimentOutput where toJSON a = Data.Aeson.object [ "total_pages" Data.Aeson..= total_pages a, "total_items" Data.Aeson..= total_items a, +<<<<<<< HEAD "data" Data.Aeson..= data' a, "last_modified" Data.Aeson..= last_modified a +======= +<<<<<<< HEAD + "data" Data.Aeson..= data' a +======= + "data" Data.Aeson..= data' a, + "last_modified" Data.Aeson..= last_modified a +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) ] @@ -54,7 +88,14 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Data.Functor.<$> (v Data.Aeson..: "total_pages") Control.Applicative.<*> (v Data.Aeson..: "total_items") Control.Applicative.<*> (v Data.Aeson..: "data") +<<<<<<< HEAD + Control.Applicative.<*> (v Data.Aeson..: "last_modified") +======= +<<<<<<< HEAD +======= Control.Applicative.<*> (v Data.Aeson..: "last_modified") +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) @@ -62,8 +103,17 @@ instance Data.Aeson.FromJSON ListExperimentOutput where data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { total_pagesBuilderState :: Data.Maybe.Maybe Data.Int.Int32, total_itemsBuilderState :: Data.Maybe.Maybe Data.Int.Int32, +<<<<<<< HEAD data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime +======= +<<<<<<< HEAD + data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse) +======= + data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), + last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } deriving ( GHC.Generics.Generic ) @@ -72,8 +122,17 @@ defaultBuilderState :: ListExperimentOutputBuilderState defaultBuilderState = ListExperimentOutputBuilderState { total_pagesBuilderState = Data.Maybe.Nothing, total_itemsBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD data'BuilderState = Data.Maybe.Nothing, last_modifiedBuilderState = Data.Maybe.Nothing +======= +<<<<<<< HEAD + data'BuilderState = Data.Maybe.Nothing +======= + data'BuilderState = Data.Maybe.Nothing, + last_modifiedBuilderState = Data.Maybe.Nothing +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } type ListExperimentOutputBuilder = Control.Monad.State.Strict.State ListExperimentOutputBuilderState @@ -90,22 +149,47 @@ setData' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse -> L setData' value = Control.Monad.State.Strict.modify (\s -> (s { data'BuilderState = Data.Maybe.Just value })) +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () setLastModified value = Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) build :: ListExperimentOutputBuilder () -> Data.Either.Either Data.Text.Text ListExperimentOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState total_pages' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.total_pages is a required property.") Data.Either.Right (total_pagesBuilderState st) total_items' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.total_items is a required property.") Data.Either.Right (total_itemsBuilderState st) data'' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.data' is a required property.") Data.Either.Right (data'BuilderState st) +<<<<<<< HEAD + last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) + Data.Either.Right (ListExperimentOutput { + total_pages = total_pages', + total_items = total_items', + data' = data'', + last_modified = last_modified' +======= +<<<<<<< HEAD + Data.Either.Right (ListExperimentOutput { + total_pages = total_pages', + total_items = total_items', + data' = data'' +======= last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) Data.Either.Right (ListExperimentOutput { total_pages = total_pages', total_items = total_items', data' = data'', last_modified = last_modified' +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) }) @@ -117,9 +201,21 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where var2 <- Io.Superposition.Utility.deSerField "total_pages" var3 <- Io.Superposition.Utility.deSerField "total_items" pure $ ListExperimentOutput { +<<<<<<< HEAD +======= +<<<<<<< HEAD + total_pages = var1, + total_items = var2, + data' = var0 +======= +>>>>>>> 91d47048 (fix: more fixes) total_pages = var2, total_items = var3, data' = var1, last_modified = var0 +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java index 77b01791b..6ceb8801d 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java @@ -37,8 +37,16 @@ public final class GetConfigInput implements SerializableStruct { new HttpQueryTrait("prefix")) .putMember("version", PreludeSchemas.STRING, new HttpQueryTrait("version")) +<<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) +======= +<<<<<<< HEAD +======= + .putMember("if_modified_since", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java index dc046fa70..146a191b7 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java @@ -39,8 +39,16 @@ public final class ListExperimentGroupsInput implements SerializableStruct { .putMember("org_id", PreludeSchemas.STRING, new HttpHeaderTrait("x-org-id"), new RequiredTrait()) +<<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) +======= +<<<<<<< HEAD +======= + .putMember("if_modified_since", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) .putMember("name", PreludeSchemas.STRING, new HttpQueryTrait("name")) .putMember("created_by", PreludeSchemas.STRING, @@ -53,9 +61,18 @@ public final class ListExperimentGroupsInput implements SerializableStruct { new HttpQueryTrait("sort_by")) .putMember("group_type", SharedSchemas.GROUP_TYPE_LIST, new HttpQueryTrait("group_type")) +<<<<<<< HEAD + .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, + new HttpQueryTrait("dimension_match_strategy")) + .putMember("context", SharedSchemas.CONTEXT_MAP) +======= +<<<<<<< HEAD +======= .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) .putMember("context", SharedSchemas.CONTEXT_MAP) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) .build(); private static final Schema $SCHEMA_COUNT = $SCHEMA.member("count"); @@ -70,8 +87,16 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private static final Schema $SCHEMA_SORT_ON = $SCHEMA.member("sort_on"); private static final Schema $SCHEMA_SORT_BY = $SCHEMA.member("sort_by"); private static final Schema $SCHEMA_GROUP_TYPE = $SCHEMA.member("group_type"); +<<<<<<< HEAD private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); +======= +<<<<<<< HEAD +======= + private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); + private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) private final transient Integer count; private final transient Integer page; @@ -85,8 +110,16 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private final transient ExperimentGroupSortOn sortOn; private final transient SortBy sortBy; private final transient List groupType; +<<<<<<< HEAD private final transient DimensionMatchStrategy dimensionMatchStrategy; private final transient Map context; +======= +<<<<<<< HEAD +======= + private final transient DimensionMatchStrategy dimensionMatchStrategy; + private final transient Map context; +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) private ListExperimentGroupsInput(Builder builder) { this.count = builder.count; @@ -101,8 +134,16 @@ private ListExperimentGroupsInput(Builder builder) { this.sortOn = builder.sortOn; this.sortBy = builder.sortBy; this.groupType = builder.groupType == null ? null : Collections.unmodifiableList(builder.groupType); +<<<<<<< HEAD this.dimensionMatchStrategy = builder.dimensionMatchStrategy; this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); +======= +<<<<<<< HEAD +======= + this.dimensionMatchStrategy = builder.dimensionMatchStrategy; + this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } /** @@ -192,6 +233,11 @@ public boolean hasGroupType() { return groupType != null; } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } @@ -207,6 +253,10 @@ public boolean hasContext() { return context != null; } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -232,14 +282,32 @@ public boolean equals(Object other) { && Objects.equals(this.lastModifiedBy, that.lastModifiedBy) && Objects.equals(this.sortOn, that.sortOn) && Objects.equals(this.sortBy, that.sortBy) +<<<<<<< HEAD && Objects.equals(this.groupType, that.groupType) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) && Objects.equals(this.context, that.context); +======= +<<<<<<< HEAD + && Objects.equals(this.groupType, that.groupType); +======= + && Objects.equals(this.groupType, that.groupType) + && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) + && Objects.equals(this.context, that.context); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } @Override public int hashCode() { +<<<<<<< HEAD + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); +======= +<<<<<<< HEAD + return Objects.hash(count, page, all, workspaceId, orgId, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType); +======= return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } @Override @@ -281,12 +349,21 @@ public void serializeMembers(ShapeSerializer serializer) { if (groupType != null) { serializer.writeList($SCHEMA_GROUP_TYPE, groupType, groupType.size(), SharedSerde.GroupTypeListSerializer.INSTANCE); } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } @Override @@ -298,6 +375,17 @@ public T getMemberValue(Schema member) { case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_COUNT, member, count); case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_PAGE, member, page); case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_ALL, member, all); +<<<<<<< HEAD +======= +<<<<<<< HEAD + case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_NAME, member, name); + case 6 -> (T) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, createdBy); + case 7 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_BY, member, lastModifiedBy); + case 8 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, sortOn); + case 9 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); + case 10 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); +======= +>>>>>>> 91d47048 (fix: more fixes) case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, ifModifiedSince); case 6 -> (T) SchemaUtils.validateSameMember($SCHEMA_NAME, member, name); case 7 -> (T) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, createdBy); @@ -307,6 +395,10 @@ public T getMemberValue(Schema member) { case 11 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -332,8 +424,16 @@ public Builder toBuilder() { builder.sortOn(this.sortOn); builder.sortBy(this.sortBy); builder.groupType(this.groupType); +<<<<<<< HEAD builder.dimensionMatchStrategy(this.dimensionMatchStrategy); builder.context(this.context); +======= +<<<<<<< HEAD +======= + builder.dimensionMatchStrategy(this.dimensionMatchStrategy); + builder.context(this.context); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) return builder; } @@ -361,8 +461,16 @@ public static final class Builder implements ShapeBuilder groupType; +<<<<<<< HEAD + private DimensionMatchStrategy dimensionMatchStrategy; + private Map context; +======= +<<<<<<< HEAD +======= private DimensionMatchStrategy dimensionMatchStrategy; private Map context; +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) private Builder() {} @@ -493,6 +601,11 @@ public Builder groupType(List groupType) { return this; } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) /** * @return this builder. */ @@ -509,6 +622,10 @@ public Builder context(Map context) { return this; } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) @Override public ListExperimentGroupsInput build() { tracker.validate(); @@ -524,6 +641,17 @@ public void setMemberValue(Schema member, Object value) { case 2 -> count((int) SchemaUtils.validateSameMember($SCHEMA_COUNT, member, value)); case 3 -> page((int) SchemaUtils.validateSameMember($SCHEMA_PAGE, member, value)); case 4 -> all((boolean) SchemaUtils.validateSameMember($SCHEMA_ALL, member, value)); +<<<<<<< HEAD +======= +<<<<<<< HEAD + case 5 -> name((String) SchemaUtils.validateSameMember($SCHEMA_NAME, member, value)); + case 6 -> createdBy((String) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, value)); + case 7 -> lastModifiedBy((String) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_BY, member, value)); + case 8 -> sortOn((ExperimentGroupSortOn) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, value)); + case 9 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); + case 10 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); +======= +>>>>>>> 91d47048 (fix: more fixes) case 5 -> ifModifiedSince((Instant) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, value)); case 6 -> name((String) SchemaUtils.validateSameMember($SCHEMA_NAME, member, value)); case 7 -> createdBy((String) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, value)); @@ -533,6 +661,10 @@ public void setMemberValue(Schema member, Object value) { case 11 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -574,6 +706,17 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 2 -> builder.count(de.readInteger(member)); case 3 -> builder.page(de.readInteger(member)); case 4 -> builder.all(de.readBoolean(member)); +<<<<<<< HEAD +======= +<<<<<<< HEAD + case 5 -> builder.name(de.readString(member)); + case 6 -> builder.createdBy(de.readString(member)); + case 7 -> builder.lastModifiedBy(de.readString(member)); + case 8 -> builder.sortOn(ExperimentGroupSortOn.builder().deserializeMember(de, member).build()); + case 9 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); + case 10 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); +======= +>>>>>>> 91d47048 (fix: more fixes) case 5 -> builder.ifModifiedSince(de.readTimestamp(member)); case 6 -> builder.name(de.readString(member)); case 7 -> builder.createdBy(de.readString(member)); @@ -583,6 +726,10 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 11 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java index 6ae8fca70..95ca973a4 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java @@ -39,8 +39,16 @@ public final class ListExperimentInput implements SerializableStruct { .putMember("org_id", PreludeSchemas.STRING, new HttpHeaderTrait("x-org-id"), new RequiredTrait()) +<<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) +======= +<<<<<<< HEAD +======= + .putMember("if_modified_since", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) .putMember("status", SharedSchemas.EXPERIMENT_STATUS_TYPE_LIST, new HttpQueryTrait("status")) .putMember("from_date", SharedSchemas.DATE_TIME, diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java index a63db2bb9..0bcfd9256 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java @@ -30,26 +30,56 @@ public final class ListExperimentOutput implements SerializableStruct { new RequiredTrait()) .putMember("data", SharedSchemas.EXPERIMENT_LIST, new RequiredTrait()) +<<<<<<< HEAD .putMember("last_modified", SharedSchemas.DATE_TIME, new HttpHeaderTrait("last-modified"), new RequiredTrait()) +======= +<<<<<<< HEAD +======= + .putMember("last_modified", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("last-modified"), + new RequiredTrait()) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) .build(); private static final Schema $SCHEMA_TOTAL_PAGES = $SCHEMA.member("total_pages"); private static final Schema $SCHEMA_TOTAL_ITEMS = $SCHEMA.member("total_items"); private static final Schema $SCHEMA_DATA = $SCHEMA.member("data"); +<<<<<<< HEAD private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); +======= +<<<<<<< HEAD +======= + private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) private final transient int totalPages; private final transient int totalItems; private final transient List data; +<<<<<<< HEAD + private final transient Instant lastModified; +======= +<<<<<<< HEAD +======= private final transient Instant lastModified; +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) private ListExperimentOutput(Builder builder) { this.totalPages = builder.totalPages; this.totalItems = builder.totalItems; this.data = Collections.unmodifiableList(builder.data); +<<<<<<< HEAD this.lastModified = builder.lastModified; +======= +<<<<<<< HEAD +======= + this.lastModified = builder.lastModified; +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } public int totalPages() { @@ -68,10 +98,19 @@ public boolean hasData() { return true; } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) public Instant lastModified() { return lastModified; } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -88,13 +127,30 @@ public boolean equals(Object other) { ListExperimentOutput that = (ListExperimentOutput) other; return this.totalPages == that.totalPages && this.totalItems == that.totalItems +<<<<<<< HEAD + && Objects.equals(this.data, that.data) + && Objects.equals(this.lastModified, that.lastModified); +======= +<<<<<<< HEAD + && Objects.equals(this.data, that.data); +======= && Objects.equals(this.data, that.data) && Objects.equals(this.lastModified, that.lastModified); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } @Override public int hashCode() { +<<<<<<< HEAD + return Objects.hash(totalPages, totalItems, data, lastModified); +======= +<<<<<<< HEAD + return Objects.hash(totalPages, totalItems, data); +======= return Objects.hash(totalPages, totalItems, data, lastModified); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } @Override @@ -107,7 +163,14 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeInteger($SCHEMA_TOTAL_PAGES, totalPages); serializer.writeInteger($SCHEMA_TOTAL_ITEMS, totalItems); serializer.writeList($SCHEMA_DATA, data, data.size(), SharedSerde.ExperimentListSerializer.INSTANCE); +<<<<<<< HEAD serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); +======= +<<<<<<< HEAD +======= + serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } @Override @@ -117,7 +180,14 @@ public T getMemberValue(Schema member) { case 0 -> (T) SchemaUtils.validateSameMember($SCHEMA_TOTAL_PAGES, member, totalPages); case 1 -> (T) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, totalItems); case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_DATA, member, data); +<<<<<<< HEAD + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); +======= +<<<<<<< HEAD +======= case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -134,7 +204,14 @@ public Builder toBuilder() { builder.totalPages(this.totalPages); builder.totalItems(this.totalItems); builder.data(this.data); +<<<<<<< HEAD + builder.lastModified(this.lastModified); +======= +<<<<<<< HEAD +======= builder.lastModified(this.lastModified); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) return builder; } @@ -153,7 +230,14 @@ public static final class Builder implements ShapeBuilder private int totalPages; private int totalItems; private List data; +<<<<<<< HEAD private Instant lastModified; +======= +<<<<<<< HEAD +======= + private Instant lastModified; +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) private Builder() {} @@ -192,6 +276,11 @@ public Builder data(List data) { return this; } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) /** *

Required * @return this builder. @@ -202,6 +291,10 @@ public Builder lastModified(Instant lastModified) { return this; } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) @Override public ListExperimentOutput build() { tracker.validate(); @@ -215,7 +308,14 @@ public void setMemberValue(Schema member, Object value) { case 0 -> totalPages((int) SchemaUtils.validateSameMember($SCHEMA_TOTAL_PAGES, member, value)); case 1 -> totalItems((int) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, value)); case 2 -> data((List) SchemaUtils.validateSameMember($SCHEMA_DATA, member, value)); +<<<<<<< HEAD + case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); +======= +<<<<<<< HEAD +======= case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -234,9 +334,18 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_DATA)) { data(Collections.emptyList()); } +<<<<<<< HEAD if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { lastModified(Instant.EPOCH); } +======= +<<<<<<< HEAD +======= + if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { + lastModified(Instant.EPOCH); + } +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) return this; } @@ -261,7 +370,14 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 0 -> builder.totalPages(de.readInteger(member)); case 1 -> builder.totalItems(de.readInteger(member)); case 2 -> builder.data(SharedSerde.deserializeExperimentList(member, de)); +<<<<<<< HEAD + case 3 -> builder.lastModified(de.readTimestamp(member)); +======= +<<<<<<< HEAD +======= case 3 -> builder.lastModified(de.readTimestamp(member)); +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts index 1c89d2d4c..5967ad734 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts @@ -118,7 +118,14 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // experiment_group_id: "STRING_VALUE", * // }, * // ], +<<<<<<< HEAD * // last_modified: new Date("TIMESTAMP"), // required +======= +<<<<<<< HEAD +======= + * // last_modified: new Date("TIMESTAMP"), // required +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts index 38d6a18f0..91e5af00d 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts @@ -57,10 +57,19 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO * group_type: [ // GroupTypeList * "USER_CREATED" || "SYSTEM_GENERATED", * ], +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) * dimension_match_strategy: "exact" || "subset", * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) * }; * const command = new ListExperimentGroupsCommand(input); * const response = await client.send(command); diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index 22ee0b59c..745861d87 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -2009,6 +2009,11 @@ export interface ListExperimentGroupsInput { * @public */ group_type?: (GroupType)[] | undefined; +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) /** * Strategy to follow while filter items based on the context @@ -2022,6 +2027,10 @@ export interface ListExperimentGroupsInput { * @public */ context?: Record | undefined; +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } /** @@ -2155,7 +2164,14 @@ export interface ListExperimentOutput { total_pages: number | undefined; total_items: number | undefined; data: (ExperimentResponse)[] | undefined; +<<<<<<< HEAD last_modified: Date | undefined; +======= +<<<<<<< HEAD +======= + last_modified: Date | undefined; +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index 532f66bb0..e4f836b31 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -4110,7 +4110,14 @@ export const de_ListExperimentCommand = async( } const contents: any = map({ $metadata: deserializeMetadata(output), +<<<<<<< HEAD [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], +======= +<<<<<<< HEAD +======= + [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) }); const data: Record = __expectNonNull((__expectObject(await parseBody(output.body, context))), "body"); const doc = take(data, { diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index d1801435a..f4aaa66fb 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -1717,6 +1717,11 @@ ], }, +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) "if_modified_since": { "target": DATE_TIME, "index": 4, @@ -1727,6 +1732,10 @@ ], }, +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) "context": { "target": CONTEXT_MAP, "index": 5, @@ -10013,6 +10022,11 @@ ], }, +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) "if_modified_since": { "target": DATE_TIME, "index": 5, @@ -10023,6 +10037,10 @@ ], }, +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) "name": { "target": STRING, "index": 6, @@ -10079,9 +10097,44 @@ ], }, +<<<<<<< HEAD "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 12, +======= +<<<<<<< HEAD +======= + "dimension_match_strategy": { + "target": DIMENSION_MATCH_STRATEGY, + "index": 12, + "traits": [ + Trait.new(id=ShapeID("smithy.api#notProperty")), + Trait.new(id=ShapeID("smithy.api#httpQuery"), value="dimension_match_strategy"), + + ], + }, + + "context": { + "target": CONTEXT_MAP, + "index": 13, + "traits": [ + Trait.new(id=ShapeID("smithy.api#notProperty")), + + ], + }, + +>>>>>>> 8fc501b7 (fix: more fixes) + } +) + +EXPERIMENT_GROUP_RESPONSE = Schema.collection( + id=ShapeID("io.superposition#ExperimentGroupResponse"), + + members={ + "id": { + "target": STRING, + "index": 0, +>>>>>>> 91d47048 (fix: more fixes) "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), Trait.new(id=ShapeID("smithy.api#httpQuery"), value="dimension_match_strategy"), @@ -10928,6 +10981,11 @@ ], }, +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) "if_modified_since": { "target": DATE_TIME, "index": 5, @@ -10938,6 +10996,10 @@ ], }, +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) "status": { "target": EXPERIMENT_STATUS_TYPE_LIST, "index": 6, @@ -11104,6 +11166,11 @@ ], }, +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) "last_modified": { "target": DATE_TIME, "index": 3, @@ -11114,6 +11181,10 @@ ], }, +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } ) diff --git a/clients/python/sdk/superposition_sdk/deserialize.py b/clients/python/sdk/superposition_sdk/deserialize.py index e3166812f..974f2b368 100644 --- a/clients/python/sdk/superposition_sdk/deserialize.py +++ b/clients/python/sdk/superposition_sdk/deserialize.py @@ -1538,6 +1538,11 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf body_kwargs = ListExperimentOutput.deserialize_kwargs(deserializer) kwargs.update(body_kwargs) +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) for fld in http_response.fields: for key, value in fld.as_tuples(): _key_lowercase = key.lower() @@ -1548,6 +1553,10 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf case _: pass +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) return ListExperimentOutput(**kwargs) async def _deserialize_error_list_experiment(http_response: HTTPResponse, config: Config) -> ApiError: diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index abff3d688..164c3aa13 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -10165,12 +10165,21 @@ class ListExperimentGroupsInput: :param group_type: Filter by the type of group (USER_CREATED or SYSTEM_GENERATED). +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) :param dimension_match_strategy: Strategy to follow while filter items based on the context :param context: Map representing the context. Keys correspond to the names of the dimensions. +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) """ count: int | None = None @@ -10185,8 +10194,16 @@ class ListExperimentGroupsInput: sort_on: str | None = None sort_by: str | None = None group_type: list[str] | None = None +<<<<<<< HEAD dimension_match_strategy: str | None = None context: dict[str, Document] | None = None +======= +<<<<<<< HEAD +======= + dimension_match_strategy: str | None = None + context: dict[str, Document] | None = None +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT, self) @@ -10241,12 +10258,21 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 11: kwargs["group_type"] = _deserialize_group_type_list(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["group_type"]) +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) case 12: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) case 13: kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["context"]) +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) case _: logger.debug("Unexpected member schema: %s", schema) @@ -11088,8 +11114,16 @@ class ListExperimentOutput: data: list[ExperimentResponse] +<<<<<<< HEAD + last_modified: datetime + +======= +<<<<<<< HEAD +======= last_modified: datetime +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_LIST_EXPERIMENT_OUTPUT, self) @@ -11117,9 +11151,18 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 2: kwargs["data"] = _deserialize_experiment_list(de, _SCHEMA_LIST_EXPERIMENT_OUTPUT.members["data"]) +<<<<<<< HEAD + case 3: + kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) + +======= +<<<<<<< HEAD +======= case 3: kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) case _: logger.debug("Unexpected member schema: %s", schema) diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index d5a515a25..1852cd371 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1055,8 +1055,16 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) +<<<<<<< HEAD if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +======= +<<<<<<< HEAD +======= + if input.if_modified_since is not None: + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) return _HTTPRequest( destination=_URI( host="", @@ -2028,8 +2036,16 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) +<<<<<<< HEAD + if input.if_modified_since is not None: + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +======= +<<<<<<< HEAD +======= if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) return _HTTPRequest( destination=_URI( host="", @@ -2090,8 +2106,16 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) +<<<<<<< HEAD + if input.if_modified_since is not None: + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +======= +<<<<<<< HEAD +======= if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) return _HTTPRequest( destination=_URI( host="", diff --git a/crates/superposition_sdk/src/client/list_experiment.rs b/crates/superposition_sdk/src/client/list_experiment.rs index e225f5cf8..a3fa7722e 100644 --- a/crates/superposition_sdk/src/client/list_experiment.rs +++ b/crates/superposition_sdk/src/client/list_experiment.rs @@ -26,7 +26,14 @@ impl super::Client { /// - [`total_pages(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_pages): (undocumented) /// - [`total_items(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_items): (undocumented) /// - [`data(Vec::)`](crate::operation::list_experiment::ListExperimentOutput::data): (undocumented) +<<<<<<< HEAD /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) +======= +<<<<<<< HEAD +======= + /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) /// - On failure, responds with [`SdkError`](crate::operation::list_experiment::ListExperimentError) pub fn list_experiment(&self) -> crate::operation::list_experiment::builders::ListExperimentFluentBuilder { crate::operation::list_experiment::builders::ListExperimentFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/list_experiment_groups.rs b/crates/superposition_sdk/src/client/list_experiment_groups.rs index 7b9010458..285d5735a 100644 --- a/crates/superposition_sdk/src/client/list_experiment_groups.rs +++ b/crates/superposition_sdk/src/client/list_experiment_groups.rs @@ -15,8 +15,16 @@ impl super::Client { /// - [`sort_on(ExperimentGroupSortOn)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::sort_on) / [`set_sort_on(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_sort_on):
required: **false**
Field to sort the results by.
/// - [`sort_by(SortBy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::sort_by) / [`set_sort_by(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_sort_by):
required: **false**
Sort order (ascending or descending).
/// - [`group_type(GroupType)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::group_type) / [`set_group_type(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_group_type):
required: **false**
Filter by the type of group (USER_CREATED or SYSTEM_GENERATED).
+<<<<<<< HEAD /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
/// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
+======= +<<<<<<< HEAD +======= + /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+ /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
+>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) /// - On success, responds with [`ListExperimentGroupsOutput`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput) with field(s): /// - [`total_pages(i32)`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput::total_pages): (undocumented) /// - [`total_items(i32)`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput::total_items): (undocumented) diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs index cce48692d..ea16d44d6 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs @@ -9,8 +9,16 @@ pub struct ListExperimentOutput { pub total_items: i32, #[allow(missing_docs)] // documentation missing in model pub data: ::std::vec::Vec::, +<<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model pub last_modified: ::aws_smithy_types::DateTime, +======= +<<<<<<< HEAD +======= + #[allow(missing_docs)] // documentation missing in model + pub last_modified: ::aws_smithy_types::DateTime, +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } impl ListExperimentOutput { #[allow(missing_docs)] // documentation missing in model @@ -25,10 +33,19 @@ impl ListExperimentOutput { pub fn data(&self) -> &[crate::types::ExperimentResponse] { use std::ops::Deref; self.data.deref() } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) #[allow(missing_docs)] // documentation missing in model pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { &self.last_modified } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } impl ListExperimentOutput { /// Creates a new builder-style object to manufacture [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput). @@ -44,7 +61,14 @@ pub struct ListExperimentOutputBuilder { pub(crate) total_pages: ::std::option::Option, pub(crate) total_items: ::std::option::Option, pub(crate) data: ::std::option::Option<::std::vec::Vec::>, +<<<<<<< HEAD pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, +======= +<<<<<<< HEAD +======= + pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } impl ListExperimentOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -93,6 +117,11 @@ impl ListExperimentOutputBuilder { pub fn get_data(&self) -> &::std::option::Option<::std::vec::Vec::> { &self.data } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) #[allow(missing_docs)] // documentation missing in model /// This field is required. pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { @@ -107,12 +136,23 @@ impl ListExperimentOutputBuilder { pub fn get_last_modified(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { &self.last_modified } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) /// Consumes the builder and constructs a [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput). /// This method will fail if any of the following fields are not set: /// - [`total_pages`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::total_pages) /// - [`total_items`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::total_items) /// - [`data`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::data) +<<<<<<< HEAD + /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) +======= +<<<<<<< HEAD +======= /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::list_experiment::ListExperimentOutput { @@ -131,11 +171,20 @@ impl ListExperimentOutputBuilder { ::aws_smithy_types::error::operation::BuildError::missing_field("data", "data was not specified but it is required when building ListExperimentOutput") )? , +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) last_modified: self.last_modified .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") )? , +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } ) } diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs index bc426b206..1c9300fae 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs @@ -27,10 +27,19 @@ pub struct ListExperimentGroupsInput { pub sort_by: ::std::option::Option, /// Filter by the type of group (USER_CREATED or SYSTEM_GENERATED). pub group_type: ::std::option::Option<::std::vec::Vec::>, +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } impl ListExperimentGroupsInput { /// Number of items to be returned in each page. @@ -84,6 +93,11 @@ impl ListExperimentGroupsInput { self.group_type.as_deref() .unwrap_or_default() } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() @@ -92,6 +106,10 @@ impl ListExperimentGroupsInput { pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } impl ListExperimentGroupsInput { /// Creates a new builder-style object to manufacture [`ListExperimentGroupsInput`](crate::operation::list_experiment_groups::ListExperimentGroupsInput). @@ -116,8 +134,16 @@ pub struct ListExperimentGroupsInputBuilder { pub(crate) sort_on: ::std::option::Option, pub(crate) sort_by: ::std::option::Option, pub(crate) group_type: ::std::option::Option<::std::vec::Vec::>, +<<<<<<< HEAD pub(crate) dimension_match_strategy: ::std::option::Option, pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +======= +<<<<<<< HEAD +======= + pub(crate) dimension_match_strategy: ::std::option::Option, + pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } impl ListExperimentGroupsInputBuilder { /// Number of items to be returned in each page. @@ -284,6 +310,11 @@ impl ListExperimentGroupsInputBuilder { pub fn get_group_type(&self) -> &::std::option::Option<::std::vec::Vec::> { &self.group_type } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -316,6 +347,10 @@ impl ListExperimentGroupsInputBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { &self.context } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) /// Consumes the builder and constructs a [`ListExperimentGroupsInput`](crate::operation::list_experiment_groups::ListExperimentGroupsInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -344,10 +379,19 @@ impl ListExperimentGroupsInputBuilder { , group_type: self.group_type , +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) dimension_match_strategy: self.dimension_match_strategy , context: self.context , +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } ) } diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs index 820a00e2a..58b408875 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs @@ -269,6 +269,11 @@ impl ListExperimentGroupsFluentBuilder { pub fn get_group_type(&self) -> &::std::option::Option<::std::vec::Vec::> { self.inner.get_group_type() } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -302,5 +307,9 @@ impl ListExperimentGroupsFluentBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.inner.get_context() } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs index 409ac9055..b985ae4bf 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs @@ -77,6 +77,11 @@ pub fn ser_get_config_headers( })?; builder = builder.header("x-org-id", header_value); } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -89,6 +94,10 @@ pub fn ser_get_config_headers( })?; builder = builder.header("if-modified-since", header_value); } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) Ok(builder) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs index 43cd98cca..2d205fe56 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs @@ -37,10 +37,19 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers #[allow(unused_mut)] let mut output = crate::operation::list_experiment::builders::ListExperimentOutputBuilder::default(); output = crate::protocol_serde::shape_list_experiment::de_list_experiment(_response_body, output).map_err(crate::operation::list_experiment::ListExperimentError::unhandled)?; +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) output = output.set_last_modified( crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? ); +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) crate::serde_util::list_experiment_output_output_correct_errors(output).build().map_err(crate::operation::list_experiment::ListExperimentError::unhandled)? }) } @@ -73,6 +82,11 @@ pub fn ser_list_experiment_headers( })?; builder = builder.header("x-org-id", header_value); } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -85,6 +99,10 @@ pub fn ser_list_experiment_headers( })?; builder = builder.header("if-modified-since", header_value); } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) Ok(builder) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs index 0ec5ea3a9..de59edecb 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs @@ -73,6 +73,11 @@ pub fn ser_list_experiment_groups_headers( })?; builder = builder.header("x-org-id", header_value); } +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -85,6 +90,10 @@ pub fn ser_list_experiment_groups_headers( })?; builder = builder.header("if-modified-since", header_value); } +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) Ok(builder) } diff --git a/crates/superposition_sdk/src/serde_util.rs b/crates/superposition_sdk/src/serde_util.rs index f711352cc..045936a60 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -591,7 +591,14 @@ pub(crate) fn list_experiment_output_output_correct_errors(mut builder: crate::o if builder.total_pages.is_none() { builder.total_pages = Some(Default::default()) } if builder.total_items.is_none() { builder.total_items = Some(Default::default()) } if builder.data.is_none() { builder.data = Some(Default::default()) } +<<<<<<< HEAD if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +======= +<<<<<<< HEAD +======= +if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) builder } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index 95dec09cf..80be77db7 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -15,6 +15,7 @@ pub use crate::types::_group_type::GroupType; pub use crate::types::_bucket::Bucket; +<<<<<<< HEAD pub use crate::types::_experiment_response::ExperimentResponse; pub use crate::types::_variant::Variant; @@ -26,6 +27,13 @@ pub use crate::types::_experiment_status_type::ExperimentStatusType; pub use crate::types::_experiment_type::ExperimentType; pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; +======= +<<<<<<< HEAD +pub use crate::types::_experiment_group_response::ExperimentGroupResponse; +======= +pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) pub use crate::types::_experiment_group_sort_on::ExperimentGroupSortOn; @@ -43,8 +51,20 @@ pub use crate::types::_type_templates_response::TypeTemplatesResponse; pub use crate::types::_experiment_sort_on::ExperimentSortOn; +<<<<<<< HEAD pub use crate::types::_variant_update_request::VariantUpdateRequest; +<<<<<<< HEAD +======= +pub use crate::types::_experiment_response::ExperimentResponse; + +pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; + +======= +>>>>>>> 8fc501b7 (fix: more fixes) +pub use crate::types::_experiment_sort_on::ExperimentSortOn; + +>>>>>>> 91d47048 (fix: more fixes) pub use crate::types::_org_status::OrgStatus; pub use crate::types::_organisation_response::OrganisationResponse; diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 960a230b1..90953e40d 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -170,6 +170,11 @@ } }, { +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", @@ -179,6 +184,10 @@ } }, { +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) "name": "x-org-id", "in": "header", "schema": { @@ -2144,6 +2153,11 @@ "explode": true }, { +<<<<<<< HEAD +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -2161,6 +2175,10 @@ } }, { +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) "name": "x-org-id", "in": "header", "schema": { @@ -2799,6 +2817,7 @@ } }, { +<<<<<<< HEAD "name": "prefix", "in": "query", "style": "form", @@ -2811,6 +2830,10 @@ "explode": true }, { +======= +<<<<<<< HEAD +======= +>>>>>>> 91d47048 (fix: more fixes) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", @@ -2820,6 +2843,10 @@ } }, { +<<<<<<< HEAD +======= +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) "name": "x-org-id", "in": "header", "schema": { diff --git a/docs/docs/api/get-config-json.api.mdx b/docs/docs/api/get-config-json.api.mdx index 37473835f..5f536abc3 100644 --- a/docs/docs/api/get-config-json.api.mdx +++ b/docs/docs/api/get-config-json.api.mdx @@ -48,7 +48,11 @@ Retrieves the full config in JSON format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config-toml.api.mdx b/docs/docs/api/get-config-toml.api.mdx index b552e1ba8..313ffc979 100644 --- a/docs/docs/api/get-config-toml.api.mdx +++ b/docs/docs/api/get-config-toml.api.mdx @@ -48,7 +48,11 @@ Retrieves the full config in TOML format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config.api.mdx b/docs/docs/api/get-config.api.mdx index 2632ff82a..1ecb0a60c 100644 --- a/docs/docs/api/get-config.api.mdx +++ b/docs/docs/api/get-config.api.mdx @@ -5,7 +5,15 @@ description: "Retrieves config data with context evaluation, including applicabl sidebar_label: "GetConfig" hide_title: true hide_table_of_contents: true +<<<<<<< HEAD api: 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 +======= +<<<<<<< HEAD +api: eJzNWEtv2zgQ/iuETruAnWS7yKW3NA3SYBM4cJxT1jBoaWSxlSgtSSU2DP/3nSEl6mHZTZoc2kNbkfPmNy9vgwh0qERhRC6Dz8EUjBLwDJqFuYzFikXccPYiTEIHBtaGwTNPS070IyZkmJaRkCvGiyIVIV+mUBPqEcufQSmBGkaMy4hFEPMyNYwEoIYl1xCxXLJC5c9IFRFnJEiyPglGQV6AsnpuIrTsGsylNQlvFPyHAsyXPNoEn7eBVSgN/bcyg7hOv2tyaRvoMIGM0//MpgAUlS+/Q2hQDipGHUaA9mLWZoiQR84unt63WXajXvjueMEUFAo02kNhMYmPx8m/8h/YUGAV3hfoKjO5JZA8w3Dksf2IRAZS1zEwwqRkyaWTgfKD3a459kGZuohcVpHY7Yiq4AolG1Bo69M2IDXIg9bFYo2yBVmMbGqDH9psrMQ4Vxl99mPGleJEJwxkunWuES9yZY2CdZHmER4aVcJu5BUiCMifPY19FY0oz7oe52o1FlHNmwCPQB1jduAQCqI9O9bjl1z90AUP4R3y5nRCz6cdaj6dndE/XRz4d2F4zWp61OMUWsaUazPO8kjEgoQP4PSwT+gLx7wzFJpjnJbSZfK4foY3acKTj80u/QpMHZDgfN2z2BeN9yTutE5a3RQhnjKkwPQRnJVUqjA3fBXMuAkTtOCE2aTG0iZkK3mrnKaqV1U7XUAo4o2rCLVYk3AUVWrDlsAwVXspX/lFqaxEjkyblo+yzJaIXbx8AbFKzOBVXYEXVMIXP9DUN+T0KMj4+sZd/oUfQtYfuw5SnlpvMApstg7obTnhTZ7vVbh7jm/EUwtd3z7e8LK/jACXr6XrOE3nck+ENT3FstHvYC8JSI+IpnkxrtxrOmz4hlD11FoHRaWNEOIidNS6be9tI2Li47EbOLS9gbyyJi6crneF5BokojQkQ8fWRuZEMARIGZoS7fV5EaewFtT97cDgXXaemkTl5SrJS2MdvLi/6bjl7CL1vve958W7VeNwffptw1Dkul/Qmoz2MVq4q22QS5jEtsP3PaxFT6+uH28vpnuxqc8HglOzPkphgn6613xz6q6HOG8nlxe3i8vJt8l0tqe5cznYt9r6OtRHlU6v7iazq0Nau7c/Vdsln+9a1epr/QozkmAhU4CMQIabxUrxIvkFAL9ixPLqvbZrqwyvLDIx67OiNLCISxmSqoWbfX7m6Z71ezhrodJPS0PxuJFx3i5P/uIrJsSeXj8U7NetTjVo94L54PjrJqzu/Hs+NJrdIIXCJ3gAhSKvlMKsPe8OaR808eAAoPnqQPRrFwbMGXKGODhV86deo7rjEnVkRIeBwaaT5LQt4WNZg7hBJAanYb05aQhLN0dgudAZNufNCS/ESWJM8YVrEV6UxPFkk6x/D9ihlCeYN9IeKCJVuT0o00eBzoN+kf02m90zS804ktP65MJew404l3RP6Dpi2WvUWPJjeiyBfSd69Gmzbl6teVak0F0XiU4Q7kl59a4PJSKhlTJ++saF4dP5+Ozv8dl5VetNxi2uqjUFQc38ptuxvrXp/laLehVwknWKc5KwE2upUrLYIdBmOnmEoEkImniy3ZLcR5XudnTs1kKCZSQ0mYcwjnmqYRRg423vrdYqPAgIoweIm52zoZ7TB07dS3ogQni9/g0qPRj5P6ZVAfuTHfLd2dBaXo+b/BGq2qttR5sjqGrJeOZqeU2xV94ajoswhMIcpW0XnPvJA/XbZfWTTGZ/CAgUf6Gfa/BvtIZ+0TH1cGfPaAmWq9IWycDJpD//A6RphGo= +======= +api: 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 +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null @@ -48,7 +56,11 @@ Retrieves config data with context evaluation, including applicable contexts, ov >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/list-experiment-groups.api.mdx b/docs/docs/api/list-experiment-groups.api.mdx index f54b44ef5..ca9962808 100644 --- a/docs/docs/api/list-experiment-groups.api.mdx +++ b/docs/docs/api/list-experiment-groups.api.mdx @@ -5,8 +5,18 @@ description: "Lists experiment groups, with support for filtering and pagination sidebar_label: "ListExperimentGroups" hide_title: true hide_table_of_contents: true +<<<<<<< HEAD api: eJztWllv2zgQ/iuEnlrATtx289K3pPV2i922geNisegGBiWNbTaSqCWpJEbg/74zpG7Jiu2kfWqBHJbImW/uo3nwQtCBEqkRMvHeen8JbTSD+xSUiCExbKVkluoRuxNmzXSWplIZtpSKLUVk8FCyYjwJWcpXIuFE5MQbeRKv2w8fw5zmtKT4wRLEQwr+y0CbCxluvLcPXiATg6/pV56mkQgsgdPvmnA9eDpYQ8zpN7NJAalK/zsEBumkitgZAbokc2/6DvIwFESTR5f1K9tRSwefeMoUpAo04iEBzRpYTvfk3+RP2Gj8qPB9KlF0I+2BhMegmVzaDyGJqpGcJnUYYSJC8s7RQPredls97tPPzCnnXa6U7ZYupFwhE9Q6wv724BFHvB7ILCHxBGHHW2rjtSX6nMU+KAInDMSaIPuAMppMJRAykTDgwZqMCIS3o+vE3n8aWRSghExPhhFf4gnm2BJZpKkE3MKIacOVNcpSyZi9OgTu/jTrWHkUDUP9iCZXGZJxgmuGN1ju3KQFUs2IiVUibbRUkcIqe1od2UCy1uyVypcyAp78HP51Ddgfgyr43eYC5m86mcOGBXsB9zwwLOYG3QFzh858bQjNiIWQQhISMATk8+AGPzERpxEQEYvzZa86HIGfD6WumUABRx0v/M2++qHkkGn8/W4tWX7dPmyjPU7mA8jX5Yi4NotYhmIpjpeGiLCCyI+SaR8mdck0lquFTB4TCCKbx+m0JYq5PYuwEPqbYcyA6QRzcREihT9wysdNpeKj6yrlt9L9FfL9knSBP2YJuodOHKJyXnAdFN6rGB1znw4Knho9kiwv4rbcR1ikWFnXbVkrhCcaVF7xe01EonWxachk7bOwEA5wMDpPNcYF8YuvV9PZ4t1sej6fvidRr/65mk8/LT5MP09n9MwJbDYWBCKP++TnSnGrW0qOQ4atc8PHbWZ1ga0l50Sn01E8VSAkiG4eyRD5UK6v6bTsNBY2pS1QAnTB1WOOk58ip1/KKJJ3GF0igryry+u5zzUGGTpArQE6xJuewqQwgE3XxBTzNDRi6H0h+ScSvGDWcDixHBcBONYiCUq/WwMPezqEvy28TLumT2DZfDP5jblGTwMT2OLkOZVjk6yUVCMSCStJAhAWDdAa62iEZzRQgTUQbcjyqLTgpugmS5IB2rRoGtfGpOWbEzZHAMSSSrlQYBNUzG8AS5ZCJ1pzw4JIYArBbpQn+BWQb9WJUz3nt1KELEsSCEBrrhAI9gcaYYNVOZLi+JVIlqUhgtWH5Itf+iJ91T3ufizVaizCjqPtUunWDUIEuBPb9+M7qW50ynscd3961/TESWhT3evJhH505772DMLwZKkcZOl4WxpU28rQ6h3PdsLBJ8806hlpeLSgzlV3m3+ar+z7doqv3qP59qkJJfd2dkN34Sqs3AdFzgJDzkYFE12sr/9piiDCXpXlaXCx5nrde8A5SM+LBsY+yhhsK1hgVOpdJ54+QM+K4Znm5KS4g/2ooI0Bp24utDrKebluHPmfMDtch7AUSW2IzmdrCs9bHuFcw3QKgVi6clqStSEeZ9inYFLBuaY1ejsc1jEUXy5FsEARAursV9D1j5EX83sRUxF6NZngJ5G4TxMkEAOdWVT2XYhQ799e2BioWsWeNEt9C70hH4WxQR5e7Y6/6bVcp+Hcm3Cn/+8j72c4EZl9xNwRrw119bK45WjHXa8bqeRbi1rjbq1JuLCg7eVa9/nsDV8LW6GqdrxV0dWK8dbo0Jgr67E1avXQYd+c0WPPXS47KiaXnpDYPa7MiprQifzzfE5YdqfvsgaddNRlE3EzX48a2f36sWWZI93clp311bmPeEJhMroCdQtqSi0JO2uWuWeqTjG1D6u+LF1b/fXA6ROGbvAVbf1qpmD5JvWajGvWklatqdQWCTdYN7zTyghjt8c9JfNQ9wBBhmlzY/eIOhZmvTnhqTihluqCaxGcZ0Th2zV1I+33gA2QKg9cV9SuSDVO+t00S3XQ805V/WM+v2T2NON4nBawTv9Fy2M3YfSenG8A2T5s7PEhPvaANRhZf1YtrKf3nPZCzYUznRPJUlrmxRScoQXQKiKnjVbWDsLryeuz8eTNeHJGkpDhYm4dLG/+yNFZ19qdEl+66zPt7nO1kUynacSFrZiZioiX86t67s39inIOeRY6w5pcEM88PNBk91VF2y09dnMouVsoNPcjivwljzQMCHTg2roX+Q1sajty2z7gZ4/8en8gh2yjB1Dka+8jQfygPfMAXrf6PhLuT9gJD0DPy9qTsR+0rx1ywHpFf15U++1dB7D1dAtHIxxepA6AqBa1R/Ledxf6GIbns9Axi8sBdI3O71glPWUlN4BtYAtZIb3Om3SfKiO1FsU247Cq8Gvp5JZ0A+bo23se6TEvZrlkL9kwz9rm68ezqu/FGtzcgbx3Hs+bwdJp56sb50EAqRk8W++zL79czfGwn//tQmw3857id/iQviMa+isI+18ldMA+o7VZssrsUOA5mvTvf9MKveQ= sidebar_class_name: "post api-method" +======= +<<<<<<< HEAD +api: eJy9WEtv4kgQ/istnzISECarXHJLsmw22t3ZCJjDKkKoscu4J35tdzsThPjvU9W2of3AAfI4Je2urvrqXdTa8UC5UqRaJLFz5fwtlFYMXlKQIoJYs6VMslT12E+hA6ayNE2kZn4imS9CjUTxkvHYYylfipgTk4HTcxJ8bg73XsFztOV4ZxgiUcoljwB5KOfqce3EeEBiN8lijbeC0PyfgVzhoYrxWxYtQLLEZ0JDpJhO2AKYBJ3JGDwmYgbcDQgSEBjlBhBx52rt6FVKImLz/m1sN5veFjJ96Ub8gBQsF0tskacU8Aw9pjSXmmzoyyRiX4+BezhPGysPw26o9z7TMkM2ueKK4Qv8H4mVJiuQaXpMLOPE+H7nd7bzp7GRCQvjzVatFkkSAo8/R75tAfOn0wR/mMhmi1UjDxg9Zmfwwl3NIq4xHDATVLZQmtD0mAcpxB4BQ0AL7j7hiYkoDYGYGJxfWs2RM/h8KLZlXAkcbTxfrA61jw6AZQr//xkkrHhuPtbRnqbzEextPUKu9DxKPOGL07UhJqxk8lE6HSLE1kxh8Z0n8WsKQehRSSBqw1SCykIs64tVN2bAcoK1uEyRMh441eOqUfHTrOdooUNiUCvuE5T7b9wE/pon6B0GsYfGOePKLaNXMiLLT0clj8WPNCtakmleIbYktu1SamApTzzwiABsFYnXzaqik/HP3EA4IsCInnpMnsRn3yej8fx2PLqejn4nVSf/Taajf+Z3o2+jMX3LFdYrAwKRR236cym5sS0Vxy7H2tLwc12YrbDx5JT4bN5bIWSIYR4mHsqhWm/Z9KWfyGVfeKVFA+Ce6X37fI68qDkICV4Ls5+JfFIpd+EN/Gb0RaUYJWBsezEc0p/m2FQfcRhSsvIppVMSa7ykxzxNQ+Ga2Dv/oYjDuokoWfwAl1IvlRSpWuTydaJ5OKcOp5pDAsLP7+uhsLv3uD4kdrbSazmlsa1y6W0Vw3FDZi62ajCJxePWOllVAf3bZnhjoBc9D7gKWglyv7ZcVDC2cQ54vIQ51jO1jyKX3WYA7nmCOPPwwdaikRZjSNEoqLbCsSMu32DfEjQnc6r6nrFRISvv2ih/wP6ClcIq54sYmEemU1SoSF1lxphnHuL8w1QKrvDztNuy1QFHVhnWM5xWcf4hc5dJfFviMIEhue8Ld44quDQBLKFtyIz4i4ioWnwdDvEk4vw0RAYREM1859+58NThZWizqbSUljJF9Y1uKEahr1GGY73B9tHmuUZjOphxY05oY7/IcHLSh6i5J18r5moV8czRj/uuKwXpscat8tYq3jcGtHlsdal3bww1bKWp6vm2y65ajtdGjMr8aedWr9ZrvbZ5pMWf+0K2V044LSmxf6wZl6W8kfnXxTzhN6f0besYNMxlCnG1Xvcq1d2C0tZfSjy3RV/ZbEjCZVt7ukcKicVoAvIZ5EhKrEKXH9KdsGKpamWxArnUpgVOmzL0gi9pO2C5ghX7gxk5VwcJLRiWYIBwjW3DOd/5oL8sdw0K3AwL5spsGlQkdLAa8FQMAq3TG66Ee53R48cZjQ/1e+AS5JZgtuM2IaPkeu/nuTUEfW/00z+n0wdmqBlHcgRdWL6cUcxvZbqnsOtAdogYQ94lxxAYV4nYTwzTcv7N0KhpokTxBv2mctYXw4vL/vC3/vCSECKJjrgJmWIKo9BlTf81mvY2AN9pB1WYg6rNeRpyYXpgJkOSlYeKXU3LUEHvBqgCXa7XaHf4LsPNhj7nwz3FjycUX4SUxD4PFXRocuSmqhXyE6ystZiZBPDsUKAeDuSYBVQHimLTdSKID1otdeDNt10nwv2ENVAH9KJDvRn7USuargC0m/P7ojps1dKBraXxn4ywe3fSAWK3mzlR9qHrj9cwvJ+HTtlVdKCrDHE7gLNiil1Qo6EOXP5KP67Wno2L2eoL64Zh7RhOtNIRouwNREVaTnDtupDadb0xe23sQeduNMXu/AuB2/OR +sidebar_class_name: "get api-method" +======= +api: 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 +sidebar_class_name: "post api-method" +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) info_path: docs/api/superposition custom_edit_url: null --- @@ -48,7 +58,11 @@ Lists experiment groups, with support for filtering and pagination. >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/list-experiment.api.mdx b/docs/docs/api/list-experiment.api.mdx index c55494e79..925dbfb2b 100644 --- a/docs/docs/api/list-experiment.api.mdx +++ b/docs/docs/api/list-experiment.api.mdx @@ -5,8 +5,18 @@ description: "Retrieves a paginated list of experiments with support for filteri sidebar_label: "ListExperiment" hide_title: true hide_table_of_contents: true +<<<<<<< HEAD api: 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 sidebar_class_name: "post api-method" +======= +<<<<<<< HEAD +api: eJzNWF9P4zgQ/ypWnu6kwHKceNm3LuT2qmMBtWV1EkKRmziNd9M4ZztAhfrdd8ZOUqdNsymw6F6gscfz378Zz7MXMxVJXmgucu+jN2FacvbAFKGkoAueU81iknGliUgIeyqY5EuWa0UeuU6JKotCSE0SIUnCMw27+YLMV0RpqkvlkxjOE0nzBfNJTpfwN5KMaiF9QvPYYUgWUpTFsed7ApYoqjOOQaFLEB00VLBdUAl8QJLyPt49e8gUyCJRml2ORvxXMrmCj7ZpV+VyziSawTVbKqIFmYNuTJcyBxt5ThiNUrSaoRoqStmSeh+fPb0qUERuzr+O7XrtNyrjSr/GN0BBrFhkK6vY+OhdqdHTiRRL8sch6g7n6epKs6xf1XFCtCyBjTUc0ifL4DcQK0wg4xqf8EUuTIZUqQVnySaexkcmLUw0O62aC5Exmr+PfNcDNqG3naD0KsNdyP9ll7pUSop0Rr6zrjSqARsMQgF57J1PgtEsuICV8+ur88vbC/N7fHUzuf48CaZT+LgYT89HE7txM7qdwo9739NcGw02d2RqNJ2hIDDAgyuWiRhI0D+OQRjmEK/njk3bRjTKopVUwwoeO9IgreUiLd6W3wYcQrMykO8eFjx+6+j1edcRbIDtncUbkGVxOF+9o1AFlSAU+fD418mfUaXDpYh5wkFnijheGwAf3UkOsq7z9g1F8bsGt3ECzxEhY0A/lF5VGlO/bJGri4/qhJ9G9ddwrc1GHvBJ4a9jI/L6tGpZtsjEnGahU33BzdluaPeBpcsrRgYKVAnh6kVpCBaBoxc/c1tFhSUjEVkmHsljyjNWFf2q9M2pAqwFw3XKAENzzZ70IV58jZDaqeyJRkZoOVeslTwXteVf0PBaWMs5T0dCLo54XDsjZTQ2NXQv1vgeFhkuWbxzHZ6OHoX8rgoasVfwu8cVVUDqMHMdT09O8F/bc+0miQANqQ/hXUInQXcEx2hRZDwyqfjhm8Kzz7u6iPk3ZnxYSExcza1kLTQkIdZItdtmgOJ2fxs3NvsA8kOAZo90CEqXtxycGFhgfBccu1i20Gg4Vxv1Dn5OKbB7+4HwIvhrdHs5w2IfXAazILz+Gkwm44tg2o2CtshDy/zApOQxC7+zlToMzKu+5v1bE9iXNEl4FMJuBJvYDnflTX3HO1KExjHHXKbZjZss621kmbAC7oN5tgC3+gw8RTi+WCgpEVIQrStZxGAjuOGY/AMeJTFLeM5Ig53mKaNMq/hAM+gxiSpYxJOVBaWarU4psCqhAMCLAHpMBP/aKee1HmjiAwVy0O7Nr0fF+KeJB5GdTa4vYSX49yaYjL8EV7PRpRvEr5ZTHbvKUeEeuU1C/mS/07KhUQUXJnxRVsW2YWndLlmRAfJi6GiZ6TpOjynLmyg3uQChlDZCNt6yzhckcWTg9XKjjqcw4rVsfO5SN8rXjZ3rFrTfeabIbNywFapdxxsG7UZpD35FqQDVw4pfJ0nLj50s8MUeAk6qPRTmtXgg7tZn9ui9xKdopMJSZn37NhM6+utufHN93jZrgyytMuK3m2fXVbtY7ts4tktGR5yq8rCN1A38doKhgwudaDqpS/x621BTatsV2W/Vb4dfu3eoeZ5XPcPa8D7rajrGQCHhkk6ZBKMCKQE/z35J5wFYq9rVwQlwbUeHOl3G4Am6wNmR40mjFjoFciwVOHZaMDtr0il8fHA6b4wZi0qA+JWZP6kl1+nqmBb8ONW6+EQVj0YlHru7x2Zwe58BZsiG4H7DbYrOsPbu59k4ANd3Gui/Z7MbYqgJBXJQt/J43XGaRwHum+u4X7MhYgx5nxxDYELE80QYpvUTpwR3FkLx6gzES1nWpyenZ0cnfx6dnKGGQKKX1KRK1VNjspLWOHALypqM+z9MMisnIsZ8gGrETa2v4M2m1p3nphZkA2C3xuXnZ3zn3MpsvcZl+yrDfIu5ovMMr3lCM8V6HHDgvLNTWUApbzNcNVUPvj1M7OGKHDLG7NGiqDHxRUr8ogFlj752ZtqvrqVsisAQYnduN4R+M5UbQr07czvwlJ1zHXjIHZENOdqq0IM83IymXpg+h014erJiM6Uaovf+yc9L7XjNjKXHrJ6x0kbT+6qjmWMVwPJYD0QOA7bfJlWr8zvpV8oZ57zQXQeIcoc9LWmWYBRFrHBBdKchWrv9x+dgBqXzB0r6lKU= +sidebar_class_name: "get api-method" +======= +api: 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 +sidebar_class_name: "post api-method" +>>>>>>> 8fc501b7 (fix: more fixes) +>>>>>>> 91d47048 (fix: more fixes) info_path: docs/api/superposition custom_edit_url: null --- @@ -48,7 +58,11 @@ Retrieves a paginated list of experiments with support for filtering by status, >>>>>> 8fc501b7 (fix: more fixes) > From 0b4d776f84bd7b97549bb0e0f1deb851d2da317d Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Fri, 20 Mar 2026 13:19:24 +0530 Subject: [PATCH 02/16] feat: Add prefix filter in list exp --- .../Command/GetExperimentConfig.hs | 40 --- .../Io/Superposition/Model/GetConfigInput.hs | 4 + .../Model/ListExperimentGroupsInput.hs | 63 ++++ .../Model/ListExperimentInput.hs | 4 + .../Model/ListExperimentOutput.hs | 51 +++ .../client/SuperpositionAsyncClientImpl.java | 1 + .../client/SuperpositionClientImpl.java | 1 + .../superposition/model/GetConfigInput.java | 5 + .../model/GetExperimentConfig.java | 100 ------ .../model/ListExperimentGroupsInput.java | 82 +++++ .../model/ListExperimentInput.java | 5 + .../model/ListExperimentOutput.java | 69 ++++ .../sdk/src/commands/ListExperimentCommand.ts | 4 + .../commands/ListExperimentGroupsCommand.ts | 6 + clients/javascript/sdk/src/models/models_0.ts | 10 + .../sdk/src/protocols/Aws_restJson1.ts | 4 + .../sdk/superposition_sdk/_private/schemas.py | 28 +- .../python/sdk/superposition_sdk/config.py | 4 + .../sdk/superposition_sdk/deserialize.py | 6 + .../python/sdk/superposition_sdk/models.py | 28 ++ .../python/sdk/superposition_sdk/serialize.py | 15 + .../superposition_sdk/src/client/customize.rs | 1 - .../src/client/list_experiment.rs | 4 + .../src/client/list_experiment_groups.rs | 5 + .../src/operation/get_experiment_config.rs | 316 ------------------ .../_list_experiment_output.rs | 31 ++ .../_list_experiment_groups_input.rs | 29 ++ .../list_experiment_groups/builders.rs | 6 + .../src/protocol_serde/shape_get_config.rs | 6 + .../protocol_serde/shape_list_experiment.rs | 12 + .../shape_list_experiment_groups.rs | 6 + crates/superposition_sdk/src/serde_util.rs | 4 + crates/superposition_sdk/src/types.rs | 21 ++ .../superposition_sdk/src/types/builders.rs | 12 + docs/docs/api/Superposition.openapi.json | 21 ++ docs/docs/api/get-config-json.api.mdx | 4 - docs/docs/api/get-config-toml.api.mdx | 4 - docs/docs/api/get-config.api.mdx | 8 +- docs/docs/api/list-experiment-groups.api.mdx | 9 +- docs/docs/api/list-experiment.api.mdx | 9 +- smithy/patches/python.patch | 133 ++++++++ 41 files changed, 693 insertions(+), 478 deletions(-) delete mode 100644 clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs delete mode 100644 clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java delete mode 100644 crates/superposition_sdk/src/operation/get_experiment_config.rs diff --git a/clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs b/clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs deleted file mode 100644 index 30a7aafe7..000000000 --- a/clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs +++ /dev/null @@ -1,40 +0,0 @@ -module Io.Superposition.Command.GetExperimentConfig ( - GetExperimentConfigError (..), - getExperimentConfig -) where -import qualified Data.Aeson -import qualified Data.Maybe -import qualified Data.Text -import qualified GHC.Generics -import qualified GHC.Show -import qualified Io.Superposition.Model.GetExperimentConfigInput -import qualified Io.Superposition.Model.GetExperimentConfigOutput -import qualified Io.Superposition.Model.InternalServerError -import qualified Io.Superposition.SuperpositionClient -import qualified Io.Superposition.Utility - -data GetExperimentConfigError = - InternalServerError Io.Superposition.Model.InternalServerError.InternalServerError - | BuilderError Data.Text.Text - | DeSerializationError Io.Superposition.Utility.HttpMetadata Data.Text.Text - | UnexpectedError (Data.Maybe.Maybe Io.Superposition.Utility.HttpMetadata) Data.Text.Text - deriving (GHC.Generics.Generic, GHC.Show.Show) - -instance Data.Aeson.ToJSON GetExperimentConfigError -instance Io.Superposition.Utility.OperationError GetExperimentConfigError where - mkBuilderError = BuilderError - mkDeSerializationError = DeSerializationError - mkUnexpectedError = UnexpectedError - - getErrorParser status - | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.InternalServerError.InternalServerError) = Just (fmap InternalServerError (Io.Superposition.Utility.responseParser @Io.Superposition.Model.InternalServerError.InternalServerError)) - | otherwise = Nothing - - -getExperimentConfig :: Io.Superposition.SuperpositionClient.SuperpositionClient -> Io.Superposition.Model.GetExperimentConfigInput.GetExperimentConfigInputBuilder () -> IO (Either GetExperimentConfigError Io.Superposition.Model.GetExperimentConfigOutput.GetExperimentConfigOutput) -getExperimentConfig client builder = - let endpoint = Io.Superposition.SuperpositionClient.endpointUri client - manager = Io.Superposition.SuperpositionClient.httpManager client - auth = Io.Superposition.SuperpositionClient.getAuth client - in Io.Superposition.Utility.runOperation endpoint manager auth (Io.Superposition.Model.GetExperimentConfigInput.build builder) - diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs index db2b999da..1e4d25b2f 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs @@ -143,6 +143,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serQuery "prefix" (prefix self) Io.Superposition.Utility.serQuery "version" (version self) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -151,6 +152,9 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs index 5ed62644c..ccff708e0 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs @@ -11,6 +11,7 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( setSortOn, setSortBy, setGroupType, +<<<<<<< HEAD <<<<<<< HEAD setDimensionMatchStrategy, setContext, @@ -21,6 +22,10 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( setContext, >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + setDimensionMatchStrategy, + setContext, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) build, ListExperimentGroupsInputBuilder, ListExperimentGroupsInput, @@ -35,6 +40,7 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( last_modified_by, sort_on, sort_by, +<<<<<<< HEAD <<<<<<< HEAD group_type, dimension_match_strategy, @@ -48,6 +54,11 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( context >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + group_type, + dimension_match_strategy, + context +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -81,6 +92,7 @@ data ListExperimentGroupsInput = ListExperimentGroupsInput { last_modified_by :: Data.Maybe.Maybe Data.Text.Text, sort_on :: Data.Maybe.Maybe Io.Superposition.Model.ExperimentGroupSortOn.ExperimentGroupSortOn, sort_by :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, +<<<<<<< HEAD <<<<<<< HEAD group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, @@ -94,6 +106,11 @@ data ListExperimentGroupsInput = ListExperimentGroupsInput { context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), + dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, + context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -113,6 +130,7 @@ instance Data.Aeson.ToJSON ListExperimentGroupsInput where "last_modified_by" Data.Aeson..= last_modified_by a, "sort_on" Data.Aeson..= sort_on a, "sort_by" Data.Aeson..= sort_by a, +<<<<<<< HEAD <<<<<<< HEAD "group_type" Data.Aeson..= group_type a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, @@ -126,6 +144,11 @@ instance Data.Aeson.ToJSON ListExperimentGroupsInput where "context" Data.Aeson..= context a >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + "group_type" Data.Aeson..= group_type a, + "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, + "context" Data.Aeson..= context a +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ] @@ -145,6 +168,7 @@ instance Data.Aeson.FromJSON ListExperimentGroupsInput where Control.Applicative.<*> (v Data.Aeson..:? "sort_on") Control.Applicative.<*> (v Data.Aeson..:? "sort_by") Control.Applicative.<*> (v Data.Aeson..:? "group_type") +<<<<<<< HEAD <<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") Control.Applicative.<*> (v Data.Aeson..:? "context") @@ -155,6 +179,10 @@ instance Data.Aeson.FromJSON ListExperimentGroupsInput where Control.Applicative.<*> (v Data.Aeson..:? "context") >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") + Control.Applicative.<*> (v Data.Aeson..:? "context") +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @@ -171,6 +199,7 @@ data ListExperimentGroupsInputBuilderState = ListExperimentGroupsInputBuilderSta last_modified_byBuilderState :: Data.Maybe.Maybe Data.Text.Text, sort_onBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.ExperimentGroupSortOn.ExperimentGroupSortOn, sort_byBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, +<<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, @@ -184,6 +213,11 @@ data ListExperimentGroupsInputBuilderState = ListExperimentGroupsInputBuilderSta contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), + dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, + contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } deriving ( GHC.Generics.Generic ) @@ -201,6 +235,7 @@ defaultBuilderState = ListExperimentGroupsInputBuilderState { last_modified_byBuilderState = Data.Maybe.Nothing, sort_onBuilderState = Data.Maybe.Nothing, sort_byBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing, @@ -214,6 +249,11 @@ defaultBuilderState = ListExperimentGroupsInputBuilderState { contextBuilderState = Data.Maybe.Nothing >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + group_typeBuilderState = Data.Maybe.Nothing, + dimension_match_strategyBuilderState = Data.Maybe.Nothing, + contextBuilderState = Data.Maybe.Nothing +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } type ListExperimentGroupsInputBuilder = Control.Monad.State.Strict.State ListExperimentGroupsInputBuilderState @@ -266,11 +306,14 @@ setGroupType :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) setGroupType value = Control.Monad.State.Strict.modify (\s -> (s { group_typeBuilderState = value })) +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> ListExperimentGroupsInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) @@ -279,10 +322,13 @@ setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) build :: ListExperimentGroupsInputBuilder () -> Data.Either.Either Data.Text.Text ListExperimentGroupsInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -298,6 +344,7 @@ build builder = do sort_on' <- Data.Either.Right (sort_onBuilderState st) sort_by' <- Data.Either.Right (sort_byBuilderState st) group_type' <- Data.Either.Right (group_typeBuilderState st) +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) context' <- Data.Either.Right (contextBuilderState st) @@ -308,6 +355,10 @@ build builder = do context' <- Data.Either.Right (contextBuilderState st) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) + context' <- Data.Either.Right (contextBuilderState st) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Data.Either.Right (ListExperimentGroupsInput { count = count', page = page', @@ -320,6 +371,7 @@ build builder = do last_modified_by = last_modified_by', sort_on = sort_on', sort_by = sort_by', +<<<<<<< HEAD <<<<<<< HEAD group_type = group_type', dimension_match_strategy = dimension_match_strategy', @@ -333,6 +385,11 @@ build builder = do context = context' >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + group_type = group_type', + dimension_match_strategy = dimension_match_strategy', + context = context' +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }) @@ -350,19 +407,25 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w Io.Superposition.Utility.serQuery "group_type" (group_type self) Io.Superposition.Utility.serQuery "created_by" (created_by self) <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) Io.Superposition.Utility.serQuery "sort_on" (sort_on self) Io.Superposition.Utility.serQuery "name" (name self) Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs index 48b27511d..332cf1aed 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs @@ -330,6 +330,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serQuery "to_date" (to_date self) Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serQuery "status" (status self) +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -338,6 +339,9 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs index 648099c0f..f9ba25fa0 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs @@ -2,6 +2,7 @@ module Io.Superposition.Model.ListExperimentOutput ( setTotalPages, setTotalItems, setData', +<<<<<<< HEAD <<<<<<< HEAD setLastModified, ======= @@ -10,11 +11,15 @@ module Io.Superposition.Model.ListExperimentOutput ( setLastModified, >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + setLastModified, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) build, ListExperimentOutputBuilder, ListExperimentOutput, total_pages, total_items, +<<<<<<< HEAD <<<<<<< HEAD data', last_modified @@ -26,6 +31,10 @@ module Io.Superposition.Model.ListExperimentOutput ( last_modified >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + data', + last_modified +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -46,6 +55,7 @@ import qualified Network.HTTP.Types data ListExperimentOutput = ListExperimentOutput { total_pages :: Data.Int.Int32, total_items :: Data.Int.Int32, +<<<<<<< HEAD <<<<<<< HEAD data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, last_modified :: Data.Time.UTCTime @@ -57,6 +67,10 @@ data ListExperimentOutput = ListExperimentOutput { last_modified :: Data.Time.UTCTime >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, + last_modified :: Data.Time.UTCTime +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -67,6 +81,7 @@ instance Data.Aeson.ToJSON ListExperimentOutput where toJSON a = Data.Aeson.object [ "total_pages" Data.Aeson..= total_pages a, "total_items" Data.Aeson..= total_items a, +<<<<<<< HEAD <<<<<<< HEAD "data" Data.Aeson..= data' a, "last_modified" Data.Aeson..= last_modified a @@ -78,6 +93,10 @@ instance Data.Aeson.ToJSON ListExperimentOutput where "last_modified" Data.Aeson..= last_modified a >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + "data" Data.Aeson..= data' a, + "last_modified" Data.Aeson..= last_modified a +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ] @@ -88,6 +107,7 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Data.Functor.<$> (v Data.Aeson..: "total_pages") Control.Applicative.<*> (v Data.Aeson..: "total_items") Control.Applicative.<*> (v Data.Aeson..: "data") +<<<<<<< HEAD <<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..: "last_modified") ======= @@ -96,6 +116,9 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Control.Applicative.<*> (v Data.Aeson..: "last_modified") >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + Control.Applicative.<*> (v Data.Aeson..: "last_modified") +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @@ -103,6 +126,7 @@ instance Data.Aeson.FromJSON ListExperimentOutput where data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { total_pagesBuilderState :: Data.Maybe.Maybe Data.Int.Int32, total_itemsBuilderState :: Data.Maybe.Maybe Data.Int.Int32, +<<<<<<< HEAD <<<<<<< HEAD data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime @@ -114,6 +138,10 @@ data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), + last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } deriving ( GHC.Generics.Generic ) @@ -122,6 +150,7 @@ defaultBuilderState :: ListExperimentOutputBuilderState defaultBuilderState = ListExperimentOutputBuilderState { total_pagesBuilderState = Data.Maybe.Nothing, total_itemsBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD <<<<<<< HEAD data'BuilderState = Data.Maybe.Nothing, last_modifiedBuilderState = Data.Maybe.Nothing @@ -133,6 +162,10 @@ defaultBuilderState = ListExperimentOutputBuilderState { last_modifiedBuilderState = Data.Maybe.Nothing >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + data'BuilderState = Data.Maybe.Nothing, + last_modifiedBuilderState = Data.Maybe.Nothing +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } type ListExperimentOutputBuilder = Control.Monad.State.Strict.State ListExperimentOutputBuilderState @@ -149,25 +182,32 @@ setData' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse -> L setData' value = Control.Monad.State.Strict.modify (\s -> (s { data'BuilderState = Data.Maybe.Just value })) +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () setLastModified value = Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) build :: ListExperimentOutputBuilder () -> Data.Either.Either Data.Text.Text ListExperimentOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState total_pages' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.total_pages is a required property.") Data.Either.Right (total_pagesBuilderState st) total_items' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.total_items is a required property.") Data.Either.Right (total_itemsBuilderState st) data'' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.data' is a required property.") Data.Either.Right (data'BuilderState st) +<<<<<<< HEAD <<<<<<< HEAD last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) Data.Either.Right (ListExperimentOutput { @@ -182,14 +222,19 @@ build builder = do total_items = total_items', data' = data'' ======= +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) Data.Either.Right (ListExperimentOutput { total_pages = total_pages', total_items = total_items', data' = data'', last_modified = last_modified' +<<<<<<< HEAD >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }) @@ -202,6 +247,7 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where var3 <- Io.Superposition.Utility.deSerField "total_items" pure $ ListExperimentOutput { <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD total_pages = var1, @@ -209,13 +255,18 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where data' = var0 ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) total_pages = var2, total_items = var3, data' = var1, last_modified = var0 <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index 79b07bff2..80174e03e 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -275,6 +275,7 @@ final class SuperpositionAsyncClientImpl extends Client implements Superposition .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) .putType(MalformedRequestException.$ID, MalformedRequestException.class, MalformedRequestException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index a5c489143..ea3a72295 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -275,6 +275,7 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClien .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) .putType(MalformedRequestException.$ID, MalformedRequestException.class, MalformedRequestException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java index 6ceb8801d..37f2c15bd 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java @@ -37,6 +37,7 @@ public final class GetConfigInput implements SerializableStruct { new HttpQueryTrait("prefix")) .putMember("version", PreludeSchemas.STRING, new HttpQueryTrait("version")) +<<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) @@ -47,6 +48,10 @@ public final class GetConfigInput implements SerializableStruct { new HttpHeaderTrait("if-modified-since")) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + .putMember("if_modified_since", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java deleted file mode 100644 index cdfdb686c..000000000 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java +++ /dev/null @@ -1,100 +0,0 @@ - -package io.juspay.superposition.model; - -import java.util.List; -import software.amazon.smithy.java.core.schema.ApiOperation; -import software.amazon.smithy.java.core.schema.ApiResource; -import software.amazon.smithy.java.core.schema.Schema; -import software.amazon.smithy.java.core.schema.ShapeBuilder; -import software.amazon.smithy.java.core.serde.TypeRegistry; -import software.amazon.smithy.model.pattern.UriPattern; -import software.amazon.smithy.model.shapes.ShapeId; -import software.amazon.smithy.model.traits.HttpTrait; -import software.amazon.smithy.utils.SmithyGenerated; - -/** - * Retrieves the experiment configuration for a given workspace and organization. The response includes - * details of all experiment groups and experiments that match the specified filters. - */ -@SmithyGenerated -public final class GetExperimentConfig implements ApiOperation { - public static final ShapeId $ID = ShapeId.from("io.superposition#GetExperimentConfig"); - - private static final GetExperimentConfig $INSTANCE = new GetExperimentConfig(); - - static final Schema $SCHEMA = Schema.createOperation($ID, - HttpTrait.builder().method("POST").code(200).uri(UriPattern.parse("/experiment-config")).build()); - - private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() - .putType(InternalServerError.$ID, InternalServerError.class, InternalServerError::builder) - .build(); - - private static final List SCHEMES = List.of(ShapeId.from("smithy.api#httpBasicAuth"), ShapeId.from("smithy.api#httpBearerAuth")); - - /** - * Get an instance of this {@code ApiOperation}. - * - * @return An instance of this class. - */ - public static GetExperimentConfig instance() { - return $INSTANCE; - } - - private GetExperimentConfig() {} - - @Override - public ShapeBuilder inputBuilder() { - return GetExperimentConfigInput.builder(); - } - - @Override - public ShapeBuilder outputBuilder() { - return GetExperimentConfigOutput.builder(); - } - - @Override - public Schema schema() { - return $SCHEMA; - } - - @Override - public Schema inputSchema() { - return GetExperimentConfigInput.$SCHEMA; - } - - @Override - public Schema outputSchema() { - return GetExperimentConfigOutput.$SCHEMA; - } - - @Override - public TypeRegistry errorRegistry() { - return TYPE_REGISTRY; - } - - @Override - public List effectiveAuthSchemes() { - return SCHEMES; - } - - @Override - public Schema inputStreamMember() { - return null; - } - - @Override - public Schema outputStreamMember() { - return null; - } - - @Override - public Schema idempotencyTokenMember() { - return null; - } - - @Override - public ApiResource boundResource() { - return ExperimentConfig.instance(); - } -} - diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java index 146a191b7..fce644f4e 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java @@ -39,6 +39,7 @@ public final class ListExperimentGroupsInput implements SerializableStruct { .putMember("org_id", PreludeSchemas.STRING, new HttpHeaderTrait("x-org-id"), new RequiredTrait()) +<<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) @@ -49,6 +50,10 @@ public final class ListExperimentGroupsInput implements SerializableStruct { new HttpHeaderTrait("if-modified-since")) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + .putMember("if_modified_since", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) .putMember("name", PreludeSchemas.STRING, new HttpQueryTrait("name")) .putMember("created_by", PreludeSchemas.STRING, @@ -61,6 +66,7 @@ public final class ListExperimentGroupsInput implements SerializableStruct { new HttpQueryTrait("sort_by")) .putMember("group_type", SharedSchemas.GROUP_TYPE_LIST, new HttpQueryTrait("group_type")) +<<<<<<< HEAD <<<<<<< HEAD .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) @@ -73,6 +79,11 @@ public final class ListExperimentGroupsInput implements SerializableStruct { .putMember("context", SharedSchemas.CONTEXT_MAP) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, + new HttpQueryTrait("dimension_match_strategy")) + .putMember("context", SharedSchemas.CONTEXT_MAP) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) .build(); private static final Schema $SCHEMA_COUNT = $SCHEMA.member("count"); @@ -87,6 +98,7 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private static final Schema $SCHEMA_SORT_ON = $SCHEMA.member("sort_on"); private static final Schema $SCHEMA_SORT_BY = $SCHEMA.member("sort_by"); private static final Schema $SCHEMA_GROUP_TYPE = $SCHEMA.member("group_type"); +<<<<<<< HEAD <<<<<<< HEAD private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); @@ -97,6 +109,10 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); + private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private final transient Integer count; private final transient Integer page; @@ -110,6 +126,7 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private final transient ExperimentGroupSortOn sortOn; private final transient SortBy sortBy; private final transient List groupType; +<<<<<<< HEAD <<<<<<< HEAD private final transient DimensionMatchStrategy dimensionMatchStrategy; private final transient Map context; @@ -120,6 +137,10 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private final transient Map context; >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + private final transient DimensionMatchStrategy dimensionMatchStrategy; + private final transient Map context; +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private ListExperimentGroupsInput(Builder builder) { this.count = builder.count; @@ -134,6 +155,7 @@ private ListExperimentGroupsInput(Builder builder) { this.sortOn = builder.sortOn; this.sortBy = builder.sortBy; this.groupType = builder.groupType == null ? null : Collections.unmodifiableList(builder.groupType); +<<<<<<< HEAD <<<<<<< HEAD this.dimensionMatchStrategy = builder.dimensionMatchStrategy; this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); @@ -144,6 +166,10 @@ private ListExperimentGroupsInput(Builder builder) { this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + this.dimensionMatchStrategy = builder.dimensionMatchStrategy; + this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } /** @@ -233,11 +259,14 @@ public boolean hasGroupType() { return groupType != null; } +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } @@ -253,10 +282,13 @@ public boolean hasContext() { return context != null; } +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -282,6 +314,7 @@ public boolean equals(Object other) { && Objects.equals(this.lastModifiedBy, that.lastModifiedBy) && Objects.equals(this.sortOn, that.sortOn) && Objects.equals(this.sortBy, that.sortBy) +<<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.groupType, that.groupType) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) @@ -295,10 +328,16 @@ public boolean equals(Object other) { && Objects.equals(this.context, that.context); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + && Objects.equals(this.groupType, that.groupType) + && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) + && Objects.equals(this.context, that.context); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override public int hashCode() { +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ======= @@ -308,6 +347,9 @@ public int hashCode() { return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override @@ -350,10 +392,13 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeList($SCHEMA_GROUP_TYPE, groupType, groupType.size(), SharedSerde.GroupTypeListSerializer.INSTANCE); } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } @@ -361,9 +406,12 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override @@ -376,6 +424,7 @@ public T getMemberValue(Schema member) { case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_PAGE, member, page); case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_ALL, member, all); <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_NAME, member, name); @@ -386,6 +435,8 @@ public T getMemberValue(Schema member) { case 10 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, ifModifiedSince); case 6 -> (T) SchemaUtils.validateSameMember($SCHEMA_NAME, member, name); case 7 -> (T) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, createdBy); @@ -396,9 +447,12 @@ public T getMemberValue(Schema member) { case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -424,6 +478,7 @@ public Builder toBuilder() { builder.sortOn(this.sortOn); builder.sortBy(this.sortBy); builder.groupType(this.groupType); +<<<<<<< HEAD <<<<<<< HEAD builder.dimensionMatchStrategy(this.dimensionMatchStrategy); builder.context(this.context); @@ -434,6 +489,10 @@ public Builder toBuilder() { builder.context(this.context); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + builder.dimensionMatchStrategy(this.dimensionMatchStrategy); + builder.context(this.context); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return builder; } @@ -461,6 +520,7 @@ public static final class Builder implements ShapeBuilder groupType; +<<<<<<< HEAD <<<<<<< HEAD private DimensionMatchStrategy dimensionMatchStrategy; private Map context; @@ -471,6 +531,10 @@ public static final class Builder implements ShapeBuilder context; >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + private DimensionMatchStrategy dimensionMatchStrategy; + private Map context; +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private Builder() {} @@ -601,11 +665,14 @@ public Builder groupType(List groupType) { return this; } +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** * @return this builder. */ @@ -622,10 +689,13 @@ public Builder context(Map context) { return this; } +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public ListExperimentGroupsInput build() { tracker.validate(); @@ -642,6 +712,7 @@ public void setMemberValue(Schema member, Object value) { case 3 -> page((int) SchemaUtils.validateSameMember($SCHEMA_PAGE, member, value)); case 4 -> all((boolean) SchemaUtils.validateSameMember($SCHEMA_ALL, member, value)); <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD case 5 -> name((String) SchemaUtils.validateSameMember($SCHEMA_NAME, member, value)); @@ -652,6 +723,8 @@ public void setMemberValue(Schema member, Object value) { case 10 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 5 -> ifModifiedSince((Instant) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, value)); case 6 -> name((String) SchemaUtils.validateSameMember($SCHEMA_NAME, member, value)); case 7 -> createdBy((String) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, value)); @@ -662,9 +735,12 @@ public void setMemberValue(Schema member, Object value) { case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -707,6 +783,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 3 -> builder.page(de.readInteger(member)); case 4 -> builder.all(de.readBoolean(member)); <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD case 5 -> builder.name(de.readString(member)); @@ -717,6 +794,8 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 10 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 5 -> builder.ifModifiedSince(de.readTimestamp(member)); case 6 -> builder.name(de.readString(member)); case 7 -> builder.createdBy(de.readString(member)); @@ -727,9 +806,12 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java index 95ca973a4..638c24e9d 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java @@ -39,6 +39,7 @@ public final class ListExperimentInput implements SerializableStruct { .putMember("org_id", PreludeSchemas.STRING, new HttpHeaderTrait("x-org-id"), new RequiredTrait()) +<<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) @@ -49,6 +50,10 @@ public final class ListExperimentInput implements SerializableStruct { new HttpHeaderTrait("if-modified-since")) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + .putMember("if_modified_since", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) .putMember("status", SharedSchemas.EXPERIMENT_STATUS_TYPE_LIST, new HttpQueryTrait("status")) .putMember("from_date", SharedSchemas.DATE_TIME, diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java index 0bcfd9256..9d673b9cf 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java @@ -30,6 +30,7 @@ public final class ListExperimentOutput implements SerializableStruct { new RequiredTrait()) .putMember("data", SharedSchemas.EXPERIMENT_LIST, new RequiredTrait()) +<<<<<<< HEAD <<<<<<< HEAD .putMember("last_modified", SharedSchemas.DATE_TIME, new HttpHeaderTrait("last-modified"), @@ -42,11 +43,17 @@ public final class ListExperimentOutput implements SerializableStruct { new RequiredTrait()) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + .putMember("last_modified", SharedSchemas.DATE_TIME, + new HttpHeaderTrait("last-modified"), + new RequiredTrait()) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) .build(); private static final Schema $SCHEMA_TOTAL_PAGES = $SCHEMA.member("total_pages"); private static final Schema $SCHEMA_TOTAL_ITEMS = $SCHEMA.member("total_items"); private static final Schema $SCHEMA_DATA = $SCHEMA.member("data"); +<<<<<<< HEAD <<<<<<< HEAD private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ======= @@ -55,10 +62,14 @@ public final class ListExperimentOutput implements SerializableStruct { private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private final transient int totalPages; private final transient int totalItems; private final transient List data; +<<<<<<< HEAD <<<<<<< HEAD private final transient Instant lastModified; ======= @@ -67,11 +78,15 @@ public final class ListExperimentOutput implements SerializableStruct { private final transient Instant lastModified; >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + private final transient Instant lastModified; +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private ListExperimentOutput(Builder builder) { this.totalPages = builder.totalPages; this.totalItems = builder.totalItems; this.data = Collections.unmodifiableList(builder.data); +<<<<<<< HEAD <<<<<<< HEAD this.lastModified = builder.lastModified; ======= @@ -80,6 +95,9 @@ private ListExperimentOutput(Builder builder) { this.lastModified = builder.lastModified; >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + this.lastModified = builder.lastModified; +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } public int totalPages() { @@ -98,19 +116,25 @@ public boolean hasData() { return true; } +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) public Instant lastModified() { return lastModified; } +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -127,6 +151,7 @@ public boolean equals(Object other) { ListExperimentOutput that = (ListExperimentOutput) other; return this.totalPages == that.totalPages && this.totalItems == that.totalItems +<<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.data, that.data) && Objects.equals(this.lastModified, that.lastModified); @@ -138,10 +163,15 @@ public boolean equals(Object other) { && Objects.equals(this.lastModified, that.lastModified); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + && Objects.equals(this.data, that.data) + && Objects.equals(this.lastModified, that.lastModified); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override public int hashCode() { +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(totalPages, totalItems, data, lastModified); ======= @@ -151,6 +181,9 @@ public int hashCode() { return Objects.hash(totalPages, totalItems, data, lastModified); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + return Objects.hash(totalPages, totalItems, data, lastModified); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override @@ -163,6 +196,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeInteger($SCHEMA_TOTAL_PAGES, totalPages); serializer.writeInteger($SCHEMA_TOTAL_ITEMS, totalItems); serializer.writeList($SCHEMA_DATA, data, data.size(), SharedSerde.ExperimentListSerializer.INSTANCE); +<<<<<<< HEAD <<<<<<< HEAD serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ======= @@ -171,6 +205,9 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override @@ -180,6 +217,7 @@ public T getMemberValue(Schema member) { case 0 -> (T) SchemaUtils.validateSameMember($SCHEMA_TOTAL_PAGES, member, totalPages); case 1 -> (T) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, totalItems); case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_DATA, member, data); +<<<<<<< HEAD <<<<<<< HEAD case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ======= @@ -188,6 +226,9 @@ public T getMemberValue(Schema member) { case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -204,6 +245,7 @@ public Builder toBuilder() { builder.totalPages(this.totalPages); builder.totalItems(this.totalItems); builder.data(this.data); +<<<<<<< HEAD <<<<<<< HEAD builder.lastModified(this.lastModified); ======= @@ -212,6 +254,9 @@ public Builder toBuilder() { builder.lastModified(this.lastModified); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + builder.lastModified(this.lastModified); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return builder; } @@ -230,6 +275,7 @@ public static final class Builder implements ShapeBuilder private int totalPages; private int totalItems; private List data; +<<<<<<< HEAD <<<<<<< HEAD private Instant lastModified; ======= @@ -238,6 +284,9 @@ public static final class Builder implements ShapeBuilder private Instant lastModified; >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + private Instant lastModified; +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private Builder() {} @@ -276,11 +325,14 @@ public Builder data(List data) { return this; } +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** *

Required * @return this builder. @@ -291,10 +343,13 @@ public Builder lastModified(Instant lastModified) { return this; } +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public ListExperimentOutput build() { tracker.validate(); @@ -308,6 +363,7 @@ public void setMemberValue(Schema member, Object value) { case 0 -> totalPages((int) SchemaUtils.validateSameMember($SCHEMA_TOTAL_PAGES, member, value)); case 1 -> totalItems((int) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, value)); case 2 -> data((List) SchemaUtils.validateSameMember($SCHEMA_DATA, member, value)); +<<<<<<< HEAD <<<<<<< HEAD case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ======= @@ -316,6 +372,9 @@ public void setMemberValue(Schema member, Object value) { case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -334,6 +393,7 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_DATA)) { data(Collections.emptyList()); } +<<<<<<< HEAD <<<<<<< HEAD if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { lastModified(Instant.EPOCH); @@ -346,6 +406,11 @@ public ShapeBuilder errorCorrection() { } >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { + lastModified(Instant.EPOCH); + } +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return this; } @@ -370,6 +435,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 0 -> builder.totalPages(de.readInteger(member)); case 1 -> builder.totalItems(de.readInteger(member)); case 2 -> builder.data(SharedSerde.deserializeExperimentList(member, de)); +<<<<<<< HEAD <<<<<<< HEAD case 3 -> builder.lastModified(de.readTimestamp(member)); ======= @@ -378,6 +444,9 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 3 -> builder.lastModified(de.readTimestamp(member)); >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + case 3 -> builder.lastModified(de.readTimestamp(member)); +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts index 5967ad734..af917b350 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts @@ -118,6 +118,7 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // experiment_group_id: "STRING_VALUE", * // }, * // ], +<<<<<<< HEAD <<<<<<< HEAD * // last_modified: new Date("TIMESTAMP"), // required ======= @@ -126,6 +127,9 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // last_modified: new Date("TIMESTAMP"), // required >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + * // last_modified: new Date("TIMESTAMP"), // required +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts index 91e5af00d..072158b36 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts @@ -58,18 +58,24 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO * "USER_CREATED" || "SYSTEM_GENERATED", * ], <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) * dimension_match_strategy: "exact" || "subset", * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) * }; * const command = new ListExperimentGroupsCommand(input); * const response = await client.send(command); diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index 745861d87..f00f2ca54 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -2010,10 +2010,13 @@ export interface ListExperimentGroupsInput { */ group_type?: (GroupType)[] | undefined; <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** * Strategy to follow while filter items based on the context @@ -2028,9 +2031,12 @@ export interface ListExperimentGroupsInput { */ context?: Record | undefined; <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } /** @@ -2164,6 +2170,7 @@ export interface ListExperimentOutput { total_pages: number | undefined; total_items: number | undefined; data: (ExperimentResponse)[] | undefined; +<<<<<<< HEAD <<<<<<< HEAD last_modified: Date | undefined; ======= @@ -2172,6 +2179,9 @@ export interface ListExperimentOutput { last_modified: Date | undefined; >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + last_modified: Date | undefined; +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index e4f836b31..6ab5ad7b2 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -4110,6 +4110,7 @@ export const de_ListExperimentCommand = async( } const contents: any = map({ $metadata: deserializeMetadata(output), +<<<<<<< HEAD <<<<<<< HEAD [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ======= @@ -4118,6 +4119,9 @@ export const de_ListExperimentCommand = async( [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }); const data: Record = __expectNonNull((__expectObject(await parseBody(output.body, context))), "body"); const doc = take(data, { diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index f4aaa66fb..7edafe1d3 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -1717,11 +1717,14 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "if_modified_since": { "target": DATE_TIME, "index": 4, @@ -1732,10 +1735,13 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "context": { "target": CONTEXT_MAP, "index": 5, @@ -10022,11 +10028,14 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "if_modified_since": { "target": DATE_TIME, "index": 5, @@ -10037,10 +10046,13 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": { "target": STRING, "index": 6, @@ -10097,6 +10109,7 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, @@ -10104,6 +10117,8 @@ ======= <<<<<<< HEAD ======= +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 12, @@ -10123,7 +10138,6 @@ ], }, ->>>>>>> 8fc501b7 (fix: more fixes) } ) @@ -10981,11 +10995,14 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "if_modified_since": { "target": DATE_TIME, "index": 5, @@ -10996,10 +11013,13 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "status": { "target": EXPERIMENT_STATUS_TYPE_LIST, "index": 6, @@ -11166,11 +11186,14 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "last_modified": { "target": DATE_TIME, "index": 3, @@ -11181,10 +11204,13 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } ) diff --git a/clients/python/sdk/superposition_sdk/config.py b/clients/python/sdk/superposition_sdk/config.py index 504703be7..106c6a596 100644 --- a/clients/python/sdk/superposition_sdk/config.py +++ b/clients/python/sdk/superposition_sdk/config.py @@ -189,7 +189,11 @@ ) +<<<<<<< HEAD _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] +======= +_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @dataclass(init=False) class Config: """Configuration for Superposition.""" diff --git a/clients/python/sdk/superposition_sdk/deserialize.py b/clients/python/sdk/superposition_sdk/deserialize.py index 974f2b368..cb1f810be 100644 --- a/clients/python/sdk/superposition_sdk/deserialize.py +++ b/clients/python/sdk/superposition_sdk/deserialize.py @@ -1538,11 +1538,14 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf body_kwargs = ListExperimentOutput.deserialize_kwargs(deserializer) kwargs.update(body_kwargs) +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) for fld in http_response.fields: for key, value in fld.as_tuples(): _key_lowercase = key.lower() @@ -1553,10 +1556,13 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf case _: pass +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return ListExperimentOutput(**kwargs) async def _deserialize_error_list_experiment(http_response: HTTPResponse, config: Config) -> ApiError: diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 164c3aa13..c7ac63828 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -10165,21 +10165,27 @@ class ListExperimentGroupsInput: :param group_type: Filter by the type of group (USER_CREATED or SYSTEM_GENERATED). +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) :param dimension_match_strategy: Strategy to follow while filter items based on the context :param context: Map representing the context. Keys correspond to the names of the dimensions. +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) """ count: int | None = None @@ -10194,6 +10200,7 @@ class ListExperimentGroupsInput: sort_on: str | None = None sort_by: str | None = None group_type: list[str] | None = None +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy: str | None = None context: dict[str, Document] | None = None @@ -10204,6 +10211,10 @@ class ListExperimentGroupsInput: context: dict[str, Document] | None = None >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + dimension_match_strategy: str | None = None + context: dict[str, Document] | None = None +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT, self) @@ -10258,21 +10269,27 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 11: kwargs["group_type"] = _deserialize_group_type_list(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["group_type"]) +<<<<<<< HEAD <<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 12: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) case 13: kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["context"]) +<<<<<<< HEAD <<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case _: logger.debug("Unexpected member schema: %s", schema) @@ -11114,6 +11131,7 @@ class ListExperimentOutput: data: list[ExperimentResponse] +<<<<<<< HEAD <<<<<<< HEAD last_modified: datetime @@ -11124,6 +11142,10 @@ class ListExperimentOutput: >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + last_modified: datetime + +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_LIST_EXPERIMENT_OUTPUT, self) @@ -11151,6 +11173,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 2: kwargs["data"] = _deserialize_experiment_list(de, _SCHEMA_LIST_EXPERIMENT_OUTPUT.members["data"]) +<<<<<<< HEAD <<<<<<< HEAD case 3: kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) @@ -11163,6 +11186,11 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + case 3: + kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) + +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case _: logger.debug("Unexpected member schema: %s", schema) diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index 1852cd371..9ff0c3cc3 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1055,6 +1055,7 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) +<<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) @@ -1065,6 +1066,10 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + if input.if_modified_since is not None: + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return _HTTPRequest( destination=_URI( host="", @@ -2036,6 +2041,7 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) +<<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) @@ -2046,6 +2052,10 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + if input.if_modified_since is not None: + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return _HTTPRequest( destination=_URI( host="", @@ -2106,6 +2116,7 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) +<<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) @@ -2116,6 +2127,10 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + if input.if_modified_since is not None: + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return _HTTPRequest( destination=_URI( host="", diff --git a/crates/superposition_sdk/src/client/customize.rs b/crates/superposition_sdk/src/client/customize.rs index 122e8d910..7727b6f50 100644 --- a/crates/superposition_sdk/src/client/customize.rs +++ b/crates/superposition_sdk/src/client/customize.rs @@ -81,7 +81,6 @@ - /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. diff --git a/crates/superposition_sdk/src/client/list_experiment.rs b/crates/superposition_sdk/src/client/list_experiment.rs index a3fa7722e..38ef5e8ee 100644 --- a/crates/superposition_sdk/src/client/list_experiment.rs +++ b/crates/superposition_sdk/src/client/list_experiment.rs @@ -26,6 +26,7 @@ impl super::Client { /// - [`total_pages(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_pages): (undocumented) /// - [`total_items(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_items): (undocumented) /// - [`data(Vec::)`](crate::operation::list_experiment::ListExperimentOutput::data): (undocumented) +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ======= @@ -34,6 +35,9 @@ impl super::Client { /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// - On failure, responds with [`SdkError`](crate::operation::list_experiment::ListExperimentError) pub fn list_experiment(&self) -> crate::operation::list_experiment::builders::ListExperimentFluentBuilder { crate::operation::list_experiment::builders::ListExperimentFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/list_experiment_groups.rs b/crates/superposition_sdk/src/client/list_experiment_groups.rs index 285d5735a..2901469f3 100644 --- a/crates/superposition_sdk/src/client/list_experiment_groups.rs +++ b/crates/superposition_sdk/src/client/list_experiment_groups.rs @@ -15,6 +15,7 @@ impl super::Client { /// - [`sort_on(ExperimentGroupSortOn)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::sort_on) / [`set_sort_on(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_sort_on):
required: **false**
Field to sort the results by.
/// - [`sort_by(SortBy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::sort_by) / [`set_sort_by(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_sort_by):
required: **false**
Sort order (ascending or descending).
/// - [`group_type(GroupType)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::group_type) / [`set_group_type(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_group_type):
required: **false**
Filter by the type of group (USER_CREATED or SYSTEM_GENERATED).
+<<<<<<< HEAD <<<<<<< HEAD /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
/// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
@@ -25,6 +26,10 @@ impl super::Client { /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
>>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+ /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
+>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// - On success, responds with [`ListExperimentGroupsOutput`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput) with field(s): /// - [`total_pages(i32)`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput::total_pages): (undocumented) /// - [`total_items(i32)`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput::total_items): (undocumented) diff --git a/crates/superposition_sdk/src/operation/get_experiment_config.rs b/crates/superposition_sdk/src/operation/get_experiment_config.rs deleted file mode 100644 index 4504a9d36..000000000 --- a/crates/superposition_sdk/src/operation/get_experiment_config.rs +++ /dev/null @@ -1,316 +0,0 @@ -// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. -/// Orchestration and serialization glue logic for `GetExperimentConfig`. -#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)] -#[non_exhaustive] -pub struct GetExperimentConfig; -impl GetExperimentConfig { - /// Creates a new `GetExperimentConfig` - pub fn new() -> Self { - Self - } - pub(crate) async fn orchestrate( - runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins, - input: crate::operation::get_experiment_config::GetExperimentConfigInput, - ) -> ::std::result::Result> { - let map_err = |err: ::aws_smithy_runtime_api::client::result::SdkError<::aws_smithy_runtime_api::client::interceptors::context::Error, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>| { - err.map_service_error(|err| { - err.downcast::().expect("correct error type") - }) - }; - let context = Self::orchestrate_with_stop_point(runtime_plugins, input, ::aws_smithy_runtime::client::orchestrator::StopPoint::None) - .await - .map_err(map_err)?; - let output = context.finalize().map_err(map_err)?; - ::std::result::Result::Ok(output.downcast::().expect("correct output type")) - } - - pub(crate) async fn orchestrate_with_stop_point( - runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins, - input: crate::operation::get_experiment_config::GetExperimentConfigInput, - stop_point: ::aws_smithy_runtime::client::orchestrator::StopPoint, - ) -> ::std::result::Result<::aws_smithy_runtime_api::client::interceptors::context::InterceptorContext, ::aws_smithy_runtime_api::client::result::SdkError<::aws_smithy_runtime_api::client::interceptors::context::Error, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>> { - let input = ::aws_smithy_runtime_api::client::interceptors::context::Input::erase(input); - use ::tracing::Instrument; - ::aws_smithy_runtime::client::orchestrator::invoke_with_stop_point( - "Superposition", - "GetExperimentConfig", - input, - runtime_plugins, - stop_point - ) - // Create a parent span for the entire operation. Includes a random, internal-only, - // seven-digit ID for the operation orchestration so that it can be correlated in the logs. - .instrument(::tracing::debug_span!( - "Superposition.GetExperimentConfig", - "rpc.service" = "Superposition", - "rpc.method" = "GetExperimentConfig", - "sdk_invocation_id" = ::fastrand::u32(1_000_000..10_000_000), - - )) - .await - } - - pub(crate) fn operation_runtime_plugins( - client_runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins, - client_config: &crate::config::Config, - config_override: ::std::option::Option, - ) -> ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins { - let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); - runtime_plugins = runtime_plugins - .with_client_plugin(crate::auth_plugin::DefaultAuthOptionsPlugin::new(vec![::aws_smithy_runtime_api::client::auth::http::HTTP_BASIC_AUTH_SCHEME_ID - , ::aws_smithy_runtime_api::client::auth::http::HTTP_BEARER_AUTH_SCHEME_ID])); - if let ::std::option::Option::Some(config_override) = config_override { - for plugin in config_override.runtime_plugins.iter().cloned() { - runtime_plugins = runtime_plugins.with_operation_plugin(plugin); - } - runtime_plugins = runtime_plugins.with_operation_plugin( - crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components) - ); - } - runtime_plugins - } -} -impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for GetExperimentConfig { - fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> { - let mut cfg = ::aws_smithy_types::config_bag::Layer::new("GetExperimentConfig"); - - cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(GetExperimentConfigRequestSerializer)); - cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(GetExperimentConfigResponseDeserializer)); - - - cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(::aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolverParams::new())); - - cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new( - "GetExperimentConfig", - "Superposition", - )); - - ::std::option::Option::Some(cfg.freeze()) - } - - fn runtime_components(&self, _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> { - #[allow(unused_mut)] - let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("GetExperimentConfig") - .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default()) -.with_interceptor(GetExperimentConfigEndpointParamsInterceptor) - .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::::new()) -.with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::::new()); - - ::std::borrow::Cow::Owned(rcb) - } - } - - -#[derive(Debug)] - struct GetExperimentConfigResponseDeserializer; - impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for GetExperimentConfigResponseDeserializer { - - - fn deserialize_nonstreaming(&self, response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError { - let (success, status) = (response.status().is_success(), response.status().as_u16()); - let headers = response.headers(); - let body = response.body().bytes().expect("body loaded"); - #[allow(unused_mut)] - let mut force_error = false; - - let parse_result = if !success && status != 200 || force_error { - crate::protocol_serde::shape_get_experiment_config::de_get_experiment_config_http_error(status, headers, body) - } else { - crate::protocol_serde::shape_get_experiment_config::de_get_experiment_config_http_response(status, headers, body) - }; - crate::protocol_serde::type_erase_result(parse_result) - } - } -#[derive(Debug)] - struct GetExperimentConfigRequestSerializer; - impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for GetExperimentConfigRequestSerializer { - #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)] - fn serialize_input(&self, input: ::aws_smithy_runtime_api::client::interceptors::context::Input, _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> { - let input = input.downcast::().expect("correct type"); - let _header_serialization_settings = _cfg.load::().cloned().unwrap_or_default(); - let mut request_builder = { - fn uri_base(_input: &crate::operation::get_experiment_config::GetExperimentConfigInput, output: &mut ::std::string::String) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> { - use ::std::fmt::Write as _; - ::std::write!(output, "/experiment-config").expect("formatting should succeed"); - ::std::result::Result::Ok(()) -} -fn uri_query(_input: &crate::operation::get_experiment_config::GetExperimentConfigInput, mut output: &mut ::std::string::String) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> { - let mut query = ::aws_smithy_http::query::Writer::new(output); - if let ::std::option::Option::Some(inner_1) = &_input.prefix { - { - for inner_2 in inner_1 { - query.push_kv("prefix", &::aws_smithy_http::query::fmt_string(inner_2)); - } - } - } - if let ::std::option::Option::Some(inner_3) = &_input.dimension_match_strategy { - { - query.push_kv("dimension_match_strategy", &::aws_smithy_http::query::fmt_string(inner_3)); - } - } - ::std::result::Result::Ok(()) -} -#[allow(clippy::unnecessary_wraps)] -fn update_http_builder( - input: &crate::operation::get_experiment_config::GetExperimentConfigInput, - builder: ::http::request::Builder - ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> { - let mut uri = ::std::string::String::new(); - uri_base(input, &mut uri)?; - uri_query(input, &mut uri)?; - let builder = crate::protocol_serde::shape_get_experiment_config::ser_get_experiment_config_headers(input, builder)?; - ::std::result::Result::Ok(builder.method("POST").uri(uri)) -} -let mut builder = update_http_builder(&input, ::http::request::Builder::new())?; -builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/json"); -builder - }; - let body = ::aws_smithy_types::body::SdkBody::from(crate::protocol_serde::shape_get_experiment_config::ser_get_experiment_config_input(&input)?); - if let Some(content_length) = body.content_length() { - let content_length = content_length.to_string(); - request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length); - } - ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap()) - } - } -#[derive(Debug)] - struct GetExperimentConfigEndpointParamsInterceptor; - - impl ::aws_smithy_runtime_api::client::interceptors::Intercept for GetExperimentConfigEndpointParamsInterceptor { - fn name(&self) -> &'static str { - "GetExperimentConfigEndpointParamsInterceptor" - } - - fn read_before_execution( - &self, - context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<'_, ::aws_smithy_runtime_api::client::interceptors::context::Input, ::aws_smithy_runtime_api::client::interceptors::context::Output, ::aws_smithy_runtime_api::client::interceptors::context::Error>, - cfg: &mut ::aws_smithy_types::config_bag::ConfigBag, - ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> { - let _input = context.input() - .downcast_ref::() - .ok_or("failed to downcast to GetExperimentConfigInput")?; - - - - let params = crate::config::endpoint::Params::builder() - - .build() - .map_err(|err| ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err))?; - cfg.interceptor_state().store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params)); - ::std::result::Result::Ok(()) - } - } - - // The get_* functions below are generated from JMESPath expressions in the - // operationContextParams trait. They target the operation's input shape. - - - -/// Error type for the `GetExperimentConfigError` operation. -#[non_exhaustive] -#[derive(::std::fmt::Debug)] -pub enum GetExperimentConfigError { - #[allow(missing_docs)] // documentation missing in model - InternalServerError(crate::types::error::InternalServerError), - /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). - #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \ - variable wildcard pattern and check `.code()`: - \ -    `err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }` - \ - See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-GetExperimentConfigError) for what information is available for the error.")] - Unhandled(crate::error::sealed_unhandled::Unhandled), -} -impl GetExperimentConfigError { - /// Creates the `GetExperimentConfigError::Unhandled` variant from any error type. - pub fn unhandled(err: impl ::std::convert::Into<::std::boxed::Box>) -> Self { - Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source: err.into(), meta: ::std::default::Default::default() }) - } - - /// Creates the `GetExperimentConfigError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata). - pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self { - Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source: err.clone().into(), meta: err }) - } - /// - /// Returns error metadata, which includes the error code, message, - /// request ID, and potentially additional information. - /// - pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata { - match self { - Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), - Self::Unhandled(e) => &e.meta, - } - } - /// Returns `true` if the error kind is `GetExperimentConfigError::InternalServerError`. - pub fn is_internal_server_error(&self) -> bool { - matches!(self, Self::InternalServerError(_)) - } -} -impl ::std::error::Error for GetExperimentConfigError { - fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> { - match self { - Self::InternalServerError(_inner) => - ::std::option::Option::Some(_inner) - , - Self::Unhandled(_inner) => { - ::std::option::Option::Some(&*_inner.source) - } - } - } -} -impl ::std::fmt::Display for GetExperimentConfigError { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - match self { - Self::InternalServerError(_inner) => - _inner.fmt(f) - , - Self::Unhandled(_inner) => { - if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) { - write!(f, "unhandled error ({code})") - } else { - f.write_str("unhandled error") - } - } - } - } -} -impl ::aws_smithy_types::retry::ProvideErrorKind for GetExperimentConfigError { - fn code(&self) -> ::std::option::Option<&str> { - ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) - } - fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> { - ::std::option::Option::None - } -} -impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for GetExperimentConfigError { - fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata { - match self { - Self::InternalServerError(_inner) => - ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) - , - Self::Unhandled(_inner) => { - &_inner.meta - } - } - } -} -impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for GetExperimentConfigError { - fn create_unhandled_error( - source: ::std::boxed::Box, - meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata> - ) -> Self { - Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source, meta: meta.unwrap_or_default() }) - } -} - -pub use crate::operation::get_experiment_config::_get_experiment_config_output::GetExperimentConfigOutput; - -pub use crate::operation::get_experiment_config::_get_experiment_config_input::GetExperimentConfigInput; - -mod _get_experiment_config_input; - -mod _get_experiment_config_output; - -/// Builders -pub mod builders; - diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs index ea16d44d6..d702fcb53 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs @@ -9,6 +9,7 @@ pub struct ListExperimentOutput { pub total_items: i32, #[allow(missing_docs)] // documentation missing in model pub data: ::std::vec::Vec::, +<<<<<<< HEAD <<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model pub last_modified: ::aws_smithy_types::DateTime, @@ -19,6 +20,10 @@ pub struct ListExperimentOutput { pub last_modified: ::aws_smithy_types::DateTime, >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + #[allow(missing_docs)] // documentation missing in model + pub last_modified: ::aws_smithy_types::DateTime, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentOutput { #[allow(missing_docs)] // documentation missing in model @@ -34,18 +39,24 @@ impl ListExperimentOutput { use std::ops::Deref; self.data.deref() } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { &self.last_modified } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentOutput { /// Creates a new builder-style object to manufacture [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput). @@ -61,6 +72,7 @@ pub struct ListExperimentOutputBuilder { pub(crate) total_pages: ::std::option::Option, pub(crate) total_items: ::std::option::Option, pub(crate) data: ::std::option::Option<::std::vec::Vec::>, +<<<<<<< HEAD <<<<<<< HEAD pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ======= @@ -69,6 +81,9 @@ pub struct ListExperimentOutputBuilder { pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -118,10 +133,13 @@ impl ListExperimentOutputBuilder { &self.data } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model /// This field is required. pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { @@ -137,14 +155,18 @@ impl ListExperimentOutputBuilder { &self.last_modified } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Consumes the builder and constructs a [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput). /// This method will fail if any of the following fields are not set: /// - [`total_pages`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::total_pages) /// - [`total_items`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::total_items) /// - [`data`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::data) +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ======= @@ -153,6 +175,9 @@ impl ListExperimentOutputBuilder { /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::list_experiment::ListExperimentOutput { @@ -172,19 +197,25 @@ impl ListExperimentOutputBuilder { )? , <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) last_modified: self.last_modified .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") )? , <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } ) } diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs index 1c9300fae..0de7e34e7 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs @@ -28,18 +28,24 @@ pub struct ListExperimentGroupsInput { /// Filter by the type of group (USER_CREATED or SYSTEM_GENERATED). pub group_type: ::std::option::Option<::std::vec::Vec::>, <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentGroupsInput { /// Number of items to be returned in each page. @@ -94,10 +100,13 @@ impl ListExperimentGroupsInput { .unwrap_or_default() } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() @@ -107,9 +116,12 @@ impl ListExperimentGroupsInput { self.context.as_ref() } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentGroupsInput { /// Creates a new builder-style object to manufacture [`ListExperimentGroupsInput`](crate::operation::list_experiment_groups::ListExperimentGroupsInput). @@ -134,6 +146,7 @@ pub struct ListExperimentGroupsInputBuilder { pub(crate) sort_on: ::std::option::Option, pub(crate) sort_by: ::std::option::Option, pub(crate) group_type: ::std::option::Option<::std::vec::Vec::>, +<<<<<<< HEAD <<<<<<< HEAD pub(crate) dimension_match_strategy: ::std::option::Option, pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, @@ -144,6 +157,10 @@ pub struct ListExperimentGroupsInputBuilder { pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= + pub(crate) dimension_match_strategy: ::std::option::Option, + pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentGroupsInputBuilder { /// Number of items to be returned in each page. @@ -311,10 +328,13 @@ impl ListExperimentGroupsInputBuilder { &self.group_type } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -348,9 +368,12 @@ impl ListExperimentGroupsInputBuilder { &self.context } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Consumes the builder and constructs a [`ListExperimentGroupsInput`](crate::operation::list_experiment_groups::ListExperimentGroupsInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -380,18 +403,24 @@ impl ListExperimentGroupsInputBuilder { group_type: self.group_type , <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) dimension_match_strategy: self.dimension_match_strategy , context: self.context , <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } ) } diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs index 58b408875..8126e326d 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs @@ -270,10 +270,13 @@ impl ListExperimentGroupsFluentBuilder { self.inner.get_group_type() } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -308,8 +311,11 @@ impl ListExperimentGroupsFluentBuilder { self.inner.get_context() } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs index b985ae4bf..174f473e4 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs @@ -78,10 +78,13 @@ pub fn ser_get_config_headers( builder = builder.header("x-org-id", header_value); } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -95,9 +98,12 @@ pub fn ser_get_config_headers( builder = builder.header("if-modified-since", header_value); } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Ok(builder) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs index 2d205fe56..a44dd3df8 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs @@ -38,18 +38,24 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers let mut output = crate::operation::list_experiment::builders::ListExperimentOutputBuilder::default(); output = crate::protocol_serde::shape_list_experiment::de_list_experiment(_response_body, output).map_err(crate::operation::list_experiment::ListExperimentError::unhandled)?; <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) output = output.set_last_modified( crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? ); <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) crate::serde_util::list_experiment_output_output_correct_errors(output).build().map_err(crate::operation::list_experiment::ListExperimentError::unhandled)? }) } @@ -83,10 +89,13 @@ pub fn ser_list_experiment_headers( builder = builder.header("x-org-id", header_value); } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -100,9 +109,12 @@ pub fn ser_list_experiment_headers( builder = builder.header("if-modified-since", header_value); } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Ok(builder) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs index de59edecb..99e7ab0b6 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs @@ -74,10 +74,13 @@ pub fn ser_list_experiment_groups_headers( builder = builder.header("x-org-id", header_value); } <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -91,9 +94,12 @@ pub fn ser_list_experiment_groups_headers( builder = builder.header("if-modified-since", header_value); } <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Ok(builder) } diff --git a/crates/superposition_sdk/src/serde_util.rs b/crates/superposition_sdk/src/serde_util.rs index 045936a60..49a82f885 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -592,6 +592,7 @@ pub(crate) fn list_experiment_output_output_correct_errors(mut builder: crate::o if builder.total_items.is_none() { builder.total_items = Some(Default::default()) } if builder.data.is_none() { builder.data = Some(Default::default()) } <<<<<<< HEAD +<<<<<<< HEAD if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ======= <<<<<<< HEAD @@ -599,6 +600,9 @@ if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_t if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) builder } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index 80be77db7..6dbd8529a 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -15,6 +15,7 @@ pub use crate::types::_group_type::GroupType; pub use crate::types::_bucket::Bucket; +<<<<<<< HEAD <<<<<<< HEAD pub use crate::types::_experiment_response::ExperimentResponse; @@ -34,6 +35,9 @@ pub use crate::types::_experiment_group_response::ExperimentGroupResponse; pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) pub use crate::types::_experiment_group_sort_on::ExperimentGroupSortOn; @@ -49,6 +53,7 @@ pub use crate::types::_workspace_response::WorkspaceResponse; pub use crate::types::_type_templates_response::TypeTemplatesResponse; +<<<<<<< HEAD pub use crate::types::_experiment_sort_on::ExperimentSortOn; <<<<<<< HEAD @@ -65,6 +70,22 @@ pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; pub use crate::types::_experiment_sort_on::ExperimentSortOn; >>>>>>> 91d47048 (fix: more fixes) +======= +pub use crate::types::_variant::Variant; + +pub use crate::types::_variant_type::VariantType; + +pub use crate::types::_experiment_response::ExperimentResponse; + +pub use crate::types::_experiment_status_type::ExperimentStatusType; + +pub use crate::types::_experiment_type::ExperimentType; + +pub use crate::types::_experiment_sort_on::ExperimentSortOn; + +pub use crate::types::_variant_update_request::VariantUpdateRequest; + +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) pub use crate::types::_org_status::OrgStatus; pub use crate::types::_organisation_response::OrganisationResponse; diff --git a/crates/superposition_sdk/src/types/builders.rs b/crates/superposition_sdk/src/types/builders.rs index 0c6bfeb74..a0dbe96fd 100644 --- a/crates/superposition_sdk/src/types/builders.rs +++ b/crates/superposition_sdk/src/types/builders.rs @@ -4,12 +4,17 @@ pub use crate::types::_secret_response::SecretResponseBuilder; pub use crate::types::_variable_response::VariableResponseBuilder; pub use crate::types::_experiment_group_response::ExperimentGroupResponseBuilder; +<<<<<<< HEAD pub use crate::types::_bucket::BucketBuilder; pub use crate::types::_experiment_response::ExperimentResponseBuilder; pub use crate::types::_variant::VariantBuilder; +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) + +pub use crate::types::_bucket::BucketBuilder; pub use crate::types::_webhook_response::WebhookResponseBuilder; @@ -17,6 +22,13 @@ pub use crate::types::_workspace_response::WorkspaceResponseBuilder; pub use crate::types::_type_templates_response::TypeTemplatesResponseBuilder; +<<<<<<< HEAD +======= +pub use crate::types::_variant::VariantBuilder; + +pub use crate::types::_experiment_response::ExperimentResponseBuilder; + +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) pub use crate::types::_variant_update_request::VariantUpdateRequestBuilder; pub use crate::types::_organisation_response::OrganisationResponseBuilder; diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 90953e40d..1aa1e2108 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -171,10 +171,13 @@ }, { <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", @@ -185,9 +188,12 @@ }, { <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "x-org-id", "in": "header", "schema": { @@ -2154,10 +2160,13 @@ }, { <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -2176,9 +2185,12 @@ }, { <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "x-org-id", "in": "header", "schema": { @@ -2818,6 +2830,9 @@ }, { <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "prefix", "in": "query", "style": "form", @@ -2830,10 +2845,13 @@ "explode": true }, { +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", @@ -2844,9 +2862,12 @@ }, { <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "x-org-id", "in": "header", "schema": { diff --git a/docs/docs/api/get-config-json.api.mdx b/docs/docs/api/get-config-json.api.mdx index 5f536abc3..37473835f 100644 --- a/docs/docs/api/get-config-json.api.mdx +++ b/docs/docs/api/get-config-json.api.mdx @@ -48,11 +48,7 @@ Retrieves the full config in JSON format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config-toml.api.mdx b/docs/docs/api/get-config-toml.api.mdx index 313ffc979..b552e1ba8 100644 --- a/docs/docs/api/get-config-toml.api.mdx +++ b/docs/docs/api/get-config-toml.api.mdx @@ -48,11 +48,7 @@ Retrieves the full config in TOML format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config.api.mdx b/docs/docs/api/get-config.api.mdx index 1ecb0a60c..9b412dd11 100644 --- a/docs/docs/api/get-config.api.mdx +++ b/docs/docs/api/get-config.api.mdx @@ -6,6 +6,7 @@ sidebar_label: "GetConfig" hide_title: true hide_table_of_contents: true <<<<<<< HEAD +<<<<<<< HEAD api: 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 ======= <<<<<<< HEAD @@ -14,6 +15,9 @@ api: eJzNWEtv2zgQ/iuETruAnWS7yKW3NA3SYBM4cJxT1jBoaWSxlSgtSSU2DP/3nSEl6mHZTZoc2kN api: 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 >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +api: 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 +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null @@ -56,11 +60,7 @@ Retrieves config data with context evaluation, including applicable contexts, ov >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/list-experiment-groups.api.mdx b/docs/docs/api/list-experiment-groups.api.mdx index ca9962808..98012440b 100644 --- a/docs/docs/api/list-experiment-groups.api.mdx +++ b/docs/docs/api/list-experiment-groups.api.mdx @@ -6,6 +6,7 @@ sidebar_label: "ListExperimentGroups" hide_title: true hide_table_of_contents: true <<<<<<< HEAD +<<<<<<< HEAD api: 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 sidebar_class_name: "post api-method" ======= @@ -17,6 +18,10 @@ api: eJztWllv2zgQ/iuEnlrATtx289K3pPV2i922geNisegGBiWNbTaSqCWpJEbg/74zpG7Jiu2kfWq sidebar_class_name: "post api-method" >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +api: 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 +sidebar_class_name: "post api-method" +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) info_path: docs/api/superposition custom_edit_url: null --- @@ -58,11 +63,7 @@ Lists experiment groups, with support for filtering and pagination. >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/list-experiment.api.mdx b/docs/docs/api/list-experiment.api.mdx index 925dbfb2b..85b085993 100644 --- a/docs/docs/api/list-experiment.api.mdx +++ b/docs/docs/api/list-experiment.api.mdx @@ -6,6 +6,7 @@ sidebar_label: "ListExperiment" hide_title: true hide_table_of_contents: true <<<<<<< HEAD +<<<<<<< HEAD api: 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 sidebar_class_name: "post api-method" ======= @@ -17,6 +18,10 @@ api: eJztWt1T4zYQ/1c0fmpnEqB35eXecuC2TDlgknDtDGU8iq3EOmzLlWQgw+R/767kDzlxggMc04e sidebar_class_name: "post api-method" >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) +======= +api: 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 +sidebar_class_name: "post api-method" +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) info_path: docs/api/superposition custom_edit_url: null --- @@ -58,11 +63,7 @@ Retrieves a paginated list of experiments with support for filtering by status, >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/smithy/patches/python.patch b/smithy/patches/python.patch index 3b84397b0..b6a5ba197 100644 --- a/smithy/patches/python.patch +++ b/smithy/patches/python.patch @@ -613,6 +613,7 @@ index 49e83ee2..a0b17933 100644 ] ) @@ -13710,7 +13710,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( +<<<<<<< HEAD ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -676,6 +677,8 @@ index 49e83ee2..a0b17933 100644 ] ) @@ -15087,7 +15087,7 @@ LIST_VARIABLES = APIOperation( +======= +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -684,8 +687,13 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +<<<<<<< HEAD @@ -15344,7 +15344,7 @@ LIST_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, +======= +@@ -13836,7 +13836,7 @@ GET_VARIABLE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -693,8 +701,13 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +<<<<<<< HEAD @@ -15602,7 +15602,7 @@ LIST_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, +======= +@@ -14014,7 +14014,7 @@ GET_WEBHOOK = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -702,6 +715,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +<<<<<<< HEAD @@ -15679,7 +15679,7 @@ ROTATE_MASTER_ENCRYPTION_KEY = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), @@ -712,6 +726,9 @@ index 49e83ee2..a0b17933 100644 ] ) @@ -15858,7 +15858,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( +======= +@@ -14192,7 +14192,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -720,7 +737,11 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +<<<<<<< HEAD @@ -16045,7 +16045,7 @@ UPDATE_ORGANISATION = APIOperation( +======= +@@ -14371,7 +14371,7 @@ GET_WORKSPACE = APIOperation( +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -729,7 +750,11 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +<<<<<<< HEAD @@ -16130,7 +16130,7 @@ ROTATE_WORKSPACE_ENCRYPTION_KEY = APIOperation( +======= +@@ -14597,7 +14597,7 @@ LIST_ORGANISATION = APIOperation( +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -738,6 +763,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +<<<<<<< HEAD @@ -16281,7 +16281,7 @@ UPDATE_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), @@ -776,6 +802,10 @@ index 49e83ee2..a0b17933 100644 ) @@ -17070,7 +17070,7 @@ UPDATE_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, +======= +@@ -14841,7 +14841,7 @@ LIST_SECRETS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -783,12 +813,34 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +<<<<<<< HEAD diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 9ff09776..abff3d68 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -10316,7 +10316,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( +======= +@@ -15087,7 +15087,7 @@ LIST_VARIABLES = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15344,7 +15344,7 @@ LIST_WEBHOOK = APIOperation( +>>>>>>> 588a53c4 (feat: Add prefix filter in list exp) + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15602,7 +15602,7 @@ LIST_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -797,3 +849,84 @@ index 9ff09776..abff3d68 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +@@ -15679,7 +15679,7 @@ ROTATE_MASTER_ENCRYPTION_KEY = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15858,7 +15858,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16045,7 +16045,7 @@ UPDATE_ORGANISATION = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16130,7 +16130,7 @@ ROTATE_WORKSPACE_ENCRYPTION_KEY = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16281,7 +16281,7 @@ UPDATE_SECRET = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16440,7 +16440,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16585,7 +16585,7 @@ UPDATE_VARIABLE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16824,7 +16824,7 @@ UPDATE_WEBHOOK = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -17070,7 +17070,7 @@ UPDATE_WORKSPACE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) From c2b00315e46388162fa73fde4318f3a5eec1fb0e Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Mon, 23 Mar 2026 17:26:02 +0530 Subject: [PATCH 03/16] feat: Add experiment_config endpoint --- .../Command/GetExperimentConfig.hs | 40 +++ .../Model/GetExperimentConfigInput.hs | 42 +++ .../client/SuperpositionAsyncClient.java | 6 +- .../client/SuperpositionAsyncClientImpl.java | 4 + .../client/SuperpositionClient.java | 6 +- .../client/SuperpositionClientImpl.java | 4 + .../model/GetExperimentConfig.java | 100 ++++++ .../model/GetExperimentConfigInput.java | 44 +++ .../commands/GetExperimentConfigCommand.ts | 3 + clients/javascript/sdk/src/models/models_0.ts | 3 + .../sdk/src/protocols/Aws_restJson1.ts | 3 + .../sdk/superposition_sdk/_private/schemas.py | 6 + .../python/sdk/superposition_sdk/config.py | 4 + .../python/sdk/superposition_sdk/models.py | 11 +- .../python/sdk/superposition_sdk/serialize.py | 3 + .../src/middlewares/auth_z/casbin/casbin.sql | 4 + .../superposition_sdk/src/client/customize.rs | 1 + .../src/client/get_experiment_config.rs | 3 + .../src/operation/get_experiment_config.rs | 311 ++++++++++++++++++ .../_get_experiment_config_input.rs | 15 + .../get_experiment_config/builders.rs | 3 + crates/superposition_sdk/src/types.rs | 6 + .../superposition_sdk/src/types/builders.rs | 7 + docs/docs/api/Superposition.openapi.json | 3 + .../get-experiment-config.ParamsDetails.json | 6 +- docs/docs/api/get-experiment-config.api.mdx | 4 + 26 files changed, 634 insertions(+), 8 deletions(-) create mode 100644 clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs create mode 100644 clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java create mode 100644 crates/superposition_sdk/src/operation/get_experiment_config.rs diff --git a/clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs b/clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs new file mode 100644 index 000000000..30a7aafe7 --- /dev/null +++ b/clients/haskell/sdk/Io/Superposition/Command/GetExperimentConfig.hs @@ -0,0 +1,40 @@ +module Io.Superposition.Command.GetExperimentConfig ( + GetExperimentConfigError (..), + getExperimentConfig +) where +import qualified Data.Aeson +import qualified Data.Maybe +import qualified Data.Text +import qualified GHC.Generics +import qualified GHC.Show +import qualified Io.Superposition.Model.GetExperimentConfigInput +import qualified Io.Superposition.Model.GetExperimentConfigOutput +import qualified Io.Superposition.Model.InternalServerError +import qualified Io.Superposition.SuperpositionClient +import qualified Io.Superposition.Utility + +data GetExperimentConfigError = + InternalServerError Io.Superposition.Model.InternalServerError.InternalServerError + | BuilderError Data.Text.Text + | DeSerializationError Io.Superposition.Utility.HttpMetadata Data.Text.Text + | UnexpectedError (Data.Maybe.Maybe Io.Superposition.Utility.HttpMetadata) Data.Text.Text + deriving (GHC.Generics.Generic, GHC.Show.Show) + +instance Data.Aeson.ToJSON GetExperimentConfigError +instance Io.Superposition.Utility.OperationError GetExperimentConfigError where + mkBuilderError = BuilderError + mkDeSerializationError = DeSerializationError + mkUnexpectedError = UnexpectedError + + getErrorParser status + | status == (Io.Superposition.Utility.expectedStatus @Io.Superposition.Model.InternalServerError.InternalServerError) = Just (fmap InternalServerError (Io.Superposition.Utility.responseParser @Io.Superposition.Model.InternalServerError.InternalServerError)) + | otherwise = Nothing + + +getExperimentConfig :: Io.Superposition.SuperpositionClient.SuperpositionClient -> Io.Superposition.Model.GetExperimentConfigInput.GetExperimentConfigInputBuilder () -> IO (Either GetExperimentConfigError Io.Superposition.Model.GetExperimentConfigOutput.GetExperimentConfigOutput) +getExperimentConfig client builder = + let endpoint = Io.Superposition.SuperpositionClient.endpointUri client + manager = Io.Superposition.SuperpositionClient.httpManager client + auth = Io.Superposition.SuperpositionClient.getAuth client + in Io.Superposition.Utility.runOperation endpoint manager auth (Io.Superposition.Model.GetExperimentConfigInput.build builder) + diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs index 076065b1b..fc543a0bc 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs @@ -4,7 +4,10 @@ module Io.Superposition.Model.GetExperimentConfigInput ( setIfModifiedSince, setPrefix, setContext, +<<<<<<< HEAD setDimensionMatchStrategy, +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) build, GetExperimentConfigInputBuilder, GetExperimentConfigInput, @@ -12,8 +15,12 @@ module Io.Superposition.Model.GetExperimentConfigInput ( org_id, if_modified_since, prefix, +<<<<<<< HEAD context, dimension_match_strategy +======= + context +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -27,7 +34,10 @@ import qualified Data.Text import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show +<<<<<<< HEAD import qualified Io.Superposition.Model.DimensionMatchStrategy +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) import qualified Io.Superposition.Utility import qualified Network.HTTP.Types.Method @@ -36,8 +46,12 @@ data GetExperimentConfigInput = GetExperimentConfigInput { org_id :: Data.Text.Text, if_modified_since :: Data.Maybe.Maybe Data.Time.UTCTime, prefix :: Data.Maybe.Maybe ([] Data.Text.Text), +<<<<<<< HEAD context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy +======= + context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -50,8 +64,12 @@ instance Data.Aeson.ToJSON GetExperimentConfigInput where "org_id" Data.Aeson..= org_id a, "if_modified_since" Data.Aeson..= if_modified_since a, "prefix" Data.Aeson..= prefix a, +<<<<<<< HEAD "context" Data.Aeson..= context a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a +======= + "context" Data.Aeson..= context a +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) ] @@ -64,7 +82,10 @@ instance Data.Aeson.FromJSON GetExperimentConfigInput where Control.Applicative.<*> (v Data.Aeson..:? "if_modified_since") Control.Applicative.<*> (v Data.Aeson..:? "prefix") Control.Applicative.<*> (v Data.Aeson..:? "context") +<<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) @@ -74,8 +95,12 @@ data GetExperimentConfigInputBuilderState = GetExperimentConfigInputBuilderState org_idBuilderState :: Data.Maybe.Maybe Data.Text.Text, if_modified_sinceBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime, prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), +<<<<<<< HEAD contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy +======= + contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } deriving ( GHC.Generics.Generic ) @@ -86,8 +111,12 @@ defaultBuilderState = GetExperimentConfigInputBuilderState { org_idBuilderState = Data.Maybe.Nothing, if_modified_sinceBuilderState = Data.Maybe.Nothing, prefixBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD contextBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing +======= + contextBuilderState = Data.Maybe.Nothing +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } type GetExperimentConfigInputBuilder = Control.Monad.State.Strict.State GetExperimentConfigInputBuilderState @@ -112,10 +141,13 @@ setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) +<<<<<<< HEAD setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> GetExperimentConfigInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) build :: GetExperimentConfigInputBuilder () -> Data.Either.Either Data.Text.Text GetExperimentConfigInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -124,14 +156,21 @@ build builder = do if_modified_since' <- Data.Either.Right (if_modified_sinceBuilderState st) prefix' <- Data.Either.Right (prefixBuilderState st) context' <- Data.Either.Right (contextBuilderState st) +<<<<<<< HEAD dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) Data.Either.Right (GetExperimentConfigInput { workspace_id = workspace_id', org_id = org_id', if_modified_since = if_modified_since', prefix = prefix', +<<<<<<< HEAD context = context', dimension_match_strategy = dimension_match_strategy' +======= + context = context' +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) }) @@ -141,7 +180,10 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetExperimentConfigInput wh Io.Superposition.Utility.setPath [ "experiment-config" ] +<<<<<<< HEAD Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) Io.Superposition.Utility.serQuery "prefix" (prefix self) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java index 5b4fbda9a..b7041159b 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java @@ -1819,12 +1819,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); - private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); + private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index 80174e03e..05fdeedf4 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -272,9 +272,13 @@ @SmithyGenerated final class SuperpositionAsyncClientImpl extends Client implements SuperpositionAsyncClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() +<<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java index f18a231d0..d40ed4e31 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java @@ -1818,12 +1818,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); - private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); + private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index ea3a72295..a5c71fd99 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -272,9 +272,13 @@ @SmithyGenerated final class SuperpositionClientImpl extends Client implements SuperpositionClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() +<<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java new file mode 100644 index 000000000..cdfdb686c --- /dev/null +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfig.java @@ -0,0 +1,100 @@ + +package io.juspay.superposition.model; + +import java.util.List; +import software.amazon.smithy.java.core.schema.ApiOperation; +import software.amazon.smithy.java.core.schema.ApiResource; +import software.amazon.smithy.java.core.schema.Schema; +import software.amazon.smithy.java.core.schema.ShapeBuilder; +import software.amazon.smithy.java.core.serde.TypeRegistry; +import software.amazon.smithy.model.pattern.UriPattern; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.traits.HttpTrait; +import software.amazon.smithy.utils.SmithyGenerated; + +/** + * Retrieves the experiment configuration for a given workspace and organization. The response includes + * details of all experiment groups and experiments that match the specified filters. + */ +@SmithyGenerated +public final class GetExperimentConfig implements ApiOperation { + public static final ShapeId $ID = ShapeId.from("io.superposition#GetExperimentConfig"); + + private static final GetExperimentConfig $INSTANCE = new GetExperimentConfig(); + + static final Schema $SCHEMA = Schema.createOperation($ID, + HttpTrait.builder().method("POST").code(200).uri(UriPattern.parse("/experiment-config")).build()); + + private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() + .putType(InternalServerError.$ID, InternalServerError.class, InternalServerError::builder) + .build(); + + private static final List SCHEMES = List.of(ShapeId.from("smithy.api#httpBasicAuth"), ShapeId.from("smithy.api#httpBearerAuth")); + + /** + * Get an instance of this {@code ApiOperation}. + * + * @return An instance of this class. + */ + public static GetExperimentConfig instance() { + return $INSTANCE; + } + + private GetExperimentConfig() {} + + @Override + public ShapeBuilder inputBuilder() { + return GetExperimentConfigInput.builder(); + } + + @Override + public ShapeBuilder outputBuilder() { + return GetExperimentConfigOutput.builder(); + } + + @Override + public Schema schema() { + return $SCHEMA; + } + + @Override + public Schema inputSchema() { + return GetExperimentConfigInput.$SCHEMA; + } + + @Override + public Schema outputSchema() { + return GetExperimentConfigOutput.$SCHEMA; + } + + @Override + public TypeRegistry errorRegistry() { + return TYPE_REGISTRY; + } + + @Override + public List effectiveAuthSchemes() { + return SCHEMES; + } + + @Override + public Schema inputStreamMember() { + return null; + } + + @Override + public Schema outputStreamMember() { + return null; + } + + @Override + public Schema idempotencyTokenMember() { + return null; + } + + @Override + public ApiResource boundResource() { + return ExperimentConfig.instance(); + } +} + diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java index a9a14f6e6..8cafff791 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java @@ -38,8 +38,11 @@ public final class GetExperimentConfigInput implements SerializableStruct { .putMember("prefix", SharedSchemas.STRING_LIST, new HttpQueryTrait("prefix")) .putMember("context", SharedSchemas.CONTEXT_MAP) +<<<<<<< HEAD .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) .build(); private static final Schema $SCHEMA_WORKSPACE_ID = $SCHEMA.member("workspace_id"); @@ -47,14 +50,20 @@ public final class GetExperimentConfigInput implements SerializableStruct { private static final Schema $SCHEMA_IF_MODIFIED_SINCE = $SCHEMA.member("if_modified_since"); private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); +<<<<<<< HEAD private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) private final transient String workspaceId; private final transient String orgId; private final transient Instant ifModifiedSince; private final transient List prefix; private final transient Map context; +<<<<<<< HEAD private final transient DimensionMatchStrategy dimensionMatchStrategy; +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) private GetExperimentConfigInput(Builder builder) { this.workspaceId = builder.workspaceId; @@ -62,7 +71,10 @@ private GetExperimentConfigInput(Builder builder) { this.ifModifiedSince = builder.ifModifiedSince; this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); +<<<<<<< HEAD this.dimensionMatchStrategy = builder.dimensionMatchStrategy; +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } public String workspaceId() { @@ -104,10 +116,13 @@ public boolean hasContext() { return context != null; } +<<<<<<< HEAD public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -126,13 +141,21 @@ public boolean equals(Object other) { && Objects.equals(this.orgId, that.orgId) && Objects.equals(this.ifModifiedSince, that.ifModifiedSince) && Objects.equals(this.prefix, that.prefix) +<<<<<<< HEAD && Objects.equals(this.context, that.context) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy); +======= + && Objects.equals(this.context, that.context); +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } @Override public int hashCode() { +<<<<<<< HEAD return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context, dimensionMatchStrategy); +======= + return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context); +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } @Override @@ -153,9 +176,12 @@ public void serializeMembers(ShapeSerializer serializer) { if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } +<<<<<<< HEAD if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } @Override @@ -167,7 +193,10 @@ public T getMemberValue(Schema member) { case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, ifModifiedSince); case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +<<<<<<< HEAD case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -186,7 +215,10 @@ public Builder toBuilder() { builder.ifModifiedSince(this.ifModifiedSince); builder.prefix(this.prefix); builder.context(this.context); +<<<<<<< HEAD builder.dimensionMatchStrategy(this.dimensionMatchStrategy); +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) return builder; } @@ -207,7 +239,10 @@ public static final class Builder implements ShapeBuilder prefix; private Map context; +<<<<<<< HEAD private DimensionMatchStrategy dimensionMatchStrategy; +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) private Builder() {} @@ -264,6 +299,7 @@ public Builder context(Map context) { return this; } +<<<<<<< HEAD /** * @return this builder. */ @@ -272,6 +308,8 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat return this; } +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) @Override public GetExperimentConfigInput build() { tracker.validate(); @@ -287,7 +325,10 @@ public void setMemberValue(Schema member, Object value) { case 2 -> ifModifiedSince((Instant) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, value)); case 3 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); case 4 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +<<<<<<< HEAD case 5 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -329,7 +370,10 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 2 -> builder.ifModifiedSince(de.readTimestamp(member)); case 3 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); case 4 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +<<<<<<< HEAD case 5 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts b/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts index 89805641c..3f0ced828 100644 --- a/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts +++ b/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts @@ -52,7 +52,10 @@ export interface GetExperimentConfigCommandOutput extends GetExperimentConfigOut * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, +<<<<<<< HEAD * dimension_match_strategy: "exact" || "subset", +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) * }; * const command = new GetExperimentConfigCommand(input); * const response = await client.send(command); diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index f00f2ca54..bc65b3d29 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -1891,12 +1891,15 @@ export interface GetExperimentConfigInput { * @public */ context?: Record | undefined; +<<<<<<< HEAD /** * Strategy to follow while filter items based on the context * @public */ dimension_match_strategy?: DimensionMatchStrategy | undefined; +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index 6ab5ad7b2..dc1af1e81 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -1284,7 +1284,10 @@ export const se_GetExperimentConfigCommand = async( b.bp("/experiment-config"); const query: any = map({ [_p]: [() => input.prefix !== void 0, () => ((input[_p]! || []))], +<<<<<<< HEAD [_dms]: [,input[_dms]!], +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) }); let body: any; body = JSON.stringify(take(input, { diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index 7edafe1d3..92f8d1da8 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -9659,6 +9659,7 @@ ], }, +<<<<<<< HEAD "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 5, @@ -9669,6 +9670,8 @@ ], }, +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } ) @@ -10141,6 +10144,7 @@ } ) +<<<<<<< HEAD EXPERIMENT_GROUP_RESPONSE = Schema.collection( id=ShapeID("io.superposition#ExperimentGroupResponse"), @@ -10168,6 +10172,8 @@ } ) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) LIST_EXPERIMENT_GROUPS_OUTPUT = Schema.collection( id=ShapeID("io.superposition#ListExperimentGroupsOutput"), diff --git a/clients/python/sdk/superposition_sdk/config.py b/clients/python/sdk/superposition_sdk/config.py index 106c6a596..43fd46c18 100644 --- a/clients/python/sdk/superposition_sdk/config.py +++ b/clients/python/sdk/superposition_sdk/config.py @@ -189,11 +189,15 @@ ) +<<<<<<< HEAD <<<<<<< HEAD _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] ======= _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) @dataclass(init=False) class Config: """Configuration for Superposition.""" diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index c7ac63828..e9d83cf36 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -9806,9 +9806,12 @@ class GetExperimentConfigInput: :param context: Map representing the context. Keys correspond to the names of the dimensions. +<<<<<<< HEAD :param dimension_match_strategy: Strategy to follow while filter items based on the context +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) """ workspace_id: str | None = None @@ -9816,7 +9819,10 @@ class GetExperimentConfigInput: if_modified_since: datetime | None = None prefix: list[str] | None = None context: dict[str, Document] | None = None +<<<<<<< HEAD dimension_match_strategy: str | None = None +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT, self) @@ -9850,9 +9856,12 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 4: kwargs["context"] = _deserialize_context_map(de, _SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["context"]) +<<<<<<< HEAD case 5: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["dimension_match_strategy"]) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) case _: logger.debug("Unexpected member schema: %s", schema) @@ -10359,7 +10368,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBasicAuth") ShapeID("smithy.api#httpBearerAuth") ] ) diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index 9ff0c3cc3..3e3caf1bd 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1311,8 +1311,11 @@ async def _serialize_get_experiment_config(input: GetExperimentConfigInput, conf query_params: list[tuple[str, str | None]] = [] if input.prefix is not None: query_params.extend(("prefix", e) for e in input.prefix) +<<<<<<< HEAD if input.dimension_match_strategy is not None: query_params.append(("dimension_match_strategy", input.dimension_match_strategy)) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) query = join_query_params(params=query_params, prefix=query) diff --git a/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql b/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql index 83720a3d0..0b99c3ca7 100644 --- a/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql +++ b/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql @@ -96,6 +96,10 @@ VALUES ('g3', 'experiment_config:get', 'read', '', '', '', ''), ('p', 'experiment_config_reader', '*', 'experiment_config', 'read', '*', '') + -- experiment_config + ('g3', 'experiment_config:get', 'read', '', '', '', ''), + ('p', 'experiment_config_reader', '*', 'experiment_config', 'read', '*', '') + -- TODO: Figure out what to do about Auth and Organisation resources, which don't fit neatly into the "workspace" schema. For now, we can use a wildcard schema ("*") for these resources in the policy rules, but this is something we may want to revisit for more fine-grained control in the future. ON CONFLICT (ptype, v0, v1, v2, v3, v4, v5) DO NOTHING; diff --git a/crates/superposition_sdk/src/client/customize.rs b/crates/superposition_sdk/src/client/customize.rs index 7727b6f50..122e8d910 100644 --- a/crates/superposition_sdk/src/client/customize.rs +++ b/crates/superposition_sdk/src/client/customize.rs @@ -81,6 +81,7 @@ + /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. diff --git a/crates/superposition_sdk/src/client/get_experiment_config.rs b/crates/superposition_sdk/src/client/get_experiment_config.rs index ff5d4d793..44c9d92c7 100644 --- a/crates/superposition_sdk/src/client/get_experiment_config.rs +++ b/crates/superposition_sdk/src/client/get_experiment_config.rs @@ -8,7 +8,10 @@ impl super::Client { /// - [`if_modified_since(DateTime)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::if_modified_since) / [`set_if_modified_since(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_if_modified_since):
required: **false**
While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.
/// - [`prefix(impl Into)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_prefix):
required: **false**
(undocumented)
/// - [`context(impl Into, Document)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::context) / [`set_context(Option>)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
+<<<<<<< HEAD /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) /// - On success, responds with [`GetExperimentConfigOutput`](crate::operation::get_experiment_config::GetExperimentConfigOutput) with field(s): /// - [`last_modified(DateTime)`](crate::operation::get_experiment_config::GetExperimentConfigOutput::last_modified): (undocumented) /// - [`experiments(Vec::)`](crate::operation::get_experiment_config::GetExperimentConfigOutput::experiments): (undocumented) diff --git a/crates/superposition_sdk/src/operation/get_experiment_config.rs b/crates/superposition_sdk/src/operation/get_experiment_config.rs new file mode 100644 index 000000000..ca561fe57 --- /dev/null +++ b/crates/superposition_sdk/src/operation/get_experiment_config.rs @@ -0,0 +1,311 @@ +// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. +/// Orchestration and serialization glue logic for `GetExperimentConfig`. +#[derive(::std::clone::Clone, ::std::default::Default, ::std::fmt::Debug)] +#[non_exhaustive] +pub struct GetExperimentConfig; +impl GetExperimentConfig { + /// Creates a new `GetExperimentConfig` + pub fn new() -> Self { + Self + } + pub(crate) async fn orchestrate( + runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins, + input: crate::operation::get_experiment_config::GetExperimentConfigInput, + ) -> ::std::result::Result> { + let map_err = |err: ::aws_smithy_runtime_api::client::result::SdkError<::aws_smithy_runtime_api::client::interceptors::context::Error, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>| { + err.map_service_error(|err| { + err.downcast::().expect("correct error type") + }) + }; + let context = Self::orchestrate_with_stop_point(runtime_plugins, input, ::aws_smithy_runtime::client::orchestrator::StopPoint::None) + .await + .map_err(map_err)?; + let output = context.finalize().map_err(map_err)?; + ::std::result::Result::Ok(output.downcast::().expect("correct output type")) + } + + pub(crate) async fn orchestrate_with_stop_point( + runtime_plugins: &::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins, + input: crate::operation::get_experiment_config::GetExperimentConfigInput, + stop_point: ::aws_smithy_runtime::client::orchestrator::StopPoint, + ) -> ::std::result::Result<::aws_smithy_runtime_api::client::interceptors::context::InterceptorContext, ::aws_smithy_runtime_api::client::result::SdkError<::aws_smithy_runtime_api::client::interceptors::context::Error, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>> { + let input = ::aws_smithy_runtime_api::client::interceptors::context::Input::erase(input); + use ::tracing::Instrument; + ::aws_smithy_runtime::client::orchestrator::invoke_with_stop_point( + "Superposition", + "GetExperimentConfig", + input, + runtime_plugins, + stop_point + ) + // Create a parent span for the entire operation. Includes a random, internal-only, + // seven-digit ID for the operation orchestration so that it can be correlated in the logs. + .instrument(::tracing::debug_span!( + "Superposition.GetExperimentConfig", + "rpc.service" = "Superposition", + "rpc.method" = "GetExperimentConfig", + "sdk_invocation_id" = ::fastrand::u32(1_000_000..10_000_000), + + )) + .await + } + + pub(crate) fn operation_runtime_plugins( + client_runtime_plugins: ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins, + client_config: &crate::config::Config, + config_override: ::std::option::Option, + ) -> ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins { + let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); + runtime_plugins = runtime_plugins + .with_client_plugin(crate::auth_plugin::DefaultAuthOptionsPlugin::new(vec![::aws_smithy_runtime_api::client::auth::http::HTTP_BASIC_AUTH_SCHEME_ID + , ::aws_smithy_runtime_api::client::auth::http::HTTP_BEARER_AUTH_SCHEME_ID])); + if let ::std::option::Option::Some(config_override) = config_override { + for plugin in config_override.runtime_plugins.iter().cloned() { + runtime_plugins = runtime_plugins.with_operation_plugin(plugin); + } + runtime_plugins = runtime_plugins.with_operation_plugin( + crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components) + ); + } + runtime_plugins + } +} +impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin for GetExperimentConfig { + fn config(&self) -> ::std::option::Option<::aws_smithy_types::config_bag::FrozenLayer> { + let mut cfg = ::aws_smithy_types::config_bag::Layer::new("GetExperimentConfig"); + + cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedRequestSerializer::new(GetExperimentConfigRequestSerializer)); + cfg.store_put(::aws_smithy_runtime_api::client::ser_de::SharedResponseDeserializer::new(GetExperimentConfigResponseDeserializer)); + + + cfg.store_put(::aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams::new(::aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolverParams::new())); + + cfg.store_put(::aws_smithy_runtime_api::client::orchestrator::Metadata::new( + "GetExperimentConfig", + "Superposition", + )); + + ::std::option::Option::Some(cfg.freeze()) + } + + fn runtime_components(&self, _: &::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder) -> ::std::borrow::Cow<'_, ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder> { + #[allow(unused_mut)] + let mut rcb = ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("GetExperimentConfig") + .with_interceptor(::aws_smithy_runtime::client::stalled_stream_protection::StalledStreamProtectionInterceptor::default()) +.with_interceptor(GetExperimentConfigEndpointParamsInterceptor) + .with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::TransientErrorClassifier::::new()) +.with_retry_classifier(::aws_smithy_runtime::client::retries::classifiers::ModeledAsRetryableClassifier::::new()); + + ::std::borrow::Cow::Owned(rcb) + } + } + + +#[derive(Debug)] + struct GetExperimentConfigResponseDeserializer; + impl ::aws_smithy_runtime_api::client::ser_de::DeserializeResponse for GetExperimentConfigResponseDeserializer { + + + fn deserialize_nonstreaming(&self, response: &::aws_smithy_runtime_api::client::orchestrator::HttpResponse) -> ::aws_smithy_runtime_api::client::interceptors::context::OutputOrError { + let (success, status) = (response.status().is_success(), response.status().as_u16()); + let headers = response.headers(); + let body = response.body().bytes().expect("body loaded"); + #[allow(unused_mut)] + let mut force_error = false; + + let parse_result = if !success && status != 200 || force_error { + crate::protocol_serde::shape_get_experiment_config::de_get_experiment_config_http_error(status, headers, body) + } else { + crate::protocol_serde::shape_get_experiment_config::de_get_experiment_config_http_response(status, headers, body) + }; + crate::protocol_serde::type_erase_result(parse_result) + } + } +#[derive(Debug)] + struct GetExperimentConfigRequestSerializer; + impl ::aws_smithy_runtime_api::client::ser_de::SerializeRequest for GetExperimentConfigRequestSerializer { + #[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)] + fn serialize_input(&self, input: ::aws_smithy_runtime_api::client::interceptors::context::Input, _cfg: &mut ::aws_smithy_types::config_bag::ConfigBag) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, ::aws_smithy_runtime_api::box_error::BoxError> { + let input = input.downcast::().expect("correct type"); + let _header_serialization_settings = _cfg.load::().cloned().unwrap_or_default(); + let mut request_builder = { + fn uri_base(_input: &crate::operation::get_experiment_config::GetExperimentConfigInput, output: &mut ::std::string::String) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> { + use ::std::fmt::Write as _; + ::std::write!(output, "/experiment-config").expect("formatting should succeed"); + ::std::result::Result::Ok(()) +} +fn uri_query(_input: &crate::operation::get_experiment_config::GetExperimentConfigInput, mut output: &mut ::std::string::String) -> ::std::result::Result<(), ::aws_smithy_types::error::operation::BuildError> { + let mut query = ::aws_smithy_http::query::Writer::new(output); + if let ::std::option::Option::Some(inner_1) = &_input.prefix { + { + for inner_2 in inner_1 { + query.push_kv("prefix", &::aws_smithy_http::query::fmt_string(inner_2)); + } + } + } + ::std::result::Result::Ok(()) +} +#[allow(clippy::unnecessary_wraps)] +fn update_http_builder( + input: &crate::operation::get_experiment_config::GetExperimentConfigInput, + builder: ::http::request::Builder + ) -> ::std::result::Result<::http::request::Builder, ::aws_smithy_types::error::operation::BuildError> { + let mut uri = ::std::string::String::new(); + uri_base(input, &mut uri)?; + uri_query(input, &mut uri)?; + let builder = crate::protocol_serde::shape_get_experiment_config::ser_get_experiment_config_headers(input, builder)?; + ::std::result::Result::Ok(builder.method("POST").uri(uri)) +} +let mut builder = update_http_builder(&input, ::http::request::Builder::new())?; +builder = _header_serialization_settings.set_default_header(builder, ::http::header::CONTENT_TYPE, "application/json"); +builder + }; + let body = ::aws_smithy_types::body::SdkBody::from(crate::protocol_serde::shape_get_experiment_config::ser_get_experiment_config_input(&input)?); + if let Some(content_length) = body.content_length() { + let content_length = content_length.to_string(); + request_builder = _header_serialization_settings.set_default_header(request_builder, ::http::header::CONTENT_LENGTH, &content_length); + } + ::std::result::Result::Ok(request_builder.body(body).expect("valid request").try_into().unwrap()) + } + } +#[derive(Debug)] + struct GetExperimentConfigEndpointParamsInterceptor; + + impl ::aws_smithy_runtime_api::client::interceptors::Intercept for GetExperimentConfigEndpointParamsInterceptor { + fn name(&self) -> &'static str { + "GetExperimentConfigEndpointParamsInterceptor" + } + + fn read_before_execution( + &self, + context: &::aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<'_, ::aws_smithy_runtime_api::client::interceptors::context::Input, ::aws_smithy_runtime_api::client::interceptors::context::Output, ::aws_smithy_runtime_api::client::interceptors::context::Error>, + cfg: &mut ::aws_smithy_types::config_bag::ConfigBag, + ) -> ::std::result::Result<(), ::aws_smithy_runtime_api::box_error::BoxError> { + let _input = context.input() + .downcast_ref::() + .ok_or("failed to downcast to GetExperimentConfigInput")?; + + + + let params = crate::config::endpoint::Params::builder() + + .build() + .map_err(|err| ::aws_smithy_runtime_api::client::interceptors::error::ContextAttachedError::new("endpoint params could not be built", err))?; + cfg.interceptor_state().store_put(::aws_smithy_runtime_api::client::endpoint::EndpointResolverParams::new(params)); + ::std::result::Result::Ok(()) + } + } + + // The get_* functions below are generated from JMESPath expressions in the + // operationContextParams trait. They target the operation's input shape. + + + +/// Error type for the `GetExperimentConfigError` operation. +#[non_exhaustive] +#[derive(::std::fmt::Debug)] +pub enum GetExperimentConfigError { + #[allow(missing_docs)] // documentation missing in model + InternalServerError(crate::types::error::InternalServerError), + /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). + #[deprecated(note = "Matching `Unhandled` directly is not forwards compatible. Instead, match using a \ + variable wildcard pattern and check `.code()`: + \ +    `err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }` + \ + See [`ProvideErrorMetadata`](#impl-ProvideErrorMetadata-for-GetExperimentConfigError) for what information is available for the error.")] + Unhandled(crate::error::sealed_unhandled::Unhandled), +} +impl GetExperimentConfigError { + /// Creates the `GetExperimentConfigError::Unhandled` variant from any error type. + pub fn unhandled(err: impl ::std::convert::Into<::std::boxed::Box>) -> Self { + Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source: err.into(), meta: ::std::default::Default::default() }) + } + + /// Creates the `GetExperimentConfigError::Unhandled` variant from an [`ErrorMetadata`](::aws_smithy_types::error::ErrorMetadata). + pub fn generic(err: ::aws_smithy_types::error::ErrorMetadata) -> Self { + Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source: err.clone().into(), meta: err }) + } + /// + /// Returns error metadata, which includes the error code, message, + /// request ID, and potentially additional information. + /// + pub fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata { + match self { + Self::InternalServerError(e) => ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(e), + Self::Unhandled(e) => &e.meta, + } + } + /// Returns `true` if the error kind is `GetExperimentConfigError::InternalServerError`. + pub fn is_internal_server_error(&self) -> bool { + matches!(self, Self::InternalServerError(_)) + } +} +impl ::std::error::Error for GetExperimentConfigError { + fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> { + match self { + Self::InternalServerError(_inner) => + ::std::option::Option::Some(_inner) + , + Self::Unhandled(_inner) => { + ::std::option::Option::Some(&*_inner.source) + } + } + } +} +impl ::std::fmt::Display for GetExperimentConfigError { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + match self { + Self::InternalServerError(_inner) => + _inner.fmt(f) + , + Self::Unhandled(_inner) => { + if let ::std::option::Option::Some(code) = ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) { + write!(f, "unhandled error ({code})") + } else { + f.write_str("unhandled error") + } + } + } + } +} +impl ::aws_smithy_types::retry::ProvideErrorKind for GetExperimentConfigError { + fn code(&self) -> ::std::option::Option<&str> { + ::aws_smithy_types::error::metadata::ProvideErrorMetadata::code(self) + } + fn retryable_error_kind(&self) -> ::std::option::Option<::aws_smithy_types::retry::ErrorKind> { + ::std::option::Option::None + } +} +impl ::aws_smithy_types::error::metadata::ProvideErrorMetadata for GetExperimentConfigError { + fn meta(&self) -> &::aws_smithy_types::error::ErrorMetadata { + match self { + Self::InternalServerError(_inner) => + ::aws_smithy_types::error::metadata::ProvideErrorMetadata::meta(_inner) + , + Self::Unhandled(_inner) => { + &_inner.meta + } + } + } +} +impl ::aws_smithy_runtime_api::client::result::CreateUnhandledError for GetExperimentConfigError { + fn create_unhandled_error( + source: ::std::boxed::Box, + meta: ::std::option::Option<::aws_smithy_types::error::ErrorMetadata> + ) -> Self { + Self::Unhandled(crate::error::sealed_unhandled::Unhandled { source, meta: meta.unwrap_or_default() }) + } +} + +pub use crate::operation::get_experiment_config::_get_experiment_config_output::GetExperimentConfigOutput; + +pub use crate::operation::get_experiment_config::_get_experiment_config_input::GetExperimentConfigInput; + +mod _get_experiment_config_input; + +mod _get_experiment_config_output; + +/// Builders +pub mod builders; + diff --git a/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs b/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs index 54620380e..f0612361f 100644 --- a/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs +++ b/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs @@ -13,8 +13,11 @@ pub struct GetExperimentConfigInput { pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +<<<<<<< HEAD /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } impl GetExperimentConfigInput { #[allow(missing_docs)] // documentation missing in model @@ -40,10 +43,13 @@ impl GetExperimentConfigInput { pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() } +<<<<<<< HEAD /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } impl GetExperimentConfigInput { /// Creates a new builder-style object to manufacture [`GetExperimentConfigInput`](crate::operation::get_experiment_config::GetExperimentConfigInput). @@ -61,7 +67,10 @@ pub struct GetExperimentConfigInputBuilder { pub(crate) if_modified_since: ::std::option::Option<::aws_smithy_types::DateTime>, pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +<<<<<<< HEAD pub(crate) dimension_match_strategy: ::std::option::Option, +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } impl GetExperimentConfigInputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -142,6 +151,7 @@ impl GetExperimentConfigInputBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { &self.context } +<<<<<<< HEAD /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -155,6 +165,8 @@ impl GetExperimentConfigInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) /// Consumes the builder and constructs a [`GetExperimentConfigInput`](crate::operation::get_experiment_config::GetExperimentConfigInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -169,8 +181,11 @@ impl GetExperimentConfigInputBuilder { , context: self.context , +<<<<<<< HEAD dimension_match_strategy: self.dimension_match_strategy , +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } ) } diff --git a/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs b/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs index 522d273ef..fc74f215a 100644 --- a/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs +++ b/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs @@ -176,6 +176,7 @@ impl GetExperimentConfigFluentBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.inner.get_context() } +<<<<<<< HEAD /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -190,5 +191,7 @@ impl GetExperimentConfigFluentBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { self.inner.get_dimension_match_strategy() } +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index 6dbd8529a..03e1cae49 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -17,6 +17,9 @@ pub use crate::types::_bucket::Bucket; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) pub use crate::types::_experiment_response::ExperimentResponse; pub use crate::types::_variant::Variant; @@ -53,6 +56,7 @@ pub use crate::types::_workspace_response::WorkspaceResponse; pub use crate::types::_type_templates_response::TypeTemplatesResponse; +<<<<<<< HEAD <<<<<<< HEAD pub use crate::types::_experiment_sort_on::ExperimentSortOn; @@ -81,6 +85,8 @@ pub use crate::types::_experiment_status_type::ExperimentStatusType; pub use crate::types::_experiment_type::ExperimentType; +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) pub use crate::types::_experiment_sort_on::ExperimentSortOn; pub use crate::types::_variant_update_request::VariantUpdateRequest; diff --git a/crates/superposition_sdk/src/types/builders.rs b/crates/superposition_sdk/src/types/builders.rs index a0dbe96fd..0e585bfb8 100644 --- a/crates/superposition_sdk/src/types/builders.rs +++ b/crates/superposition_sdk/src/types/builders.rs @@ -16,12 +16,17 @@ pub use crate::types::_variant::VariantBuilder; pub use crate::types::_bucket::BucketBuilder; +pub use crate::types::_experiment_response::ExperimentResponseBuilder; + +pub use crate::types::_variant::VariantBuilder; + pub use crate::types::_webhook_response::WebhookResponseBuilder; pub use crate::types::_workspace_response::WorkspaceResponseBuilder; pub use crate::types::_type_templates_response::TypeTemplatesResponseBuilder; +<<<<<<< HEAD <<<<<<< HEAD ======= pub use crate::types::_variant::VariantBuilder; @@ -29,6 +34,8 @@ pub use crate::types::_variant::VariantBuilder; pub use crate::types::_experiment_response::ExperimentResponseBuilder; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) pub use crate::types::_variant_update_request::VariantUpdateRequestBuilder; pub use crate::types::_organisation_response::OrganisationResponseBuilder; diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 1aa1e2108..2ede5d5d1 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -1936,6 +1936,7 @@ "explode": true }, { +<<<<<<< HEAD "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -1944,6 +1945,8 @@ } }, { +======= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", diff --git a/docs/docs/api/get-experiment-config.ParamsDetails.json b/docs/docs/api/get-experiment-config.ParamsDetails.json index a100d92ac..ac4d6d5be 100644 --- a/docs/docs/api/get-experiment-config.ParamsDetails.json +++ b/docs/docs/api/get-experiment-config.ParamsDetails.json @@ -1 +1,5 @@ -{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} \ No newline at end of file +<<<<<<< HEAD +{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} +======= +{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) diff --git a/docs/docs/api/get-experiment-config.api.mdx b/docs/docs/api/get-experiment-config.api.mdx index 649a8c0b3..fb6115ed6 100644 --- a/docs/docs/api/get-experiment-config.api.mdx +++ b/docs/docs/api/get-experiment-config.api.mdx @@ -5,7 +5,11 @@ description: "Retrieves the experiment configuration for a given workspace and o sidebar_label: "GetExperimentConfig" hide_title: true hide_table_of_contents: true +<<<<<<< HEAD api: eJztWVlvGzcQ/ivEPrWApKhJ/ZI3Rd66Rn1hJactUmFB7VIS471Kcm0phv57Z8i9xbXlOnkomiBOLHI4N78Zjh6dkMlA8EzxNHHeOx5TgrN7JonaMMK2GRM8ZokiQZqs+DoXFAnJKhWEkjW/Zwl5SMWdzGjACE1Ckoo1TfgXTTYic2AimMzSRDLCkyDKQRwJmaI8kiRdERpFTSlrkeaZ1IzqVdSFKhJTFWy0WjJjAV9xFpIVjxQTcuQMnBTItdTzEOw4Y8qtGEy17kAj2N85k+pDGu6c948O2KRgG3+lWRbxQJ9/81miKx4dGWxYTPE3tcsYME2Xn1mggE8mUJriTFZstspGSMOQI08a3TSP7Acdt1/SDPyUgatAH56stZkF39FfyW9sJ+GjMK4MiUo1QUJjpr2IH0I0VQI77Q3FVYSaTA0P4O/s9/WyxT2e8c208Ml+j/QZFSADXey8//TooEA4DXqu+BakcNQdjokdfJBqp3lDbsT4ses9KgRFOq5YLBvrEjIuWWv1IOZRGsKiEjnbDyqBlW2+TgIfjlDF1ruuCm2nzgoqdNcqjaL0gTxseMSKrCFaEbKkEhIJcrrhcpv6hZpfVQhL8hgcC3ZTnS4yX0qmnEUdqNPS8ks0vBSGzqqcw1fDOA31fRhKuGOs9MqG0ZCJA41/1+rl0qQZlwPybvxz45bCdRMMxISESsKESMUATYK7lzAWSjR0ycgG7mgENJJhjigW7chyR8BpwV2ZvxXLAGJapulGqazaQYAAefAXbyYXTKd2TO/gjueCmXsfRFyDQEAT+AEJbeaIFfQ+5SHJk4QFTEoqQBEAFglqM+1yYEXhJ0lJnoWgrL4ix0b4u7/QX82M2w4B5Yc8PEi0PpfuDfSiwgd3ezusCsgr+C1wxVioseXteIz/tSNpQT0ChJVvQKIRrVlEVKrqZlnrQa82sPKVakujCh4BpT1MeGhVOjBp61NluwQI47jjYAIMFejQPLPcWVmiz/ymz47jalLBwq823zd7hxxLDD11f5ncXsxh5dS9cOeuf/3R9bzzU3fWxNM6/nPkAyLSe7izPGT+HRTZl5UrqajKLXu1UlPPnczdU1iZXl9NL25P9e/nVzfe9Znnzmao7flsOvHMxs3kdga/WPWdaWGl1lAIVise+LAbwCZdN30Dwpdwf8osfF1r4pVtCXYgSXmGAAWUN04BGLEPg36wkGX6NHDDiOi2JYReIWm0J0XXgjB0TyNoOYp2bmdqY8nWtHy5VAie0IJ0mhqjB5p4T4H8W1yPgvGziQeRnXvXF7Di/nHjeueX7tV8ctEM4kfDqYxd4Si/R26VkM/sWy07NqrTVjtfsTRuh040wn4eQkfzSJVx0tWhjHKVC1KXCoyQiXfVxnaeDHi9mlGnwhSmUjYBRKDNKF9Xdu5bCPvJ0ZWndkMnVIeO1wxa0NSHX8EmBdX9gp+VpOVHKwuarJkPOCl7KAA2xEtxtzzTo3eMz7ZA+rmInto3mdAAVf3esidax+dts2pkaZWRVn1ou+oQywcmju2SYYlTUR66SF3BrxUMG7hgRVOvLPl7i0NehCXd5wCkOBVh3W+BP/NAYXemH83JwXN3dHS9LnBjQ+XGStBbRl+fs/+DQnJMSYWbRLc8RuD/aTyGTzwxn8b6kiGN38gmHr6wo/jWLdmLGB+FmMs8uGOvqb4tdz1ZiI+BqTa31tkGDnzQSuvDBgGfq/HQlnl+3czN/pzN3Uv/zL1yPb3U4H2GDE2p7+hWuqp731pg2rzjx2NrwwobrJrzFmS1p2yFuJYrYUVTbXMNqd2bPyERh/sHL9ou9lUwaV6YfaEsUHnQeg4tnhlnGcbtedaJ7Vl4DhQCoGjGBFQYF1/w5KT9LPxKr7kYX9trG0Y3ZnMWdWzGmKq+SXHamaVSC6MKCoPzpvbSMChHn5IFOUDiTs/xZMzVZjeiGR/hfOEDlTyY5Hj40wKf5t19Bs2aqAgWNbcZGm5s6+dZGYvrBxXz1/n8hmhqQoEc55/Gu+X7H08ucV/3Qf2aHSNGkz8lRxPocGBsvXpe7G5pnEWsPe9FOp6sUi28CN8sB+dDQHjBG2IojQpvx29PhuN3w/EJWoIxi6lOn2ISAllM6jQm1dS6U72rXPwPD+uLSKEb38Bbg+sCXDSvJoub97/MYki8DWY6bD4+4kj1VkT7PS6bATCmdsglXUaIICsaSTZwoFlsjqx1qwALDub5AXGvq1815rVaa/R6YrJda7oo6tgSEwxvaDkhsxrca8P3QSbrTz4TDtss/V9mzA9eYdmP5GmZjWnqtxfVnLW2pBmCosAM56aTKCkOal59YhIELFNP0i4alermeoYjumXxDVysv+1xBH3Ab+fgX9AGv8rTgwUk0Gs4i03Wua6cjuGJf/4BgQskhA== +======= +api: eJztWd1v2zYQ/1cIPW2A7Xrt8tI319GyYGkSyE63oQsEWqItNvoaSSX2Av/vuyP1bSpxkPZhWIumjcnj3fE+fnc8Pzohk4HgueJZ6rx3PKYEZ/dMEhUxwrY5EzxhqSJBlq75phAUCck6E4SSDb9nKXnIxJ3MacAITUOSiQ1N+T+abEKWwEQwmWepZISnQVyAOBIyRXksSbYmNI7bUjYiK3KpGTWrqAtVJKEqiLRaMmcBX3MWkjWPFRNy4oycDMi11PMQ7nHGlFszmGvdgUawvwsm1Ycs3DnvHx24k4Jt/JXmecwDff7NF4mmeHRkELGE4m9qlzNgmq2+sEABn1ygNMWZrNlslY2QhiFHnjS+bh/Zj3pm/0hzsFMOpgJ9eLrR1yz5Tv5Kf2M7CR+FMWVIVKYJUpowbUX8EOJVJbDT1lBcxajJ3PAA/s5+3yxbzOMZ28xLm+z3SJ9TATLQxM77z48OCoTToOeab0EKR93hmNjBB6l2mjfERoIf+9ajQlCk44olsrUuIeLSjVYPfB5nISwqUbD9qBbI1+MkC7XLxxLCiFWyI0ZDJpy+OX+PeMxIIY0luRyRd9OfW4EIESUYVRBAVBImRCZG5CHiEF4pY6FE+64YiSAMY6CRDM2gWLwjqx2BawV3lYtqlgGoXXkiUiqvdzAHQB78xeDjgmnvJfQOwrgQzIR2EHMd5wFN4QckdJljOtD7jIekSFMWMCmpAEUgdySoDSkI1MCKwk+akSIPQVkdBQc+KG393V42e+1bEbcdA5CNeXgQaEMm3Rt0QYUPwnc7rjHyFfxuccXcUKfP2+kU/+t60pLYBAhr24BEI1qziKlUdWZZIW9QG1j5SvDZAvoj0GKACQ+tSgcmbH2qbEmASIU7DgbAWIEO7TOrnZUl2sxv2+w4riYULPya6/tm75AjS4sE8Nc5dX+Z3VwsYeXUvXCXrn/1yfW881N34dw22N74f4l8QER2DznLQ+bfQR15GSJLRVVh2WuUmnvubOmewsr86nJ+cXOqfz+/vPauzjx3sUBtzxfzmWc2rmc3C/jFqu9CC6u0VoKu1zzwYTeATbpp2waEryB/qih8XfX1qsqLRTatzhCggMrHKQAjthrQ8pSyTCsCZpgQXZlDKIdpqwKXhRlh6J7GUFXLjmVnynrF1nQ1hVQInlBle3Xb6IFXvKdA/i3So2T8bOCBZ5fe1QWsuH9cu975R/dyObtoO/GT4VT5rjSUPyC3Dshn9q03O9ar807HWrM0ZodmK8aWFVxHi1hVftLVofJyHQtSlwr0kPF33an1umJMr7bXqTCFqZJNABFo28tX9T33HYT97OjK05ih56pDw2sGHWgawq8gykB1v+RnJenY0cqCphvmA07KAQqADfFS3K3ODOid4MskkH4h4qf2TSS0QFU/KeyB1rN591oNsnTKSKc+dE11iOUj48duybD4qSwPfaSu4dcKhi1csKKpV5X8vcUgL8KSbl4BSqchFWHTb4E9i0Bhd6bfhenBi25ydL0ucSOiMrISDJbR18fs/6CQHFNSIZPolicI/D9Np/CJp+bTVCcZ0vitaOLhCzuKb92SvYjxUYi5KoI79prq2zHXk4X4GJjqcuucbeHAB620PmwQ8LkaD22Z5zfN3OLPxdL96J+5l66nl1q8z5ChKfU93SpT9fOtA6btHD8eW1u3sMGqOW9BVnvI1ohrSQkrmuo7N5Daz/wZiTnkH7xo+9hXw6R5YQ65skTlUec5dPvMxMYw7o5sTmzPwnOgEABFCyagwrj4gicn3WfhV3rNJfja3tgwujV+sqhju4yp6lGGA708k1oYVVAYnDeNlcZBNd2TLCgAEnd6VCUTrqLdhOZ8gvOFD1TyYFbg4c+3+DTv7zNo1kRNcNtwW+DFzd2GedaXxfWDivnrcnlNNDWhQI4jPmPd6v2PJ1e4r/ugYc2OEaPJn5KjCbQ70LdeMxJ1tzTJY9YdaSIdT9eZFl66b1GA8cEhvOQNPpRGhbfTtyfj6bvx9ARvgj5LqA6fchICUUyaMCb1YLZXvetY/A/Po0tPoRnfwFuD6wJcNq8mitv5X0UxBF6EkQ6bj48QEuxGxPs9LpsxK4Z2yCVdxYggaxpLNnKgWWxPZXWrAAsOhrGuDit0G8Z9NXeyshl0wvfxIBt2qTG+bULd+GH0Emv/4JU3+5E8LbM1o/z2otoTzI40Q1DC9nhp6nNFcVBJmhOzIGC5epL2toX/11cLHHytyq9uEv01gSPoA36tA/+CNvgdkH6uI4Fewwlnuil0PXIMT/zzL2M9gec= +>>>>>>> 0c17747c (feat: Add experiment_config endpoint) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null From 60893cab10f4126c6198efd0b8f82bd50d99031f Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Mon, 23 Mar 2026 19:42:28 +0530 Subject: [PATCH 04/16] fix: some fixes --- .../Model/GetExperimentConfigInput.hs | 56 ++++++++++++++++ .../client/SuperpositionAsyncClient.java | 6 +- .../client/SuperpositionAsyncClientImpl.java | 4 ++ .../client/SuperpositionClient.java | 6 +- .../client/SuperpositionClientImpl.java | 4 ++ .../model/GetExperimentConfigInput.java | 64 +++++++++++++++++++ .../commands/GetExperimentConfigCommand.ts | 4 ++ clients/javascript/sdk/src/models/models_0.ts | 6 ++ .../sdk/src/protocols/Aws_restJson1.ts | 4 ++ .../sdk/superposition_sdk/_private/schemas.py | 6 ++ .../python/sdk/superposition_sdk/models.py | 18 +++++- .../python/sdk/superposition_sdk/serialize.py | 5 ++ .../src/client/get_experiment_config.rs | 4 ++ .../src/operation/get_experiment_config.rs | 5 ++ .../_get_experiment_config_input.rs | 26 ++++++++ .../get_experiment_config/builders.rs | 6 ++ docs/docs/api/Superposition.openapi.json | 6 ++ .../get-experiment-config.ParamsDetails.json | 4 ++ docs/docs/api/get-experiment-config.api.mdx | 4 ++ smithy/patches/python.patch | 14 ++++ 20 files changed, 245 insertions(+), 7 deletions(-) diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs index fc543a0bc..fcada2675 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs @@ -4,10 +4,14 @@ module Io.Superposition.Model.GetExperimentConfigInput ( setIfModifiedSince, setPrefix, setContext, +<<<<<<< HEAD <<<<<<< HEAD setDimensionMatchStrategy, ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + setDimensionMatchStrategy, +>>>>>>> 0dd5da56 (fix: some fixes) build, GetExperimentConfigInputBuilder, GetExperimentConfigInput, @@ -15,12 +19,17 @@ module Io.Superposition.Model.GetExperimentConfigInput ( org_id, if_modified_since, prefix, +<<<<<<< HEAD <<<<<<< HEAD context, dimension_match_strategy ======= context >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + context, + dimension_match_strategy +>>>>>>> 0dd5da56 (fix: some fixes) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -35,9 +44,13 @@ import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show <<<<<<< HEAD +<<<<<<< HEAD import qualified Io.Superposition.Model.DimensionMatchStrategy ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +import qualified Io.Superposition.Model.DimensionMatchStrategy +>>>>>>> 0dd5da56 (fix: some fixes) import qualified Io.Superposition.Utility import qualified Network.HTTP.Types.Method @@ -46,12 +59,17 @@ data GetExperimentConfigInput = GetExperimentConfigInput { org_id :: Data.Text.Text, if_modified_since :: Data.Maybe.Maybe Data.Time.UTCTime, prefix :: Data.Maybe.Maybe ([] Data.Text.Text), +<<<<<<< HEAD <<<<<<< HEAD context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy ======= context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), + dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy +>>>>>>> 0dd5da56 (fix: some fixes) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -64,12 +82,17 @@ instance Data.Aeson.ToJSON GetExperimentConfigInput where "org_id" Data.Aeson..= org_id a, "if_modified_since" Data.Aeson..= if_modified_since a, "prefix" Data.Aeson..= prefix a, +<<<<<<< HEAD <<<<<<< HEAD "context" Data.Aeson..= context a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a ======= "context" Data.Aeson..= context a >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + "context" Data.Aeson..= context a, + "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a +>>>>>>> 0dd5da56 (fix: some fixes) ] @@ -82,10 +105,14 @@ instance Data.Aeson.FromJSON GetExperimentConfigInput where Control.Applicative.<*> (v Data.Aeson..:? "if_modified_since") Control.Applicative.<*> (v Data.Aeson..:? "prefix") Control.Applicative.<*> (v Data.Aeson..:? "context") +<<<<<<< HEAD <<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") +>>>>>>> 0dd5da56 (fix: some fixes) @@ -95,12 +122,17 @@ data GetExperimentConfigInputBuilderState = GetExperimentConfigInputBuilderState org_idBuilderState :: Data.Maybe.Maybe Data.Text.Text, if_modified_sinceBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime, prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), +<<<<<<< HEAD <<<<<<< HEAD contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy ======= contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), + dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy +>>>>>>> 0dd5da56 (fix: some fixes) } deriving ( GHC.Generics.Generic ) @@ -111,12 +143,17 @@ defaultBuilderState = GetExperimentConfigInputBuilderState { org_idBuilderState = Data.Maybe.Nothing, if_modified_sinceBuilderState = Data.Maybe.Nothing, prefixBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD <<<<<<< HEAD contextBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing ======= contextBuilderState = Data.Maybe.Nothing >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + contextBuilderState = Data.Maybe.Nothing, + dimension_match_strategyBuilderState = Data.Maybe.Nothing +>>>>>>> 0dd5da56 (fix: some fixes) } type GetExperimentConfigInputBuilder = Control.Monad.State.Strict.State GetExperimentConfigInputBuilderState @@ -142,12 +179,18 @@ setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> GetExperimentConfigInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) build :: GetExperimentConfigInputBuilder () -> Data.Either.Either Data.Text.Text GetExperimentConfigInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -156,21 +199,30 @@ build builder = do if_modified_since' <- Data.Either.Right (if_modified_sinceBuilderState st) prefix' <- Data.Either.Right (prefixBuilderState st) context' <- Data.Either.Right (contextBuilderState st) +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) +>>>>>>> 0dd5da56 (fix: some fixes) Data.Either.Right (GetExperimentConfigInput { workspace_id = workspace_id', org_id = org_id', if_modified_since = if_modified_since', prefix = prefix', +<<<<<<< HEAD <<<<<<< HEAD context = context', dimension_match_strategy = dimension_match_strategy' ======= context = context' >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + context = context', + dimension_match_strategy = dimension_match_strategy' +>>>>>>> 0dd5da56 (fix: some fixes) }) @@ -180,10 +232,14 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetExperimentConfigInput wh Io.Superposition.Utility.setPath [ "experiment-config" ] +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) +>>>>>>> 0dd5da56 (fix: some fixes) Io.Superposition.Utility.serQuery "prefix" (prefix self) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java index b7041159b..5b4fbda9a 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java @@ -1819,12 +1819,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); - private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); + private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index 05fdeedf4..3e718b863 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -272,14 +272,18 @@ @SmithyGenerated final class SuperpositionAsyncClientImpl extends Client implements SuperpositionAsyncClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) +======= +>>>>>>> 0dd5da56 (fix: some fixes) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) .putType(MalformedRequestException.$ID, MalformedRequestException.class, MalformedRequestException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java index d40ed4e31..f18a231d0 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java @@ -1818,12 +1818,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); - private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); + private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index a5c71fd99..29671d966 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -272,14 +272,18 @@ @SmithyGenerated final class SuperpositionClientImpl extends Client implements SuperpositionClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) +======= +>>>>>>> 0dd5da56 (fix: some fixes) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) .putType(MalformedRequestException.$ID, MalformedRequestException.class, MalformedRequestException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java index 8cafff791..882a3871a 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java @@ -38,11 +38,16 @@ public final class GetExperimentConfigInput implements SerializableStruct { .putMember("prefix", SharedSchemas.STRING_LIST, new HttpQueryTrait("prefix")) .putMember("context", SharedSchemas.CONTEXT_MAP) +<<<<<<< HEAD <<<<<<< HEAD .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, + new HttpQueryTrait("dimension_match_strategy")) +>>>>>>> 0dd5da56 (fix: some fixes) .build(); private static final Schema $SCHEMA_WORKSPACE_ID = $SCHEMA.member("workspace_id"); @@ -50,20 +55,28 @@ public final class GetExperimentConfigInput implements SerializableStruct { private static final Schema $SCHEMA_IF_MODIFIED_SINCE = $SCHEMA.member("if_modified_since"); private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); +<<<<<<< HEAD <<<<<<< HEAD private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); +>>>>>>> 0dd5da56 (fix: some fixes) private final transient String workspaceId; private final transient String orgId; private final transient Instant ifModifiedSince; private final transient List prefix; private final transient Map context; +<<<<<<< HEAD <<<<<<< HEAD private final transient DimensionMatchStrategy dimensionMatchStrategy; ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + private final transient DimensionMatchStrategy dimensionMatchStrategy; +>>>>>>> 0dd5da56 (fix: some fixes) private GetExperimentConfigInput(Builder builder) { this.workspaceId = builder.workspaceId; @@ -71,10 +84,14 @@ private GetExperimentConfigInput(Builder builder) { this.ifModifiedSince = builder.ifModifiedSince; this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); +<<<<<<< HEAD <<<<<<< HEAD this.dimensionMatchStrategy = builder.dimensionMatchStrategy; ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + this.dimensionMatchStrategy = builder.dimensionMatchStrategy; +>>>>>>> 0dd5da56 (fix: some fixes) } public String workspaceId() { @@ -117,12 +134,18 @@ public boolean hasContext() { } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -141,21 +164,30 @@ public boolean equals(Object other) { && Objects.equals(this.orgId, that.orgId) && Objects.equals(this.ifModifiedSince, that.ifModifiedSince) && Objects.equals(this.prefix, that.prefix) +<<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.context, that.context) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy); ======= && Objects.equals(this.context, that.context); >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + && Objects.equals(this.context, that.context) + && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy); +>>>>>>> 0dd5da56 (fix: some fixes) } @Override public int hashCode() { +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context, dimensionMatchStrategy); ======= return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context); >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context, dimensionMatchStrategy); +>>>>>>> 0dd5da56 (fix: some fixes) } @Override @@ -176,12 +208,18 @@ public void serializeMembers(ShapeSerializer serializer) { if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } +<<<<<<< HEAD <<<<<<< HEAD if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + if (dimensionMatchStrategy != null) { + serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); + } +>>>>>>> 0dd5da56 (fix: some fixes) } @Override @@ -193,10 +231,14 @@ public T getMemberValue(Schema member) { case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, ifModifiedSince); case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +<<<<<<< HEAD <<<<<<< HEAD case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); +>>>>>>> 0dd5da56 (fix: some fixes) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -215,10 +257,14 @@ public Builder toBuilder() { builder.ifModifiedSince(this.ifModifiedSince); builder.prefix(this.prefix); builder.context(this.context); +<<<<<<< HEAD <<<<<<< HEAD builder.dimensionMatchStrategy(this.dimensionMatchStrategy); ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + builder.dimensionMatchStrategy(this.dimensionMatchStrategy); +>>>>>>> 0dd5da56 (fix: some fixes) return builder; } @@ -239,10 +285,14 @@ public static final class Builder implements ShapeBuilder prefix; private Map context; +<<<<<<< HEAD <<<<<<< HEAD private DimensionMatchStrategy dimensionMatchStrategy; ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + private DimensionMatchStrategy dimensionMatchStrategy; +>>>>>>> 0dd5da56 (fix: some fixes) private Builder() {} @@ -300,6 +350,9 @@ public Builder context(Map context) { } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) /** * @return this builder. */ @@ -308,8 +361,11 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat return this; } +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) @Override public GetExperimentConfigInput build() { tracker.validate(); @@ -325,10 +381,14 @@ public void setMemberValue(Schema member, Object value) { case 2 -> ifModifiedSince((Instant) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, value)); case 3 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); case 4 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +<<<<<<< HEAD <<<<<<< HEAD case 5 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + case 5 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); +>>>>>>> 0dd5da56 (fix: some fixes) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -370,10 +430,14 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 2 -> builder.ifModifiedSince(de.readTimestamp(member)); case 3 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); case 4 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +<<<<<<< HEAD <<<<<<< HEAD case 5 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + case 5 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); +>>>>>>> 0dd5da56 (fix: some fixes) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts b/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts index 3f0ced828..10f4ed157 100644 --- a/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts +++ b/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts @@ -52,10 +52,14 @@ export interface GetExperimentConfigCommandOutput extends GetExperimentConfigOut * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, +<<<<<<< HEAD <<<<<<< HEAD * dimension_match_strategy: "exact" || "subset", ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + * dimension_match_strategy: "exact" || "subset", +>>>>>>> 0dd5da56 (fix: some fixes) * }; * const command = new GetExperimentConfigCommand(input); * const response = await client.send(command); diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index bc65b3d29..b72a64a9f 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -1892,14 +1892,20 @@ export interface GetExperimentConfigInput { */ context?: Record | undefined; <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) /** * Strategy to follow while filter items based on the context * @public */ dimension_match_strategy?: DimensionMatchStrategy | undefined; +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index dc1af1e81..8820a3a83 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -1284,10 +1284,14 @@ export const se_GetExperimentConfigCommand = async( b.bp("/experiment-config"); const query: any = map({ [_p]: [() => input.prefix !== void 0, () => ((input[_p]! || []))], +<<<<<<< HEAD <<<<<<< HEAD [_dms]: [,input[_dms]!], ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + [_dms]: [,input[_dms]!], +>>>>>>> 0dd5da56 (fix: some fixes) }); let body: any; body = JSON.stringify(take(input, { diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index 92f8d1da8..38a0d3bbb 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -9660,6 +9660,9 @@ }, <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 5, @@ -9670,8 +9673,11 @@ ], }, +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) } ) diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index e9d83cf36..68fab3aa6 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -9806,12 +9806,18 @@ class GetExperimentConfigInput: :param context: Map representing the context. Keys correspond to the names of the dimensions. +<<<<<<< HEAD <<<<<<< HEAD :param dimension_match_strategy: Strategy to follow while filter items based on the context ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + :param dimension_match_strategy: + Strategy to follow while filter items based on the context + +>>>>>>> 0dd5da56 (fix: some fixes) """ workspace_id: str | None = None @@ -9819,10 +9825,14 @@ class GetExperimentConfigInput: if_modified_since: datetime | None = None prefix: list[str] | None = None context: dict[str, Document] | None = None +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy: str | None = None ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + dimension_match_strategy: str | None = None +>>>>>>> 0dd5da56 (fix: some fixes) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT, self) @@ -9856,12 +9866,18 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 4: kwargs["context"] = _deserialize_context_map(de, _SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["context"]) +<<<<<<< HEAD <<<<<<< HEAD case 5: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["dimension_match_strategy"]) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + case 5: + kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["dimension_match_strategy"]) + +>>>>>>> 0dd5da56 (fix: some fixes) case _: logger.debug("Unexpected member schema: %s", schema) @@ -10368,7 +10384,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") + ShapeID("smithy.api#httpBasicAuth"), ShapeID("smithy.api#httpBearerAuth") ] ) diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index 3e3caf1bd..ad0237145 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1311,11 +1311,16 @@ async def _serialize_get_experiment_config(input: GetExperimentConfigInput, conf query_params: list[tuple[str, str | None]] = [] if input.prefix is not None: query_params.extend(("prefix", e) for e in input.prefix) +<<<<<<< HEAD <<<<<<< HEAD if input.dimension_match_strategy is not None: query_params.append(("dimension_match_strategy", input.dimension_match_strategy)) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + if input.dimension_match_strategy is not None: + query_params.append(("dimension_match_strategy", input.dimension_match_strategy)) +>>>>>>> 0dd5da56 (fix: some fixes) query = join_query_params(params=query_params, prefix=query) diff --git a/crates/superposition_sdk/src/client/get_experiment_config.rs b/crates/superposition_sdk/src/client/get_experiment_config.rs index 44c9d92c7..cf4494f59 100644 --- a/crates/superposition_sdk/src/client/get_experiment_config.rs +++ b/crates/superposition_sdk/src/client/get_experiment_config.rs @@ -8,10 +8,14 @@ impl super::Client { /// - [`if_modified_since(DateTime)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::if_modified_since) / [`set_if_modified_since(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_if_modified_since):
required: **false**
While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.
/// - [`prefix(impl Into)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_prefix):
required: **false**
(undocumented)
/// - [`context(impl Into, Document)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::context) / [`set_context(Option>)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
+<<<<<<< HEAD <<<<<<< HEAD /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+>>>>>>> 0dd5da56 (fix: some fixes) /// - On success, responds with [`GetExperimentConfigOutput`](crate::operation::get_experiment_config::GetExperimentConfigOutput) with field(s): /// - [`last_modified(DateTime)`](crate::operation::get_experiment_config::GetExperimentConfigOutput::last_modified): (undocumented) /// - [`experiments(Vec::)`](crate::operation::get_experiment_config::GetExperimentConfigOutput::experiments): (undocumented) diff --git a/crates/superposition_sdk/src/operation/get_experiment_config.rs b/crates/superposition_sdk/src/operation/get_experiment_config.rs index ca561fe57..4504a9d36 100644 --- a/crates/superposition_sdk/src/operation/get_experiment_config.rs +++ b/crates/superposition_sdk/src/operation/get_experiment_config.rs @@ -143,6 +143,11 @@ fn uri_query(_input: &crate::operation::get_experiment_config::GetExperimentConf } } } + if let ::std::option::Option::Some(inner_3) = &_input.dimension_match_strategy { + { + query.push_kv("dimension_match_strategy", &::aws_smithy_http::query::fmt_string(inner_3)); + } + } ::std::result::Result::Ok(()) } #[allow(clippy::unnecessary_wraps)] diff --git a/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs b/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs index f0612361f..947bd0f67 100644 --- a/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs +++ b/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs @@ -13,11 +13,16 @@ pub struct GetExperimentConfigInput { pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +<<<<<<< HEAD <<<<<<< HEAD /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + /// Strategy to follow while filter items based on the context + pub dimension_match_strategy: ::std::option::Option, +>>>>>>> 0dd5da56 (fix: some fixes) } impl GetExperimentConfigInput { #[allow(missing_docs)] // documentation missing in model @@ -44,12 +49,18 @@ impl GetExperimentConfigInput { self.context.as_ref() } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) } impl GetExperimentConfigInput { /// Creates a new builder-style object to manufacture [`GetExperimentConfigInput`](crate::operation::get_experiment_config::GetExperimentConfigInput). @@ -67,10 +78,14 @@ pub struct GetExperimentConfigInputBuilder { pub(crate) if_modified_since: ::std::option::Option<::aws_smithy_types::DateTime>, pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, +<<<<<<< HEAD <<<<<<< HEAD pub(crate) dimension_match_strategy: ::std::option::Option, ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + pub(crate) dimension_match_strategy: ::std::option::Option, +>>>>>>> 0dd5da56 (fix: some fixes) } impl GetExperimentConfigInputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -152,6 +167,9 @@ impl GetExperimentConfigInputBuilder { &self.context } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -165,8 +183,11 @@ impl GetExperimentConfigInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) /// Consumes the builder and constructs a [`GetExperimentConfigInput`](crate::operation::get_experiment_config::GetExperimentConfigInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -181,11 +202,16 @@ impl GetExperimentConfigInputBuilder { , context: self.context , +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy: self.dimension_match_strategy , ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= + dimension_match_strategy: self.dimension_match_strategy + , +>>>>>>> 0dd5da56 (fix: some fixes) } ) } diff --git a/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs b/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs index fc74f215a..b69a020a1 100644 --- a/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs +++ b/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs @@ -177,6 +177,9 @@ impl GetExperimentConfigFluentBuilder { self.inner.get_context() } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -191,7 +194,10 @@ impl GetExperimentConfigFluentBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { self.inner.get_dimension_match_strategy() } +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) } diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 2ede5d5d1..d1fb07f9f 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -1937,6 +1937,9 @@ }, { <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 0dd5da56 (fix: some fixes) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -1945,8 +1948,11 @@ } }, { +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 0dd5da56 (fix: some fixes) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", diff --git a/docs/docs/api/get-experiment-config.ParamsDetails.json b/docs/docs/api/get-experiment-config.ParamsDetails.json index ac4d6d5be..517d4f6f3 100644 --- a/docs/docs/api/get-experiment-config.ParamsDetails.json +++ b/docs/docs/api/get-experiment-config.ParamsDetails.json @@ -1,5 +1,9 @@ <<<<<<< HEAD +<<<<<<< HEAD {"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} ======= {"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} +>>>>>>> 0dd5da56 (fix: some fixes) diff --git a/docs/docs/api/get-experiment-config.api.mdx b/docs/docs/api/get-experiment-config.api.mdx index fb6115ed6..8acaf7cb3 100644 --- a/docs/docs/api/get-experiment-config.api.mdx +++ b/docs/docs/api/get-experiment-config.api.mdx @@ -6,10 +6,14 @@ sidebar_label: "GetExperimentConfig" hide_title: true hide_table_of_contents: true <<<<<<< HEAD +<<<<<<< HEAD api: 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 ======= api: eJztWd1v2zYQ/1cIPW2A7Xrt8tI319GyYGkSyE63oQsEWqItNvoaSSX2Av/vuyP1bSpxkPZhWIumjcnj3fE+fnc8Pzohk4HgueJZ6rx3PKYEZ/dMEhUxwrY5EzxhqSJBlq75phAUCck6E4SSDb9nKXnIxJ3MacAITUOSiQ1N+T+abEKWwEQwmWepZISnQVyAOBIyRXksSbYmNI7bUjYiK3KpGTWrqAtVJKEqiLRaMmcBX3MWkjWPFRNy4oycDMi11PMQ7nHGlFszmGvdgUawvwsm1Ycs3DnvHx24k4Jt/JXmecwDff7NF4mmeHRkELGE4m9qlzNgmq2+sEABn1ygNMWZrNlslY2QhiFHnjS+bh/Zj3pm/0hzsFMOpgJ9eLrR1yz5Tv5Kf2M7CR+FMWVIVKYJUpowbUX8EOJVJbDT1lBcxajJ3PAA/s5+3yxbzOMZ28xLm+z3SJ9TATLQxM77z48OCoTToOeab0EKR93hmNjBB6l2mjfERoIf+9ajQlCk44olsrUuIeLSjVYPfB5nISwqUbD9qBbI1+MkC7XLxxLCiFWyI0ZDJpy+OX+PeMxIIY0luRyRd9OfW4EIESUYVRBAVBImRCZG5CHiEF4pY6FE+64YiSAMY6CRDM2gWLwjqx2BawV3lYtqlgGoXXkiUiqvdzAHQB78xeDjgmnvJfQOwrgQzIR2EHMd5wFN4QckdJljOtD7jIekSFMWMCmpAEUgdySoDSkI1MCKwk+akSIPQVkdBQc+KG393V42e+1bEbcdA5CNeXgQaEMm3Rt0QYUPwnc7rjHyFfxuccXcUKfP2+kU/+t60pLYBAhr24BEI1qziKlUdWZZIW9QG1j5SvDZAvoj0GKACQ+tSgcmbH2qbEmASIU7DgbAWIEO7TOrnZUl2sxv2+w4riYULPya6/tm75AjS4sE8Nc5dX+Z3VwsYeXUvXCXrn/1yfW881N34dw22N74f4l8QER2DznLQ+bfQR15GSJLRVVh2WuUmnvubOmewsr86nJ+cXOqfz+/vPauzjx3sUBtzxfzmWc2rmc3C/jFqu9CC6u0VoKu1zzwYTeATbpp2waEryB/qih8XfX1qsqLRTatzhCggMrHKQAjthrQ8pSyTCsCZpgQXZlDKIdpqwKXhRlh6J7GUFXLjmVnynrF1nQ1hVQInlBle3Xb6IFXvKdA/i3So2T8bOCBZ5fe1QWsuH9cu975R/dyObtoO/GT4VT5rjSUPyC3Dshn9q03O9ar807HWrM0ZodmK8aWFVxHi1hVftLVofJyHQtSlwr0kPF33an1umJMr7bXqTCFqZJNABFo28tX9T33HYT97OjK05ih56pDw2sGHWgawq8gykB1v+RnJenY0cqCphvmA07KAQqADfFS3K3ODOid4MskkH4h4qf2TSS0QFU/KeyB1rN591oNsnTKSKc+dE11iOUj48duybD4qSwPfaSu4dcKhi1csKKpV5X8vcUgL8KSbl4BSqchFWHTb4E9i0Bhd6bfhenBi25ydL0ucSOiMrISDJbR18fs/6CQHFNSIZPolicI/D9Np/CJp+bTVCcZ0vitaOLhCzuKb92SvYjxUYi5KoI79prq2zHXk4X4GJjqcuucbeHAB620PmwQ8LkaD22Z5zfN3OLPxdL96J+5l66nl1q8z5ChKfU93SpT9fOtA6btHD8eW1u3sMGqOW9BVnvI1ohrSQkrmuo7N5Daz/wZiTnkH7xo+9hXw6R5YQ65skTlUec5dPvMxMYw7o5sTmzPwnOgEABFCyagwrj4gicn3WfhV3rNJfja3tgwujV+sqhju4yp6lGGA708k1oYVVAYnDeNlcZBNd2TLCgAEnd6VCUTrqLdhOZ8gvOFD1TyYFbg4c+3+DTv7zNo1kRNcNtwW+DFzd2GedaXxfWDivnrcnlNNDWhQI4jPmPd6v2PJ1e4r/ugYc2OEaPJn5KjCbQ70LdeMxJ1tzTJY9YdaSIdT9eZFl66b1GA8cEhvOQNPpRGhbfTtyfj6bvx9ARvgj5LqA6fchICUUyaMCb1YLZXvetY/A/Po0tPoRnfwFuD6wJcNq8mitv5X0UxBF6EkQ6bj48QEuxGxPs9LpsxK4Z2yCVdxYggaxpLNnKgWWxPZXWrAAsOhrGuDit0G8Z9NXeyshl0wvfxIBt2qTG+bULd+GH0Emv/4JU3+5E8LbM1o/z2otoTzI40Q1DC9nhp6nNFcVBJmhOzIGC5epL2toX/11cLHHytyq9uEv01gSPoA36tA/+CNvgdkH6uI4Fewwlnuil0PXIMT/zzL2M9gec= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +api: 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 +>>>>>>> 0dd5da56 (fix: some fixes) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/smithy/patches/python.patch b/smithy/patches/python.patch index b6a5ba197..93d5d6b32 100644 --- a/smithy/patches/python.patch +++ b/smithy/patches/python.patch @@ -930,3 +930,17 @@ index 9ff09776..abff3d68 100644 ShapeID("smithy.api#httpBearerAuth") ] ) + +diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py +index 9ff09776..abff3d68 100644 +--- a/clients/python/sdk/superposition_sdk/models.py ++++ b/clients/python/sdk/superposition_sdk/models.py +@@ -10316,7 +10316,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) From 464af741c81195dfa167d17ce5978dfd066fb6a9 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Tue, 24 Mar 2026 17:34:37 +0530 Subject: [PATCH 05/16] chore: resolving comments --- crates/experimentation_platform/Cargo.toml | 1 + .../src/api/experiment_config/handlers.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/crates/experimentation_platform/Cargo.toml b/crates/experimentation_platform/Cargo.toml index 1138b8306..d17a87e02 100644 --- a/crates/experimentation_platform/Cargo.toml +++ b/crates/experimentation_platform/Cargo.toml @@ -17,6 +17,7 @@ chrono = { workspace = true } diesel = { workspace = true } experimentation_client = { path = "../experimentation_client" } fred = { workspace = true, features = ["metrics"] } +futures = { workspace = true } inventory = { workspace = true } log = { workspace = true } reqwest = { workspace = true } diff --git a/crates/experimentation_platform/src/api/experiment_config/handlers.rs b/crates/experimentation_platform/src/api/experiment_config/handlers.rs index daf1f20dc..500371bf5 100644 --- a/crates/experimentation_platform/src/api/experiment_config/handlers.rs +++ b/crates/experimentation_platform/src/api/experiment_config/handlers.rs @@ -6,6 +6,7 @@ use actix_web::{ }; use chrono::{DateTime, Utc}; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; +use futures::join; use service_utils::{ db::run_query, helpers::is_not_modified, From e93b10bd469233c1cc4b5e6168513c95b30f4f34 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Tue, 17 Mar 2026 17:23:04 +0530 Subject: [PATCH 06/16] Test --- .../Io/Superposition/Model/GetConfigInput.hs | 7 + .../Model/ListExperimentGroupsInput.hs | 50 +++ .../Model/ListExperimentInput.hs | 37 +++ .../Model/ListExperimentOutput.hs | 71 +++++ .../client/SuperpositionAsyncClientImpl.java | 11 + .../client/SuperpositionClientImpl.java | 11 + .../superposition/model/GetConfigInput.java | 6 + .../model/ListExperimentGroupsInput.java | 80 +++++ .../model/ListExperimentInput.java | 52 +++ .../model/ListExperimentOutput.java | 102 ++++++ .../sdk/src/commands/ListExperimentCommand.ts | 10 + .../commands/ListExperimentGroupsCommand.ts | 5 + clients/javascript/sdk/src/models/models_0.ts | 13 + .../sdk/src/protocols/Aws_restJson1.ts | 8 + .../sdk/superposition_sdk/_private/schemas.py | 50 +++ .../python/sdk/superposition_sdk/config.py | 7 + .../sdk/superposition_sdk/deserialize.py | 4 + .../python/sdk/superposition_sdk/models.py | 29 ++ .../python/sdk/superposition_sdk/serialize.py | 18 ++ .../superposition_sdk/src/client/customize.rs | 1 - .../src/client/list_experiment.rs | 10 + .../src/client/list_experiment_groups.rs | 5 + .../list_experiment/_list_experiment_input.rs | 15 + .../_list_experiment_output.rs | 47 +++ .../src/operation/list_experiment/builders.rs | 3 + .../_list_experiment_groups_input.rs | 25 ++ .../list_experiment_groups/builders.rs | 5 + .../src/protocol_serde/shape_get_config.rs | 4 + .../protocol_serde/shape_list_experiment.rs | 12 + .../shape_list_experiment_groups.rs | 4 + .../shape_list_experiment_output.rs | 4 + crates/superposition_sdk/src/serde_util.rs | 7 + crates/superposition_sdk/src/types.rs | 24 ++ .../superposition_sdk/src/types/builders.rs | 14 + docs/docs/api/Superposition.openapi.json | 18 ++ docs/docs/api/get-config.api.mdx | 17 + docs/docs/api/list-experiment-groups.api.mdx | 21 ++ docs/docs/api/list-experiment.api.mdx | 21 ++ smithy/patches/python.patch | 295 ++++++++++++------ 39 files changed, 1032 insertions(+), 91 deletions(-) diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs index 1e4d25b2f..2a9827dff 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs @@ -144,6 +144,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serQuery "version" (version self) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -155,6 +156,12 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where ======= Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +======= + Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs index ccff708e0..fa880f94e 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs @@ -13,7 +13,12 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( setGroupType, <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) setDimensionMatchStrategy, +======= +>>>>>>> 6e8749e1 (Test) setContext, ======= <<<<<<< HEAD @@ -43,7 +48,10 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( <<<<<<< HEAD <<<<<<< HEAD group_type, +<<<<<<< HEAD dimension_match_strategy, +======= +>>>>>>> 6e8749e1 (Test) context ======= <<<<<<< HEAD @@ -95,7 +103,10 @@ data ListExperimentGroupsInput = ListExperimentGroupsInput { <<<<<<< HEAD <<<<<<< HEAD group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), +<<<<<<< HEAD dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +======= +>>>>>>> 6e8749e1 (Test) context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ======= <<<<<<< HEAD @@ -133,7 +144,10 @@ instance Data.Aeson.ToJSON ListExperimentGroupsInput where <<<<<<< HEAD <<<<<<< HEAD "group_type" Data.Aeson..= group_type a, +<<<<<<< HEAD "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, +======= +>>>>>>> 6e8749e1 (Test) "context" Data.Aeson..= context a ======= <<<<<<< HEAD @@ -170,7 +184,12 @@ instance Data.Aeson.FromJSON ListExperimentGroupsInput where Control.Applicative.<*> (v Data.Aeson..:? "group_type") <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") +======= +>>>>>>> 6e8749e1 (Test) Control.Applicative.<*> (v Data.Aeson..:? "context") ======= <<<<<<< HEAD @@ -202,7 +221,10 @@ data ListExperimentGroupsInputBuilderState = ListExperimentGroupsInputBuilderSta <<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), +<<<<<<< HEAD dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +======= +>>>>>>> 6e8749e1 (Test) contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ======= <<<<<<< HEAD @@ -238,7 +260,10 @@ defaultBuilderState = ListExperimentGroupsInputBuilderState { <<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD dimension_match_strategyBuilderState = Data.Maybe.Nothing, +======= +>>>>>>> 6e8749e1 (Test) contextBuilderState = Data.Maybe.Nothing ======= <<<<<<< HEAD @@ -306,6 +331,7 @@ setGroupType :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) setGroupType value = Control.Monad.State.Strict.modify (\s -> (s { group_typeBuilderState = value })) +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= @@ -314,10 +340,14 @@ setGroupType value = >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> ListExperimentGroupsInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) +======= +>>>>>>> 6e8749e1 (Test) setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> ListExperimentGroupsInputBuilder () setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) @@ -346,7 +376,12 @@ build builder = do group_type' <- Data.Either.Right (group_typeBuilderState st) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) +======= +>>>>>>> 6e8749e1 (Test) context' <- Data.Either.Right (contextBuilderState st) ======= <<<<<<< HEAD @@ -374,7 +409,10 @@ build builder = do <<<<<<< HEAD <<<<<<< HEAD group_type = group_type', +<<<<<<< HEAD dimension_match_strategy = dimension_match_strategy', +======= +>>>>>>> 6e8749e1 (Test) context = context' ======= <<<<<<< HEAD @@ -408,12 +446,15 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w Io.Superposition.Utility.serQuery "created_by" (created_by self) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) Io.Superposition.Utility.serQuery "sort_on" (sort_on self) Io.Superposition.Utility.serQuery "name" (name self) @@ -421,11 +462,20 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +======= + Io.Superposition.Utility.serQuery "sort_on" (sort_on self) + Io.Superposition.Utility.serQuery "name" (name self) + Io.Superposition.Utility.serQuery "page" (page self) + Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs index 332cf1aed..5ef49fff3 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs @@ -16,7 +16,10 @@ module Io.Superposition.Model.ListExperimentInput ( setSortBy, setGlobalExperimentsOnly, setDimensionMatchStrategy, +<<<<<<< HEAD setPrefix, +======= +>>>>>>> 6e8749e1 (Test) setContext, build, ListExperimentInputBuilder, @@ -38,7 +41,10 @@ module Io.Superposition.Model.ListExperimentInput ( sort_by, global_experiments_only, dimension_match_strategy, +<<<<<<< HEAD prefix, +======= +>>>>>>> 6e8749e1 (Test) context ) where import qualified Control.Applicative @@ -79,7 +85,10 @@ data ListExperimentInput = ListExperimentInput { sort_by :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, global_experiments_only :: Data.Maybe.Maybe Bool, dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +<<<<<<< HEAD prefix :: Data.Maybe.Maybe ([] Data.Text.Text), +======= +>>>>>>> 6e8749e1 (Test) context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) } deriving ( GHC.Show.Show, @@ -106,7 +115,10 @@ instance Data.Aeson.ToJSON ListExperimentInput where "sort_by" Data.Aeson..= sort_by a, "global_experiments_only" Data.Aeson..= global_experiments_only a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, +<<<<<<< HEAD "prefix" Data.Aeson..= prefix a, +======= +>>>>>>> 6e8749e1 (Test) "context" Data.Aeson..= context a ] @@ -132,7 +144,10 @@ instance Data.Aeson.FromJSON ListExperimentInput where Control.Applicative.<*> (v Data.Aeson..:? "sort_by") Control.Applicative.<*> (v Data.Aeson..:? "global_experiments_only") Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") +<<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..:? "prefix") +======= +>>>>>>> 6e8749e1 (Test) Control.Applicative.<*> (v Data.Aeson..:? "context") @@ -156,7 +171,10 @@ data ListExperimentInputBuilderState = ListExperimentInputBuilderState { sort_byBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, global_experiments_onlyBuilderState :: Data.Maybe.Maybe Bool, dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +<<<<<<< HEAD prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), +======= +>>>>>>> 6e8749e1 (Test) contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) } deriving ( GHC.Generics.Generic @@ -181,7 +199,10 @@ defaultBuilderState = ListExperimentInputBuilderState { sort_byBuilderState = Data.Maybe.Nothing, global_experiments_onlyBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD prefixBuilderState = Data.Maybe.Nothing, +======= +>>>>>>> 6e8749e1 (Test) contextBuilderState = Data.Maybe.Nothing } @@ -255,10 +276,13 @@ setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMa setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) +<<<<<<< HEAD setPrefix :: Data.Maybe.Maybe ([] Data.Text.Text) -> ListExperimentInputBuilder () setPrefix value = Control.Monad.State.Strict.modify (\s -> (s { prefixBuilderState = value })) +======= +>>>>>>> 6e8749e1 (Test) setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> ListExperimentInputBuilder () setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) @@ -283,7 +307,10 @@ build builder = do sort_by' <- Data.Either.Right (sort_byBuilderState st) global_experiments_only' <- Data.Either.Right (global_experiments_onlyBuilderState st) dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) +<<<<<<< HEAD prefix' <- Data.Either.Right (prefixBuilderState st) +======= +>>>>>>> 6e8749e1 (Test) context' <- Data.Either.Right (contextBuilderState st) Data.Either.Right (ListExperimentInput { count = count', @@ -303,7 +330,10 @@ build builder = do sort_by = sort_by', global_experiments_only = global_experiments_only', dimension_match_strategy = dimension_match_strategy', +<<<<<<< HEAD prefix = prefix', +======= +>>>>>>> 6e8749e1 (Test) context = context' }) @@ -331,6 +361,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serQuery "status" (status self) <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -342,6 +373,12 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where ======= Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +======= + Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs index f9ba25fa0..d60415e79 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs @@ -3,6 +3,7 @@ module Io.Superposition.Model.ListExperimentOutput ( setTotalItems, setData', <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD setLastModified, ======= @@ -14,6 +15,12 @@ module Io.Superposition.Model.ListExperimentOutput ( ======= setLastModified, >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + setLastModified, +======= + setLastModifiedAt, +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) build, ListExperimentOutputBuilder, ListExperimentOutput, @@ -22,8 +29,10 @@ module Io.Superposition.Model.ListExperimentOutput ( <<<<<<< HEAD <<<<<<< HEAD data', +<<<<<<< HEAD last_modified ======= +<<<<<<< HEAD <<<<<<< HEAD data' ======= @@ -35,6 +44,10 @@ module Io.Superposition.Model.ListExperimentOutput ( data', last_modified >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + last_modified_at +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -58,8 +71,10 @@ data ListExperimentOutput = ListExperimentOutput { <<<<<<< HEAD <<<<<<< HEAD data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, +<<<<<<< HEAD last_modified :: Data.Time.UTCTime ======= +<<<<<<< HEAD <<<<<<< HEAD data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse ======= @@ -71,6 +86,10 @@ data ListExperimentOutput = ListExperimentOutput { data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, last_modified :: Data.Time.UTCTime >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + last_modified_at :: Data.Time.UTCTime +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -84,8 +103,10 @@ instance Data.Aeson.ToJSON ListExperimentOutput where <<<<<<< HEAD <<<<<<< HEAD "data" Data.Aeson..= data' a, +<<<<<<< HEAD "last_modified" Data.Aeson..= last_modified a ======= +<<<<<<< HEAD <<<<<<< HEAD "data" Data.Aeson..= data' a ======= @@ -97,6 +118,10 @@ instance Data.Aeson.ToJSON ListExperimentOutput where "data" Data.Aeson..= data' a, "last_modified" Data.Aeson..= last_modified a >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + "last_modified_at" Data.Aeson..= last_modified_at a +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) ] @@ -108,6 +133,7 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Control.Applicative.<*> (v Data.Aeson..: "total_items") Control.Applicative.<*> (v Data.Aeson..: "data") <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..: "last_modified") ======= @@ -119,6 +145,12 @@ instance Data.Aeson.FromJSON ListExperimentOutput where ======= Control.Applicative.<*> (v Data.Aeson..: "last_modified") >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + Control.Applicative.<*> (v Data.Aeson..: "last_modified") +======= + Control.Applicative.<*> (v Data.Aeson..: "last_modified_at") +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) @@ -129,8 +161,10 @@ data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { <<<<<<< HEAD <<<<<<< HEAD data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), +<<<<<<< HEAD last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime ======= +<<<<<<< HEAD <<<<<<< HEAD data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse) ======= @@ -142,6 +176,10 @@ data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + last_modified_atBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } deriving ( GHC.Generics.Generic ) @@ -153,8 +191,10 @@ defaultBuilderState = ListExperimentOutputBuilderState { <<<<<<< HEAD <<<<<<< HEAD data'BuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD last_modifiedBuilderState = Data.Maybe.Nothing ======= +<<<<<<< HEAD <<<<<<< HEAD data'BuilderState = Data.Maybe.Nothing ======= @@ -166,6 +206,10 @@ defaultBuilderState = ListExperimentOutputBuilderState { data'BuilderState = Data.Maybe.Nothing, last_modifiedBuilderState = Data.Maybe.Nothing >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + last_modified_atBuilderState = Data.Maybe.Nothing +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } type ListExperimentOutputBuilder = Control.Monad.State.Strict.State ListExperimentOutputBuilderState @@ -182,6 +226,7 @@ setData' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse -> L setData' value = Control.Monad.State.Strict.modify (\s -> (s { data'BuilderState = Data.Maybe.Just value })) +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= @@ -190,9 +235,16 @@ setData' value = >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () setLastModified value = Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) +======= +setLastModifiedAt :: Data.Time.UTCTime -> ListExperimentOutputBuilder () +setLastModifiedAt value = + Control.Monad.State.Strict.modify (\s -> (s { last_modified_atBuilderState = Data.Maybe.Just value })) +>>>>>>> 6e8749e1 (Test) <<<<<<< HEAD <<<<<<< HEAD @@ -209,13 +261,21 @@ build builder = do data'' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.data' is a required property.") Data.Either.Right (data'BuilderState st) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) +======= + last_modified_at' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified_at is a required property.") Data.Either.Right (last_modified_atBuilderState st) +>>>>>>> 6e8749e1 (Test) Data.Either.Right (ListExperimentOutput { total_pages = total_pages', total_items = total_items', data' = data'', +<<<<<<< HEAD last_modified = last_modified' ======= +<<<<<<< HEAD <<<<<<< HEAD Data.Either.Right (ListExperimentOutput { total_pages = total_pages', @@ -235,6 +295,10 @@ build builder = do >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + last_modified_at = last_modified_at' +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) }) @@ -260,13 +324,20 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where total_pages = var2, total_items = var3, data' = var1, +<<<<<<< HEAD last_modified = var0 <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +======= + last_modified_at = var0 +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index 3e718b863..68d29ac8e 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -273,6 +273,7 @@ final class SuperpositionAsyncClientImpl extends Client implements SuperpositionAsyncClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -281,6 +282,16 @@ final class SuperpositionAsyncClientImpl extends Client implements Superposition .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) ======= >>>>>>> 0dd5da56 (fix: some fixes) +======= +======= +<<<<<<< HEAD +======= + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +>>>>>>> 6e8749e1 (Test) + .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) +>>>>>>> 5f8110af (Test) +>>>>>>> c1293812 (Test) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index 29671d966..67d555297 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -273,6 +273,7 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -281,6 +282,16 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClien .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) ======= >>>>>>> 0dd5da56 (fix: some fixes) +======= +======= +<<<<<<< HEAD +======= + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +>>>>>>> 6e8749e1 (Test) + .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) +>>>>>>> 5f8110af (Test) +>>>>>>> c1293812 (Test) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java index 37f2c15bd..2d35d6909 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java @@ -40,9 +40,11 @@ public final class GetConfigInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, +<<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) ======= <<<<<<< HEAD +<<<<<<< HEAD ======= .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) @@ -52,6 +54,10 @@ public final class GetConfigInput implements SerializableStruct { .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + new HttpHeaderTrait("If-Modified-Since")) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java index fce644f4e..ea07c9895 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java @@ -42,9 +42,11 @@ public final class ListExperimentGroupsInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, +<<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) ======= <<<<<<< HEAD +<<<<<<< HEAD ======= .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) @@ -54,6 +56,10 @@ public final class ListExperimentGroupsInput implements SerializableStruct { .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + new HttpHeaderTrait("If-Modified-Since")) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) .putMember("name", PreludeSchemas.STRING, new HttpQueryTrait("name")) .putMember("created_by", PreludeSchemas.STRING, @@ -68,8 +74,13 @@ public final class ListExperimentGroupsInput implements SerializableStruct { new HttpQueryTrait("group_type")) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) +======= +>>>>>>> 6e8749e1 (Test) .putMember("context", SharedSchemas.CONTEXT_MAP) ======= <<<<<<< HEAD @@ -100,7 +111,12 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private static final Schema $SCHEMA_GROUP_TYPE = $SCHEMA.member("group_type"); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); +======= +>>>>>>> 6e8749e1 (Test) private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); ======= <<<<<<< HEAD @@ -128,7 +144,12 @@ public final class ListExperimentGroupsInput implements SerializableStruct { private final transient List groupType; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) private final transient DimensionMatchStrategy dimensionMatchStrategy; +======= +>>>>>>> 6e8749e1 (Test) private final transient Map context; ======= <<<<<<< HEAD @@ -157,7 +178,12 @@ private ListExperimentGroupsInput(Builder builder) { this.groupType = builder.groupType == null ? null : Collections.unmodifiableList(builder.groupType); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) this.dimensionMatchStrategy = builder.dimensionMatchStrategy; +======= +>>>>>>> 6e8749e1 (Test) this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); ======= <<<<<<< HEAD @@ -259,6 +285,7 @@ public boolean hasGroupType() { return groupType != null; } +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= @@ -267,10 +294,14 @@ public boolean hasGroupType() { >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } +======= +>>>>>>> 6e8749e1 (Test) public Map context() { if (context == null) { return Collections.emptyMap(); @@ -317,7 +348,10 @@ public boolean equals(Object other) { <<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.groupType, that.groupType) +<<<<<<< HEAD && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) +======= +>>>>>>> 6e8749e1 (Test) && Objects.equals(this.context, that.context); ======= <<<<<<< HEAD @@ -338,6 +372,7 @@ public boolean equals(Object other) { @Override public int hashCode() { <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ======= @@ -350,6 +385,12 @@ public int hashCode() { ======= return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); +======= + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, context); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } @Override @@ -393,15 +434,20 @@ public void serializeMembers(ShapeSerializer serializer) { } <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } +======= +>>>>>>> 6e8749e1 (Test) if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } @@ -444,15 +490,22 @@ public T getMemberValue(Schema member) { case 9 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, sortOn); case 10 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); case 11 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); +<<<<<<< HEAD case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +======= + case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -480,7 +533,12 @@ public Builder toBuilder() { builder.groupType(this.groupType); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) builder.dimensionMatchStrategy(this.dimensionMatchStrategy); +======= +>>>>>>> 6e8749e1 (Test) builder.context(this.context); ======= <<<<<<< HEAD @@ -522,7 +580,12 @@ public static final class Builder implements ShapeBuilder groupType; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) private DimensionMatchStrategy dimensionMatchStrategy; +======= +>>>>>>> 6e8749e1 (Test) private Map context; ======= <<<<<<< HEAD @@ -676,6 +739,7 @@ public Builder groupType(List groupType) { /** * @return this builder. */ +<<<<<<< HEAD public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrategy) { this.dimensionMatchStrategy = dimensionMatchStrategy; return this; @@ -684,6 +748,8 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat /** * @return this builder. */ +======= +>>>>>>> 6e8749e1 (Test) public Builder context(Map context) { this.context = context; return this; @@ -732,15 +798,22 @@ public void setMemberValue(Schema member, Object value) { case 9 -> sortOn((ExperimentGroupSortOn) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, value)); case 10 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); case 11 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); +<<<<<<< HEAD case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +======= + case 12 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -803,15 +876,22 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 9 -> builder.sortOn(ExperimentGroupSortOn.builder().deserializeMember(de, member).build()); case 10 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); case 11 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); +<<<<<<< HEAD case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +======= + case 12 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java index 638c24e9d..5c2527b47 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java @@ -42,9 +42,11 @@ public final class ListExperimentInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, +<<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) ======= <<<<<<< HEAD +<<<<<<< HEAD ======= .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) @@ -54,6 +56,10 @@ public final class ListExperimentInput implements SerializableStruct { .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + new HttpHeaderTrait("If-Modified-Since")) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) .putMember("status", SharedSchemas.EXPERIMENT_STATUS_TYPE_LIST, new HttpQueryTrait("status")) .putMember("from_date", SharedSchemas.DATE_TIME, @@ -76,8 +82,11 @@ public final class ListExperimentInput implements SerializableStruct { new HttpQueryTrait("global_experiments_only")) .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) +<<<<<<< HEAD .putMember("prefix", SharedSchemas.STRING_LIST, new HttpQueryTrait("prefix")) +======= +>>>>>>> 6e8749e1 (Test) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); @@ -98,7 +107,10 @@ public final class ListExperimentInput implements SerializableStruct { private static final Schema $SCHEMA_SORT_BY = $SCHEMA.member("sort_by"); private static final Schema $SCHEMA_GLOBAL_EXPERIMENTS_ONLY = $SCHEMA.member("global_experiments_only"); private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); +<<<<<<< HEAD private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); +======= +>>>>>>> 6e8749e1 (Test) private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); private final transient Integer count; @@ -118,7 +130,10 @@ public final class ListExperimentInput implements SerializableStruct { private final transient SortBy sortBy; private final transient Boolean globalExperimentsOnly; private final transient DimensionMatchStrategy dimensionMatchStrategy; +<<<<<<< HEAD private final transient List prefix; +======= +>>>>>>> 6e8749e1 (Test) private final transient Map context; private ListExperimentInput(Builder builder) { @@ -139,7 +154,10 @@ private ListExperimentInput(Builder builder) { this.sortBy = builder.sortBy; this.globalExperimentsOnly = builder.globalExperimentsOnly; this.dimensionMatchStrategy = builder.dimensionMatchStrategy; +<<<<<<< HEAD this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); +======= +>>>>>>> 6e8749e1 (Test) this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); } @@ -253,6 +271,7 @@ public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } +<<<<<<< HEAD public List prefix() { if (prefix == null) { return Collections.emptyList(); @@ -264,6 +283,8 @@ public boolean hasPrefix() { return prefix != null; } +======= +>>>>>>> 6e8749e1 (Test) public Map context() { if (context == null) { return Collections.emptyMap(); @@ -306,13 +327,20 @@ public boolean equals(Object other) { && Objects.equals(this.sortBy, that.sortBy) && Objects.equals(this.globalExperimentsOnly, that.globalExperimentsOnly) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) +<<<<<<< HEAD && Objects.equals(this.prefix, that.prefix) +======= +>>>>>>> 6e8749e1 (Test) && Objects.equals(this.context, that.context); } @Override public int hashCode() { +<<<<<<< HEAD return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, prefix, context); +======= + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, context); +>>>>>>> 6e8749e1 (Test) } @Override @@ -369,9 +397,12 @@ public void serializeMembers(ShapeSerializer serializer) { if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } +<<<<<<< HEAD if (prefix != null) { serializer.writeList($SCHEMA_PREFIX, prefix, prefix.size(), SharedSerde.StringListSerializer.INSTANCE); } +======= +>>>>>>> 6e8749e1 (Test) if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } @@ -398,8 +429,12 @@ public T getMemberValue(Schema member) { case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_GLOBAL_EXPERIMENTS_ONLY, member, globalExperimentsOnly); case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); +<<<<<<< HEAD case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); case 18 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +======= + case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +>>>>>>> 6e8749e1 (Test) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -430,7 +465,10 @@ public Builder toBuilder() { builder.sortBy(this.sortBy); builder.globalExperimentsOnly(this.globalExperimentsOnly); builder.dimensionMatchStrategy(this.dimensionMatchStrategy); +<<<<<<< HEAD builder.prefix(this.prefix); +======= +>>>>>>> 6e8749e1 (Test) builder.context(this.context); return builder; } @@ -464,7 +502,10 @@ public static final class Builder implements ShapeBuilder { private SortBy sortBy; private Boolean globalExperimentsOnly; private DimensionMatchStrategy dimensionMatchStrategy; +<<<<<<< HEAD private List prefix; +======= +>>>>>>> 6e8749e1 (Test) private Map context; private Builder() {} @@ -627,6 +668,7 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat /** * @return this builder. */ +<<<<<<< HEAD public Builder prefix(List prefix) { this.prefix = prefix; return this; @@ -635,6 +677,8 @@ public Builder prefix(List prefix) { /** * @return this builder. */ +======= +>>>>>>> 6e8749e1 (Test) public Builder context(Map context) { this.context = context; return this; @@ -667,8 +711,12 @@ public void setMemberValue(Schema member, Object value) { case 14 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); case 15 -> globalExperimentsOnly((boolean) SchemaUtils.validateSameMember($SCHEMA_GLOBAL_EXPERIMENTS_ONLY, member, value)); case 16 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); +<<<<<<< HEAD case 17 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); case 18 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +======= + case 17 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +>>>>>>> 6e8749e1 (Test) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -722,8 +770,12 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); case 15 -> builder.globalExperimentsOnly(de.readBoolean(member)); case 16 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); +<<<<<<< HEAD case 17 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); case 18 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +======= + case 17 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +>>>>>>> 6e8749e1 (Test) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java index 9d673b9cf..3cdd8335f 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java @@ -32,7 +32,13 @@ public final class ListExperimentOutput implements SerializableStruct { new RequiredTrait()) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) .putMember("last_modified", SharedSchemas.DATE_TIME, +======= + .putMember("last_modified_at", SharedSchemas.DATE_TIME, +>>>>>>> 6e8749e1 (Test) new HttpHeaderTrait("last-modified"), new RequiredTrait()) ======= @@ -54,6 +60,7 @@ public final class ListExperimentOutput implements SerializableStruct { private static final Schema $SCHEMA_TOTAL_ITEMS = $SCHEMA.member("total_items"); private static final Schema $SCHEMA_DATA = $SCHEMA.member("data"); <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ======= @@ -65,11 +72,18 @@ public final class ListExperimentOutput implements SerializableStruct { ======= private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); +======= + private static final Schema $SCHEMA_LAST_MODIFIED_AT = $SCHEMA.member("last_modified_at"); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) private final transient int totalPages; private final transient int totalItems; private final transient List data; <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private final transient Instant lastModified; ======= @@ -81,12 +95,19 @@ public final class ListExperimentOutput implements SerializableStruct { ======= private final transient Instant lastModified; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + private final transient Instant lastModified; +======= + private final transient Instant lastModifiedAt; +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) private ListExperimentOutput(Builder builder) { this.totalPages = builder.totalPages; this.totalItems = builder.totalItems; this.data = Collections.unmodifiableList(builder.data); <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD this.lastModified = builder.lastModified; ======= @@ -98,6 +119,12 @@ private ListExperimentOutput(Builder builder) { ======= this.lastModified = builder.lastModified; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + this.lastModified = builder.lastModified; +======= + this.lastModifiedAt = builder.lastModifiedAt; +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } public int totalPages() { @@ -116,6 +143,7 @@ public boolean hasData() { return true; } +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= @@ -124,8 +152,14 @@ public boolean hasData() { >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) public Instant lastModified() { return lastModified; +======= + public Instant lastModifiedAt() { + return lastModifiedAt; +>>>>>>> 6e8749e1 (Test) } <<<<<<< HEAD @@ -154,8 +188,10 @@ public boolean equals(Object other) { <<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.data, that.data) +<<<<<<< HEAD && Objects.equals(this.lastModified, that.lastModified); ======= +<<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.data, that.data); ======= @@ -167,11 +203,16 @@ public boolean equals(Object other) { && Objects.equals(this.data, that.data) && Objects.equals(this.lastModified, that.lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + && Objects.equals(this.lastModifiedAt, that.lastModifiedAt); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } @Override public int hashCode() { <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(totalPages, totalItems, data, lastModified); ======= @@ -184,6 +225,12 @@ public int hashCode() { ======= return Objects.hash(totalPages, totalItems, data, lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + return Objects.hash(totalPages, totalItems, data, lastModified); +======= + return Objects.hash(totalPages, totalItems, data, lastModifiedAt); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } @Override @@ -197,6 +244,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeInteger($SCHEMA_TOTAL_ITEMS, totalItems); serializer.writeList($SCHEMA_DATA, data, data.size(), SharedSerde.ExperimentListSerializer.INSTANCE); <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ======= @@ -208,6 +256,12 @@ public void serializeMembers(ShapeSerializer serializer) { ======= serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); +======= + serializer.writeTimestamp($SCHEMA_LAST_MODIFIED_AT, lastModifiedAt); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } @Override @@ -218,6 +272,7 @@ public T getMemberValue(Schema member) { case 1 -> (T) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, totalItems); case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_DATA, member, data); <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ======= @@ -229,6 +284,12 @@ public T getMemberValue(Schema member) { ======= case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); +======= + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_AT, member, lastModifiedAt); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -246,6 +307,7 @@ public Builder toBuilder() { builder.totalItems(this.totalItems); builder.data(this.data); <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD builder.lastModified(this.lastModified); ======= @@ -257,6 +319,12 @@ public Builder toBuilder() { ======= builder.lastModified(this.lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + builder.lastModified(this.lastModified); +======= + builder.lastModifiedAt(this.lastModifiedAt); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) return builder; } @@ -276,6 +344,7 @@ public static final class Builder implements ShapeBuilder private int totalItems; private List data; <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private Instant lastModified; ======= @@ -287,6 +356,12 @@ public static final class Builder implements ShapeBuilder ======= private Instant lastModified; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + private Instant lastModified; +======= + private Instant lastModifiedAt; +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) private Builder() {} @@ -337,9 +412,15 @@ public Builder data(List data) { *

Required * @return this builder. */ +<<<<<<< HEAD public Builder lastModified(Instant lastModified) { this.lastModified = Objects.requireNonNull(lastModified, "lastModified cannot be null"); tracker.setMember($SCHEMA_LAST_MODIFIED); +======= + public Builder lastModifiedAt(Instant lastModifiedAt) { + this.lastModifiedAt = Objects.requireNonNull(lastModifiedAt, "lastModifiedAt cannot be null"); + tracker.setMember($SCHEMA_LAST_MODIFIED_AT); +>>>>>>> 6e8749e1 (Test) return this; } @@ -364,6 +445,7 @@ public void setMemberValue(Schema member, Object value) { case 1 -> totalItems((int) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, value)); case 2 -> data((List) SchemaUtils.validateSameMember($SCHEMA_DATA, member, value)); <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ======= @@ -375,6 +457,12 @@ public void setMemberValue(Schema member, Object value) { ======= case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); +======= + case 3 -> lastModifiedAt((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_AT, member, value)); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -395,8 +483,15 @@ public ShapeBuilder errorCorrection() { } <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { lastModified(Instant.EPOCH); +======= + if (!tracker.checkMember($SCHEMA_LAST_MODIFIED_AT)) { + lastModifiedAt(Instant.EPOCH); +>>>>>>> 6e8749e1 (Test) } ======= <<<<<<< HEAD @@ -436,6 +531,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 1 -> builder.totalItems(de.readInteger(member)); case 2 -> builder.data(SharedSerde.deserializeExperimentList(member, de)); <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> builder.lastModified(de.readTimestamp(member)); ======= @@ -447,6 +543,12 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { ======= case 3 -> builder.lastModified(de.readTimestamp(member)); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + case 3 -> builder.lastModified(de.readTimestamp(member)); +======= + case 3 -> builder.lastModifiedAt(de.readTimestamp(member)); +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts index af917b350..e82f5357a 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts @@ -68,9 +68,12 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * sort_by: "desc" || "asc", * global_experiments_only: true || false, * dimension_match_strategy: "exact" || "subset", +<<<<<<< HEAD * prefix: [ * "STRING_VALUE", * ], +======= +>>>>>>> 6e8749e1 (Test) * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, @@ -119,6 +122,7 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // }, * // ], <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD * // last_modified: new Date("TIMESTAMP"), // required ======= @@ -130,6 +134,12 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met ======= * // last_modified: new Date("TIMESTAMP"), // required >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + * // last_modified: new Date("TIMESTAMP"), // required +======= + * // last_modified_at: new Date("TIMESTAMP"), // required +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts index 072158b36..0097e96ae 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts @@ -59,13 +59,18 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO * ], <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) * dimension_match_strategy: "exact" || "subset", +======= +>>>>>>> 6e8749e1 (Test) * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index b72a64a9f..351a80e39 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -2028,12 +2028,15 @@ export interface ListExperimentGroupsInput { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** +<<<<<<< HEAD * Strategy to follow while filter items based on the context * @public */ dimension_match_strategy?: DimensionMatchStrategy | undefined; /** +======= +>>>>>>> 6e8749e1 (Test) * Map representing the context. * Keys correspond to the names of the dimensions. * @public @@ -2163,7 +2166,10 @@ export interface ListExperimentInput { */ dimension_match_strategy?: DimensionMatchStrategy | undefined; +<<<<<<< HEAD prefix?: (string)[] | undefined; +======= +>>>>>>> 6e8749e1 (Test) /** * Map representing the context. * Keys correspond to the names of the dimensions. @@ -2180,6 +2186,7 @@ export interface ListExperimentOutput { total_items: number | undefined; data: (ExperimentResponse)[] | undefined; <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD last_modified: Date | undefined; ======= @@ -2191,6 +2198,12 @@ export interface ListExperimentOutput { ======= last_modified: Date | undefined; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + last_modified: Date | undefined; +======= + last_modified_at: Date | undefined; +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index 8820a3a83..12d465fc6 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -4118,6 +4118,7 @@ export const de_ListExperimentCommand = async( const contents: any = map({ $metadata: deserializeMetadata(output), <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ======= @@ -4129,6 +4130,12 @@ export const de_ListExperimentCommand = async( ======= [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], +======= + [_lma]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) }); const data: Record = __expectNonNull((__expectObject(await parseBody(output.body, context))), "body"); const doc = take(data, { @@ -6240,6 +6247,7 @@ const de_CommandError = async( const _ims_ = "if-modified-since"; const _lm = "last-modified"; const _lm_ = "last_modified"; + const _lma = "last_modified_at"; const _lmb = "last_modified_by"; const _ms = "merge_strategy"; const _n = "name"; diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index 38a0d3bbb..885fe5ef7 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -1729,7 +1729,11 @@ "target": DATE_TIME, "index": 4, "traits": [ +<<<<<<< HEAD Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), +======= + Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), +>>>>>>> 6e8749e1 (Test) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -10049,7 +10053,11 @@ "target": DATE_TIME, "index": 5, "traits": [ +<<<<<<< HEAD Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), +======= + Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), +>>>>>>> 6e8749e1 (Test) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -10118,6 +10126,7 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD "dimension_match_strategy": { @@ -10128,9 +10137,32 @@ ======= ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 12, +======= + "context": { + "target": CONTEXT_MAP, + "index": 12, + "traits": [ + Trait.new(id=ShapeID("smithy.api#notProperty")), + + ], + }, + + } +) + +EXPERIMENT_GROUP_RESPONSE = Schema.collection( + id=ShapeID("io.superposition#ExperimentGroupResponse"), + + members={ + "id": { + "target": STRING, + "index": 0, +>>>>>>> 6e8749e1 (Test) "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), Trait.new(id=ShapeID("smithy.api#httpQuery"), value="dimension_match_strategy"), @@ -11019,7 +11051,11 @@ "target": DATE_TIME, "index": 5, "traits": [ +<<<<<<< HEAD Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), +======= + Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), +>>>>>>> 6e8749e1 (Test) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -11141,6 +11177,7 @@ ], }, +<<<<<<< HEAD "prefix": { "target": STRING_LIST, "index": 17, @@ -11156,6 +11193,13 @@ "index": 18, "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), +======= + "context": { + "target": CONTEXT_MAP, + "index": 17, + "traits": [ + Trait.new(id=ShapeID("smithy.api#notProperty")), +>>>>>>> 6e8749e1 (Test) ], }, @@ -11198,6 +11242,7 @@ ], }, +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= @@ -11206,7 +11251,12 @@ >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) "last_modified": { +======= + "last_modified_at": { +>>>>>>> 6e8749e1 (Test) "target": DATE_TIME, "index": 3, "traits": [ diff --git a/clients/python/sdk/superposition_sdk/config.py b/clients/python/sdk/superposition_sdk/config.py index 43fd46c18..c27e2aafd 100644 --- a/clients/python/sdk/superposition_sdk/config.py +++ b/clients/python/sdk/superposition_sdk/config.py @@ -189,6 +189,7 @@ ) +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] @@ -198,6 +199,12 @@ ======= _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] +======= +_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) @dataclass(init=False) class Config: """Configuration for Superposition.""" diff --git a/clients/python/sdk/superposition_sdk/deserialize.py b/clients/python/sdk/superposition_sdk/deserialize.py index cb1f810be..ce6f0b5fc 100644 --- a/clients/python/sdk/superposition_sdk/deserialize.py +++ b/clients/python/sdk/superposition_sdk/deserialize.py @@ -1551,7 +1551,11 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf _key_lowercase = key.lower() match _key_lowercase: case "last-modified": +<<<<<<< HEAD kwargs["last_modified"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) +======= + kwargs["last_modified_at"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) +>>>>>>> 6e8749e1 (Test) case _: pass diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 68fab3aa6..1696e2f56 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -10190,6 +10190,7 @@ class ListExperimentGroupsInput: :param group_type: Filter by the type of group (USER_CREATED or SYSTEM_GENERATED). +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= @@ -10198,9 +10199,13 @@ class ListExperimentGroupsInput: >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) :param dimension_match_strategy: Strategy to follow while filter items based on the context +======= +>>>>>>> 6e8749e1 (Test) :param context: Map representing the context. Keys correspond to the names of the dimensions. @@ -10227,7 +10232,12 @@ class ListExperimentGroupsInput: group_type: list[str] | None = None <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) dimension_match_strategy: str | None = None +======= +>>>>>>> 6e8749e1 (Test) context: dict[str, Document] | None = None ======= <<<<<<< HEAD @@ -10303,9 +10313,12 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 12: +<<<<<<< HEAD kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) case 13: +======= +>>>>>>> 6e8749e1 (Test) kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["context"]) <<<<<<< HEAD @@ -11064,7 +11077,10 @@ class ListExperimentInput: sort_by: str | None = None global_experiments_only: bool | None = None dimension_match_strategy: str | None = None +<<<<<<< HEAD prefix: list[str] | None = None +======= +>>>>>>> 6e8749e1 (Test) context: dict[str, Document] | None = None def serialize(self, serializer: ShapeSerializer): @@ -11136,9 +11152,12 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_INPUT.members["dimension_match_strategy"]) case 17: +<<<<<<< HEAD kwargs["prefix"] = _deserialize_string_list(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["prefix"]) case 18: +======= +>>>>>>> 6e8749e1 (Test) kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["context"]) case _: @@ -11158,7 +11177,13 @@ class ListExperimentOutput: <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) last_modified: datetime +======= + last_modified_at: datetime +>>>>>>> 6e8749e1 (Test) ======= <<<<<<< HEAD @@ -11201,7 +11226,11 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: <<<<<<< HEAD <<<<<<< HEAD case 3: +<<<<<<< HEAD kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) +======= + kwargs["last_modified_at"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified_at"]) +>>>>>>> 6e8749e1 (Test) ======= <<<<<<< HEAD diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index ad0237145..b9435a1b3 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1058,9 +1058,11 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: +<<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ======= <<<<<<< HEAD +<<<<<<< HEAD ======= if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) @@ -1070,6 +1072,10 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) return _HTTPRequest( destination=_URI( host="", @@ -2052,9 +2058,11 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: +<<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ======= <<<<<<< HEAD +<<<<<<< HEAD ======= if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) @@ -2064,6 +2072,10 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) return _HTTPRequest( destination=_URI( host="", @@ -2127,9 +2139,11 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: +<<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ======= <<<<<<< HEAD +<<<<<<< HEAD ======= if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) @@ -2139,6 +2153,10 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) return _HTTPRequest( destination=_URI( host="", diff --git a/crates/superposition_sdk/src/client/customize.rs b/crates/superposition_sdk/src/client/customize.rs index 122e8d910..7727b6f50 100644 --- a/crates/superposition_sdk/src/client/customize.rs +++ b/crates/superposition_sdk/src/client/customize.rs @@ -81,7 +81,6 @@ - /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. diff --git a/crates/superposition_sdk/src/client/list_experiment.rs b/crates/superposition_sdk/src/client/list_experiment.rs index 38ef5e8ee..f4553b857 100644 --- a/crates/superposition_sdk/src/client/list_experiment.rs +++ b/crates/superposition_sdk/src/client/list_experiment.rs @@ -20,13 +20,17 @@ impl super::Client { /// - [`sort_by(SortBy)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::sort_by) / [`set_sort_by(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_sort_by):
required: **false**
Sort order enumeration for list operations.
/// - [`global_experiments_only(bool)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::global_experiments_only) / [`set_global_experiments_only(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_global_experiments_only):
required: **false**
(undocumented)
/// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+<<<<<<< HEAD /// - [`prefix(impl Into)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_prefix):
required: **false**
(undocumented)
+======= +>>>>>>> 6e8749e1 (Test) /// - [`context(impl Into, Document)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
/// - On success, responds with [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput) with field(s): /// - [`total_pages(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_pages): (undocumented) /// - [`total_items(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_items): (undocumented) /// - [`data(Vec::)`](crate::operation::list_experiment::ListExperimentOutput::data): (undocumented) <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ======= @@ -38,6 +42,12 @@ impl super::Client { ======= /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) +======= + /// - [`last_modified_at(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified_at): (undocumented) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) /// - On failure, responds with [`SdkError`](crate::operation::list_experiment::ListExperimentError) pub fn list_experiment(&self) -> crate::operation::list_experiment::builders::ListExperimentFluentBuilder { crate::operation::list_experiment::builders::ListExperimentFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/list_experiment_groups.rs b/crates/superposition_sdk/src/client/list_experiment_groups.rs index 2901469f3..23ed34fb6 100644 --- a/crates/superposition_sdk/src/client/list_experiment_groups.rs +++ b/crates/superposition_sdk/src/client/list_experiment_groups.rs @@ -17,7 +17,12 @@ impl super::Client { /// - [`group_type(GroupType)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::group_type) / [`set_group_type(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_group_type):
required: **false**
Filter by the type of group (USER_CREATED or SYSTEM_GENERATED).
<<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+======= +>>>>>>> 6e8749e1 (Test) /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
======= <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs index 720260d8e..b744f1731 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs @@ -37,8 +37,11 @@ pub struct ListExperimentInput { pub global_experiments_only: ::std::option::Option, /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, +<<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, +======= +>>>>>>> 6e8749e1 (Test) /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, } @@ -123,6 +126,7 @@ impl ListExperimentInput { pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } +<<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model /// /// If no value was sent for this field, a default will be set. If you want to determine if no value was sent, use `.prefix.is_none()`. @@ -130,6 +134,8 @@ impl ListExperimentInput { self.prefix.as_deref() .unwrap_or_default() } +======= +>>>>>>> 6e8749e1 (Test) /// Map representing the context. Keys correspond to the names of the dimensions. pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() @@ -163,7 +169,10 @@ pub struct ListExperimentInputBuilder { pub(crate) sort_by: ::std::option::Option, pub(crate) global_experiments_only: ::std::option::Option, pub(crate) dimension_match_strategy: ::std::option::Option, +<<<<<<< HEAD pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, +======= +>>>>>>> 6e8749e1 (Test) pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, } impl ListExperimentInputBuilder { @@ -410,6 +419,7 @@ impl ListExperimentInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } +<<<<<<< HEAD /// Appends an item to `prefix`. /// /// To override the contents of this collection use [`set_prefix`](Self::set_prefix). @@ -428,6 +438,8 @@ impl ListExperimentInputBuilder { pub fn get_prefix(&self) -> &::std::option::Option<::std::vec::Vec::<::std::string::String>> { &self.prefix } +======= +>>>>>>> 6e8749e1 (Test) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). @@ -485,8 +497,11 @@ impl ListExperimentInputBuilder { , dimension_match_strategy: self.dimension_match_strategy , +<<<<<<< HEAD prefix: self.prefix , +======= +>>>>>>> 6e8749e1 (Test) context: self.context , } diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs index d702fcb53..f8fe0fd07 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs @@ -12,9 +12,11 @@ pub struct ListExperimentOutput { <<<<<<< HEAD <<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model +<<<<<<< HEAD pub last_modified: ::aws_smithy_types::DateTime, ======= <<<<<<< HEAD +<<<<<<< HEAD ======= #[allow(missing_docs)] // documentation missing in model pub last_modified: ::aws_smithy_types::DateTime, @@ -24,6 +26,10 @@ pub struct ListExperimentOutput { #[allow(missing_docs)] // documentation missing in model pub last_modified: ::aws_smithy_types::DateTime, >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + pub last_modified_at: ::aws_smithy_types::DateTime, +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } impl ListExperimentOutput { #[allow(missing_docs)] // documentation missing in model @@ -47,8 +53,13 @@ impl ListExperimentOutput { ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model +<<<<<<< HEAD pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { &self.last_modified +======= + pub fn last_modified_at(&self) -> &::aws_smithy_types::DateTime { + &self.last_modified_at +>>>>>>> 6e8749e1 (Test) } <<<<<<< HEAD <<<<<<< HEAD @@ -73,6 +84,7 @@ pub struct ListExperimentOutputBuilder { pub(crate) total_items: ::std::option::Option, pub(crate) data: ::std::option::Option<::std::vec::Vec::>, <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ======= @@ -84,6 +96,12 @@ pub struct ListExperimentOutputBuilder { ======= pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, +======= + pub(crate) last_modified_at: ::std::option::Option<::aws_smithy_types::DateTime>, +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) } impl ListExperimentOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -142,6 +160,7 @@ impl ListExperimentOutputBuilder { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model /// This field is required. +<<<<<<< HEAD pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { self.last_modified = ::std::option::Option::Some(input); self @@ -153,6 +172,19 @@ impl ListExperimentOutputBuilder { #[allow(missing_docs)] // documentation missing in model pub fn get_last_modified(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { &self.last_modified +======= + pub fn last_modified_at(mut self, input: ::aws_smithy_types::DateTime) -> Self { + self.last_modified_at = ::std::option::Option::Some(input); + self + } + #[allow(missing_docs)] // documentation missing in model + pub fn set_last_modified_at(mut self, input: ::std::option::Option<::aws_smithy_types::DateTime>) -> Self { + self.last_modified_at = input; self + } + #[allow(missing_docs)] // documentation missing in model + pub fn get_last_modified_at(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { + &self.last_modified_at +>>>>>>> 6e8749e1 (Test) } <<<<<<< HEAD <<<<<<< HEAD @@ -167,6 +199,7 @@ impl ListExperimentOutputBuilder { /// - [`total_items`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::total_items) /// - [`data`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::data) <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ======= @@ -178,6 +211,12 @@ impl ListExperimentOutputBuilder { ======= /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= + /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) +======= + /// - [`last_modified_at`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified_at) +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::list_experiment::ListExperimentOutput { @@ -198,15 +237,23 @@ impl ListExperimentOutputBuilder { , <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) last_modified: self.last_modified .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") +======= + last_modified_at: self.last_modified_at + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified_at", "last_modified_at was not specified but it is required when building ListExperimentOutput") +>>>>>>> 6e8749e1 (Test) )? , <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment/builders.rs b/crates/superposition_sdk/src/operation/list_experiment/builders.rs index 68e8b7d3e..419a35e79 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/builders.rs @@ -355,6 +355,7 @@ impl ListExperimentFluentBuilder { self.inner.get_dimension_match_strategy() } /// +<<<<<<< HEAD /// Appends an item to `prefix`. /// /// To override the contents of this collection use [`set_prefix`](Self::set_prefix). @@ -374,6 +375,8 @@ impl ListExperimentFluentBuilder { self.inner.get_prefix() } /// +======= +>>>>>>> 6e8749e1 (Test) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs index 0de7e34e7..bf4929fd3 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs @@ -29,14 +29,19 @@ pub struct ListExperimentGroupsInput { pub group_type: ::std::option::Option<::std::vec::Vec::>, <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, +======= +>>>>>>> 6e8749e1 (Test) /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, <<<<<<< HEAD @@ -101,16 +106,21 @@ impl ListExperimentGroupsInput { } <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } +======= +>>>>>>> 6e8749e1 (Test) /// Map representing the context. Keys correspond to the names of the dimensions. pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() @@ -148,7 +158,12 @@ pub struct ListExperimentGroupsInputBuilder { pub(crate) group_type: ::std::option::Option<::std::vec::Vec::>, <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) pub(crate) dimension_match_strategy: ::std::option::Option, +======= +>>>>>>> 6e8749e1 (Test) pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, ======= <<<<<<< HEAD @@ -329,12 +344,15 @@ impl ListExperimentGroupsInputBuilder { } <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -348,6 +366,8 @@ impl ListExperimentGroupsInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } +======= +>>>>>>> 6e8749e1 (Test) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). @@ -404,14 +424,19 @@ impl ListExperimentGroupsInputBuilder { , <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) dimension_match_strategy: self.dimension_match_strategy , +======= +>>>>>>> 6e8749e1 (Test) context: self.context , <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs index 8126e326d..564162a6e 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs @@ -271,12 +271,15 @@ impl ListExperimentGroupsFluentBuilder { } <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -291,6 +294,8 @@ impl ListExperimentGroupsFluentBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { self.inner.get_dimension_match_strategy() } +======= +>>>>>>> 6e8749e1 (Test) /// /// Adds a key-value pair to `context`. /// diff --git a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs index 174f473e4..95c848dff 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs @@ -95,7 +95,11 @@ pub fn ser_get_config_headers( err )) })?; +<<<<<<< HEAD builder = builder.header("if-modified-since", header_value); +======= + builder = builder.header("If-Modified-Since", header_value); +>>>>>>> 6e8749e1 (Test) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs index a44dd3df8..4bfa2f535 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs @@ -39,15 +39,23 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers output = crate::protocol_serde::shape_list_experiment::de_list_experiment(_response_body, output).map_err(crate::operation::list_experiment::ListExperimentError::unhandled)?; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) output = output.set_last_modified( crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? +======= + output = output.set_last_modified_at( + crate::protocol_serde::shape_list_experiment_output::de_last_modified_at_header(_response_headers) + .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified_at from header `last-modified"))? +>>>>>>> 6e8749e1 (Test) ); <<<<<<< HEAD <<<<<<< HEAD @@ -106,7 +114,11 @@ pub fn ser_list_experiment_headers( err )) })?; +<<<<<<< HEAD builder = builder.header("if-modified-since", header_value); +======= + builder = builder.header("If-Modified-Since", header_value); +>>>>>>> 6e8749e1 (Test) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs index 99e7ab0b6..7114c8742 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs @@ -91,7 +91,11 @@ pub fn ser_list_experiment_groups_headers( err )) })?; +<<<<<<< HEAD builder = builder.header("if-modified-since", header_value); +======= + builder = builder.header("If-Modified-Since", header_value); +>>>>>>> 6e8749e1 (Test) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs index 96239da1e..03c017937 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs @@ -1,5 +1,9 @@ // Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. +<<<<<<< HEAD pub(crate) fn de_last_modified_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { +======= +pub(crate) fn de_last_modified_at_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { +>>>>>>> 6e8749e1 (Test) let headers = header_map.get_all("last-modified"); let var_1: Vec<::aws_smithy_types::DateTime> = ::aws_smithy_http::header::many_dates(headers, ::aws_smithy_types::date_time::Format::DateTimeWithOffset)? ; diff --git a/crates/superposition_sdk/src/serde_util.rs b/crates/superposition_sdk/src/serde_util.rs index 49a82f885..e7131dfb2 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -593,6 +593,7 @@ if builder.total_items.is_none() { builder.total_items = Some(Default::default() if builder.data.is_none() { builder.data = Some(Default::default()) } <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ======= <<<<<<< HEAD @@ -603,6 +604,12 @@ if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_t ======= if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +======= +if builder.last_modified_at.is_none() { builder.last_modified_at = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) builder } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index 03e1cae49..395c036a4 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -18,8 +18,11 @@ pub use crate::types::_bucket::Bucket; <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> c1293812 (Test) pub use crate::types::_experiment_response::ExperimentResponse; pub use crate::types::_variant::Variant; @@ -42,6 +45,8 @@ pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> 6e8749e1 (Test) pub use crate::types::_experiment_group_sort_on::ExperimentGroupSortOn; pub use crate::types::_version::Version; @@ -56,6 +61,7 @@ pub use crate::types::_workspace_response::WorkspaceResponse; pub use crate::types::_type_templates_response::TypeTemplatesResponse; +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD pub use crate::types::_experiment_sort_on::ExperimentSortOn; @@ -87,8 +93,26 @@ pub use crate::types::_experiment_type::ExperimentType; ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> c1293812 (Test) +pub use crate::types::_experiment_sort_on::ExperimentSortOn; + +======= +pub use crate::types::_variant::Variant; + +pub use crate::types::_variant_type::VariantType; + +pub use crate::types::_experiment_response::ExperimentResponse; + +pub use crate::types::_experiment_status_type::ExperimentStatusType; + +pub use crate::types::_experiment_type::ExperimentType; + +pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; + pub use crate::types::_experiment_sort_on::ExperimentSortOn; +>>>>>>> 6e8749e1 (Test) pub use crate::types::_variant_update_request::VariantUpdateRequest; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) diff --git a/crates/superposition_sdk/src/types/builders.rs b/crates/superposition_sdk/src/types/builders.rs index 0e585bfb8..8b6a593c7 100644 --- a/crates/superposition_sdk/src/types/builders.rs +++ b/crates/superposition_sdk/src/types/builders.rs @@ -5,6 +5,7 @@ pub use crate::types::_variable_response::VariableResponseBuilder; pub use crate::types::_experiment_group_response::ExperimentGroupResponseBuilder; <<<<<<< HEAD +<<<<<<< HEAD pub use crate::types::_bucket::BucketBuilder; @@ -13,12 +14,18 @@ pub use crate::types::_experiment_response::ExperimentResponseBuilder; pub use crate::types::_variant::VariantBuilder; ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) pub use crate::types::_bucket::BucketBuilder; pub use crate::types::_experiment_response::ExperimentResponseBuilder; pub use crate::types::_variant::VariantBuilder; +======= +>>>>>>> 6e8749e1 (Test) + +pub use crate::types::_bucket::BucketBuilder; pub use crate::types::_webhook_response::WebhookResponseBuilder; @@ -28,14 +35,21 @@ pub use crate::types::_type_templates_response::TypeTemplatesResponseBuilder; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) ======= pub use crate::types::_variant::VariantBuilder; pub use crate::types::_experiment_response::ExperimentResponseBuilder; +<<<<<<< HEAD >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) +======= +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) pub use crate::types::_variant_update_request::VariantUpdateRequestBuilder; pub use crate::types::_organisation_response::OrganisationResponseBuilder; diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index d1fb07f9f..19b7c39b2 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -172,13 +172,19 @@ { <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) "name": "if-modified-since", +======= + "name": "If-Modified-Since", +>>>>>>> 6e8749e1 (Test) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { @@ -2170,12 +2176,15 @@ { <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= >>>>>>> 91d47048 (fix: more fixes) ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -2185,6 +2194,9 @@ }, { "name": "if-modified-since", +======= + "name": "If-Modified-Since", +>>>>>>> 6e8749e1 (Test) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { @@ -2840,8 +2852,11 @@ { <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +>>>>>>> c1293812 (Test) "name": "prefix", "in": "query", "style": "form", @@ -2862,6 +2877,9 @@ ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "if-modified-since", +======= + "name": "If-Modified-Since", +>>>>>>> 6e8749e1 (Test) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { diff --git a/docs/docs/api/get-config.api.mdx b/docs/docs/api/get-config.api.mdx index 9b412dd11..24602212d 100644 --- a/docs/docs/api/get-config.api.mdx +++ b/docs/docs/api/get-config.api.mdx @@ -7,6 +7,7 @@ hide_title: true hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD api: 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 ======= <<<<<<< HEAD @@ -18,6 +19,12 @@ api: eJztWEtv2zgQ/iuETruAnWbbzaW3NA3SYFs4cBzsIWsYtDSy2EiklqQSG4b/+86QEi3ZUpo+Fui ======= api: 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 >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +======= +api: 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 +======= +api: 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 +>>>>>>> 6e8749e1 (Test) +>>>>>>> c1293812 (Test) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null @@ -60,7 +67,11 @@ Retrieves config data with context evaluation, including applicable contexts, ov >>>>>> 0366c46c (Test) > @@ -72,7 +83,13 @@ Retrieves config data with context evaluation, including applicable contexts, ov >>>>>> 0366c46c (Test) > diff --git a/docs/docs/api/list-experiment-groups.api.mdx b/docs/docs/api/list-experiment-groups.api.mdx index 98012440b..8f767bbae 100644 --- a/docs/docs/api/list-experiment-groups.api.mdx +++ b/docs/docs/api/list-experiment-groups.api.mdx @@ -7,7 +7,13 @@ hide_title: true hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) api: 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 +======= +api: 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 +>>>>>>> 6e8749e1 (Test) sidebar_class_name: "post api-method" ======= <<<<<<< HEAD @@ -63,19 +69,34 @@ Lists experiment groups, with support for filtering and pagination. >>>>>> 0366c46c (Test) > >>>>>> 0366c46c (Test) > >>>>>> 0366c46c (Test) > diff --git a/docs/docs/api/list-experiment.api.mdx b/docs/docs/api/list-experiment.api.mdx index 85b085993..3e6e09873 100644 --- a/docs/docs/api/list-experiment.api.mdx +++ b/docs/docs/api/list-experiment.api.mdx @@ -7,7 +7,13 @@ hide_title: true hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> c1293812 (Test) api: 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 +======= +api: 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 +>>>>>>> 6e8749e1 (Test) sidebar_class_name: "post api-method" ======= <<<<<<< HEAD @@ -63,19 +69,34 @@ Retrieves a paginated list of experiments with support for filtering by status, >>>>>> 0366c46c (Test) > >>>>>> 0366c46c (Test) > >>>>>> 0366c46c (Test) > diff --git a/smithy/patches/python.patch b/smithy/patches/python.patch index 93d5d6b32..d85e795a2 100644 --- a/smithy/patches/python.patch +++ b/smithy/patches/python.patch @@ -24,10 +24,10 @@ index 7c295b28..b7a7bd7e 100644 reportPrivateUsage = false diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py -index 49e83ee2..a0b17933 100644 +index 6434d0c3..38e37e90 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py -@@ -678,7 +678,7 @@ ADD_MEMBERS_TO_GROUP = APIOperation( +@@ -652,7 +652,7 @@ ADD_MEMBERS_TO_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -36,7 +36,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -880,7 +880,7 @@ APPLICABLE_VARIANTS = APIOperation( +@@ -854,7 +854,7 @@ APPLICABLE_VARIANTS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -45,7 +45,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -1154,7 +1154,7 @@ LIST_AUDIT_LOGS = APIOperation( +@@ -1128,7 +1128,7 @@ LIST_AUDIT_LOGS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -54,7 +54,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -1913,7 +1913,7 @@ BULK_OPERATION = APIOperation( +@@ -1887,7 +1887,7 @@ BULK_OPERATION = APIOperation( ShapeID("io.superposition#ResourceNotFound"): ResourceNotFound, }), effective_auth_schemes = [ @@ -63,7 +63,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2202,7 +2202,7 @@ CONCLUDE_EXPERIMENT = APIOperation( +@@ -2146,7 +2146,7 @@ CONCLUDE_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -72,7 +72,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2719,7 +2719,7 @@ GET_CONFIG = APIOperation( +@@ -2658,7 +2658,7 @@ GET_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -81,7 +81,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2816,7 +2816,7 @@ GET_CONFIG_JSON = APIOperation( +@@ -2749,7 +2749,7 @@ GET_CONFIG_FAST = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -90,7 +90,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2913,7 +2913,7 @@ GET_CONFIG_TOML = APIOperation( +@@ -2886,7 +2886,7 @@ GET_RESOLVED_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -99,7 +99,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3050,7 +3050,7 @@ GET_RESOLVED_CONFIG = APIOperation( +@@ -3023,7 +3023,7 @@ GET_RESOLVED_CONFIG_WITH_IDENTIFIER = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -108,8 +108,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3187,7 +3187,7 @@ GET_RESOLVED_CONFIG_WITH_IDENTIFIER = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -3138,7 +3138,7 @@ GET_VERSION = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -117,8 +117,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3302,7 +3302,7 @@ GET_VERSION = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -3318,7 +3318,7 @@ LIST_VERSIONS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -126,8 +126,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3482,7 +3482,7 @@ LIST_VERSIONS = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -3482,7 +3482,7 @@ CREATE_CONTEXT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -135,7 +135,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3646,7 +3646,7 @@ CREATE_CONTEXT = APIOperation( +@@ -3566,7 +3566,7 @@ DELETE_CONTEXT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -144,7 +144,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3730,7 +3730,7 @@ DELETE_CONTEXT = APIOperation( +@@ -3726,7 +3726,7 @@ GET_CONTEXT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -153,7 +153,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3890,7 +3890,7 @@ GET_CONTEXT = APIOperation( +@@ -3886,7 +3886,7 @@ GET_CONTEXT_FROM_CONDITION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -162,8 +162,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4050,7 +4050,7 @@ GET_CONTEXT_FROM_CONDITION = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -4074,7 +4074,7 @@ LIST_CONTEXTS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -171,8 +171,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4238,7 +4238,7 @@ LIST_CONTEXTS = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -4238,7 +4238,7 @@ MOVE_CONTEXT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -180,7 +180,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4402,7 +4402,7 @@ MOVE_CONTEXT = APIOperation( +@@ -4402,7 +4402,7 @@ UPDATE_OVERRIDE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -189,8 +189,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4566,7 +4566,7 @@ UPDATE_OVERRIDE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -4489,7 +4489,7 @@ VALIDATE_CONTEXT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -198,7 +198,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4653,7 +4653,7 @@ VALIDATE_CONTEXT = APIOperation( +@@ -4653,7 +4653,7 @@ WEIGHT_RECOMPUTE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -207,7 +207,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4817,7 +4817,7 @@ WEIGHT_RECOMPUTE = APIOperation( +@@ -4886,7 +4886,7 @@ CREATE_DEFAULT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -216,7 +216,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5050,7 +5050,7 @@ CREATE_DEFAULT_CONFIG = APIOperation( +@@ -5114,7 +5114,7 @@ CREATE_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -225,7 +225,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5278,7 +5278,7 @@ CREATE_DIMENSION = APIOperation( +@@ -5381,7 +5381,7 @@ CREATE_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -234,7 +234,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5545,7 +5545,7 @@ CREATE_EXPERIMENT = APIOperation( +@@ -5600,7 +5600,7 @@ CREATE_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -243,7 +243,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5764,7 +5764,7 @@ CREATE_EXPERIMENT_GROUP = APIOperation( +@@ -5808,7 +5808,7 @@ CREATE_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -252,7 +252,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5975,7 +5975,7 @@ CREATE_FUNCTION = APIOperation( +@@ -5995,7 +5995,7 @@ CREATE_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -261,7 +261,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6162,7 +6162,7 @@ CREATE_ORGANISATION = APIOperation( +@@ -6156,7 +6156,7 @@ CREATE_TYPE_TEMPLATES = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -270,7 +270,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6314,7 +6314,7 @@ CREATE_SECRET = APIOperation( +@@ -6303,7 +6303,7 @@ CREATE_VARIABLE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -279,7 +279,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6475,7 +6475,7 @@ CREATE_TYPE_TEMPLATES = APIOperation( +@@ -6573,7 +6573,7 @@ CREATE_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -288,7 +288,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6622,7 +6622,7 @@ CREATE_VARIABLE = APIOperation( +@@ -6836,7 +6836,7 @@ CREATE_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -297,8 +297,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6892,7 +6892,7 @@ CREATE_WEBHOOK = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -6916,7 +6916,7 @@ DELETE_DEFAULT_CONFIG = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -306,7 +306,16 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7142,7 +7142,7 @@ CREATE_WORKSPACE = APIOperation( +@@ -7070,7 +7070,7 @@ GET_DEFAULT_CONFIG = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -7307,7 +7307,7 @@ LIST_DEFAULT_CONFIGS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -315,7 +324,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7222,7 +7222,7 @@ DELETE_DEFAULT_CONFIG = APIOperation( +@@ -7514,7 +7514,7 @@ UPDATE_DEFAULT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -324,7 +333,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7376,7 +7376,7 @@ GET_DEFAULT_CONFIG = APIOperation( +@@ -7594,7 +7594,7 @@ DELETE_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -333,8 +342,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7613,7 +7613,7 @@ LIST_DEFAULT_CONFIGS = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -7764,7 +7764,7 @@ DELETE_EXPERIMENT_GROUP = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -342,7 +351,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7820,7 +7820,7 @@ UPDATE_DEFAULT_CONFIG = APIOperation( +@@ -7844,7 +7844,7 @@ DELETE_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -351,7 +360,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7900,7 +7900,7 @@ DELETE_DIMENSION = APIOperation( +@@ -7977,7 +7977,7 @@ DELETE_TYPE_TEMPLATES = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -360,7 +369,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8070,7 +8070,7 @@ DELETE_EXPERIMENT_GROUP = APIOperation( +@@ -8103,7 +8103,7 @@ DELETE_VARIABLE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -369,7 +378,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8150,7 +8150,7 @@ DELETE_FUNCTION = APIOperation( +@@ -8183,7 +8183,7 @@ DELETE_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -378,7 +387,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8275,7 +8275,7 @@ DELETE_SECRET = APIOperation( +@@ -8355,7 +8355,7 @@ GET_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -387,8 +396,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8408,7 +8408,7 @@ DELETE_TYPE_TEMPLATES = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -8606,7 +8606,7 @@ LIST_DIMENSIONS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -396,7 +405,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8534,7 +8534,7 @@ DELETE_VARIABLE = APIOperation( +@@ -8831,7 +8831,7 @@ UPDATE_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -405,7 +414,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8614,7 +8614,7 @@ DELETE_WEBHOOK = APIOperation( +@@ -9047,7 +9047,7 @@ DISCARD_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -414,7 +423,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8786,7 +8786,7 @@ GET_DIMENSION = APIOperation( +@@ -9217,7 +9217,7 @@ GET_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -423,7 +432,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9037,7 +9037,7 @@ LIST_DIMENSIONS = APIOperation( +@@ -9550,7 +9550,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -432,7 +441,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9262,7 +9262,7 @@ UPDATE_DIMENSION = APIOperation( +@@ -9742,7 +9742,7 @@ REMOVE_MEMBERS_FROM_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -441,7 +450,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9478,7 +9478,7 @@ DISCARD_EXPERIMENT = APIOperation( +@@ -9944,7 +9944,7 @@ UPDATE_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -450,7 +459,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9648,7 +9648,7 @@ GET_EXPERIMENT_GROUP = APIOperation( +@@ -10329,7 +10329,7 @@ GET_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -459,7 +468,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10011,7 +10011,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( +@@ -10517,7 +10517,7 @@ LIST_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -468,7 +477,25 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10203,7 +10203,7 @@ REMOVE_MEMBERS_FROM_GROUP = APIOperation( +@@ -10733,7 +10733,7 @@ PAUSE_EXPERIMENT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -10956,7 +10956,7 @@ RAMP_EXPERIMENT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -11172,7 +11172,7 @@ RESUME_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -477,7 +504,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10405,7 +10405,7 @@ UPDATE_EXPERIMENT_GROUP = APIOperation( +@@ -11483,7 +11483,7 @@ UPDATE_OVERRIDES_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -486,7 +513,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10790,7 +10790,7 @@ GET_EXPERIMENT = APIOperation( +@@ -11650,7 +11650,7 @@ GET_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -495,7 +522,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11005,7 +11005,7 @@ LIST_EXPERIMENT = APIOperation( +@@ -11918,7 +11918,7 @@ LIST_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -504,7 +531,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11221,7 +11221,7 @@ PAUSE_EXPERIMENT = APIOperation( +@@ -12090,7 +12090,7 @@ PUBLISH = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -513,7 +540,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11444,7 +11444,7 @@ RAMP_EXPERIMENT = APIOperation( +@@ -12394,7 +12394,7 @@ TEST = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -522,7 +549,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11660,7 +11660,7 @@ RESUME_EXPERIMENT = APIOperation( +@@ -12587,7 +12587,7 @@ UPDATE_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -531,7 +558,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11971,7 +11971,7 @@ UPDATE_OVERRIDES_EXPERIMENT = APIOperation( +@@ -12734,7 +12734,7 @@ GET_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -540,7 +567,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12138,7 +12138,7 @@ GET_FUNCTION = APIOperation( +@@ -12867,7 +12867,7 @@ GET_TYPE_TEMPLATE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -549,7 +576,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12406,7 +12406,7 @@ LIST_FUNCTION = APIOperation( +@@ -13079,7 +13079,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -558,7 +585,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12578,7 +12578,7 @@ PUBLISH = APIOperation( +@@ -13205,7 +13205,7 @@ GET_VARIABLE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -567,7 +594,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12900,7 +12900,7 @@ TEST = APIOperation( +@@ -13383,7 +13383,7 @@ GET_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -576,7 +603,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13093,7 +13093,7 @@ UPDATE_FUNCTION = APIOperation( +@@ -13561,7 +13561,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -585,7 +612,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13240,7 +13240,7 @@ GET_ORGANISATION = APIOperation( +@@ -13746,7 +13746,7 @@ GET_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -594,8 +621,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13365,7 +13365,7 @@ GET_SECRET = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -13972,7 +13972,7 @@ LIST_ORGANISATION = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -603,7 +630,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13498,7 +13498,7 @@ GET_TYPE_TEMPLATE = APIOperation( +<<<<<<< HEAD +@@ -12578,7 +12578,7 @@ PUBLISH = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -612,9 +640,8 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13710,7 +13710,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( -<<<<<<< HEAD - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -12900,7 +12900,7 @@ TEST = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -622,7 +649,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13836,7 +13836,7 @@ GET_VARIABLE = APIOperation( +@@ -13093,7 +13093,7 @@ UPDATE_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -631,7 +658,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14014,7 +14014,7 @@ GET_WEBHOOK = APIOperation( +@@ -13240,7 +13240,7 @@ GET_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -640,7 +667,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14192,7 +14192,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( +@@ -13365,7 +13365,7 @@ GET_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -649,7 +676,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14371,7 +14371,7 @@ GET_WORKSPACE = APIOperation( +@@ -13498,7 +13498,7 @@ GET_TYPE_TEMPLATE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -658,7 +685,11 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14597,7 +14597,7 @@ LIST_ORGANISATION = APIOperation( +@@ -13710,7 +13710,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( +<<<<<<< HEAD +======= +@@ -14218,7 +14218,7 @@ LIST_VARIABLES = APIOperation( +>>>>>>> c1293812 (Test) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -667,7 +698,7 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14841,7 +14841,7 @@ LIST_SECRETS = APIOperation( +@@ -14475,7 +14475,7 @@ LIST_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -676,6 +707,16 @@ index 49e83ee2..a0b17933 100644 ShapeID("smithy.api#httpBearerAuth") ] ) +@@ -14739,7 +14739,7 @@ LIST_WORKSPACE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +<<<<<<< HEAD @@ -15087,7 +15087,7 @@ LIST_VARIABLES = APIOperation( ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @@ -859,6 +900,9 @@ index 9ff09776..abff3d68 100644 ] ) @@ -15858,7 +15858,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( +======= +@@ -14924,7 +14924,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( +>>>>>>> c1293812 (Test) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -867,7 +911,7 @@ index 9ff09776..abff3d68 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16045,7 +16045,7 @@ UPDATE_ORGANISATION = APIOperation( +@@ -15111,7 +15111,7 @@ UPDATE_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -876,7 +920,47 @@ index 9ff09776..abff3d68 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16130,7 +16130,7 @@ ROTATE_WORKSPACE_ENCRYPTION_KEY = APIOperation( +@@ -15270,7 +15270,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15415,7 +15415,7 @@ UPDATE_VARIABLE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15654,7 +15654,7 @@ UPDATE_WEBHOOK = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15906,7 +15906,7 @@ UPDATE_WORKSPACE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py +index 294231fb..9d836018 100644 +--- a/clients/python/sdk/superposition_sdk/models.py ++++ b/clients/python/sdk/superposition_sdk/models.py +@@ -7025,7 +7025,7 @@ CREATE_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -885,7 +969,7 @@ index 9ff09776..abff3d68 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16281,7 +16281,7 @@ UPDATE_SECRET = APIOperation( +@@ -14018,7 +14018,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -894,7 +978,7 @@ index 9ff09776..abff3d68 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16440,7 +16440,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( +@@ -14197,7 +14197,7 @@ GET_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -903,11 +987,42 @@ index 9ff09776..abff3d68 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16585,7 +16585,7 @@ UPDATE_VARIABLE = APIOperation( +@@ -15428,7 +15428,7 @@ LIST_WORKSPACE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16734,7 +16734,7 @@ UPDATE_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py +index 2eb77129..ea06e2c3 100644 +--- a/clients/python/sdk/superposition_sdk/models.py ++++ b/clients/python/sdk/superposition_sdk/models.py +@@ -15263,7 +15263,7 @@ LIST_WEBHOOK = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15614,7 +15614,7 @@ ROTATE_MASTER_KEY = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") + ShapeID("smithy.api#httpBasicAuth"), ShapeID("smithy.api#httpBearerAuth") ] From 3c66558ccd50307fc9d1db793d8305bfcf7a2136 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Wed, 18 Mar 2026 21:05:08 +0530 Subject: [PATCH 07/16] fix: more fixes --- .../Io/Superposition/Model/GetConfigInput.hs | 9 ++ .../Model/ListExperimentGroupsInput.hs | 63 +++++++++ .../Model/ListExperimentInput.hs | 9 ++ .../Model/ListExperimentOutput.hs | 81 ++++++++++++ .../client/SuperpositionAsyncClient.java | 6 +- .../client/SuperpositionAsyncClientImpl.java | 7 + .../client/SuperpositionClient.java | 6 +- .../client/SuperpositionClientImpl.java | 7 + .../superposition/model/GetConfigInput.java | 7 + .../model/ListExperimentGroupsInput.java | 103 +++++++++++++++ .../model/ListExperimentInput.java | 7 + .../model/ListExperimentOutput.java | 123 ++++++++++++++++++ .../sdk/src/commands/ListExperimentCommand.ts | 9 ++ .../commands/ListExperimentGroupsCommand.ts | 6 + clients/javascript/sdk/src/models/models_0.ts | 15 +++ .../sdk/src/protocols/Aws_restJson1.ts | 10 +- .../sdk/superposition_sdk/_private/schemas.py | 35 ++++- .../sdk/superposition_sdk/deserialize.py | 4 + .../python/sdk/superposition_sdk/models.py | 30 +++++ .../python/sdk/superposition_sdk/serialize.py | 21 +++ .../src/client/list_experiment.rs | 9 ++ .../src/client/list_experiment_groups.rs | 6 + .../_list_experiment_output.rs | 52 +++++++- .../_list_experiment_groups_input.rs | 36 +++++ .../list_experiment_groups/builders.rs | 8 ++ .../src/protocol_serde/shape_get_config.rs | 4 + .../protocol_serde/shape_list_experiment.rs | 12 ++ .../shape_list_experiment_groups.rs | 4 + .../shape_list_experiment_output.rs | 4 + crates/superposition_sdk/src/serde_util.rs | 9 ++ crates/superposition_sdk/src/types.rs | 9 +- docs/docs/api/Superposition.openapi.json | 20 +++ docs/docs/api/get-config-json.api.mdx | 4 + docs/docs/api/get-config-toml.api.mdx | 4 + docs/docs/api/get-config.api.mdx | 13 ++ docs/docs/api/list-experiment-groups.api.mdx | 10 ++ docs/docs/api/list-experiment.api.mdx | 10 ++ 37 files changed, 760 insertions(+), 12 deletions(-) diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs index 2a9827dff..e976709cd 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs @@ -145,6 +145,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -157,11 +158,19 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs index fa880f94e..229c9419e 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs @@ -14,11 +14,17 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) setDimensionMatchStrategy, ======= >>>>>>> 6e8749e1 (Test) +======= + setDimensionMatchStrategy, +>>>>>>> 82479b8f (fix: more fixes) setContext, ======= <<<<<<< HEAD @@ -48,10 +54,14 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( <<<<<<< HEAD <<<<<<< HEAD group_type, +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy, ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategy, +>>>>>>> 82479b8f (fix: more fixes) context ======= <<<<<<< HEAD @@ -103,10 +113,14 @@ data ListExperimentGroupsInput = ListExperimentGroupsInput { <<<<<<< HEAD <<<<<<< HEAD group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +>>>>>>> 82479b8f (fix: more fixes) context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ======= <<<<<<< HEAD @@ -144,10 +158,14 @@ instance Data.Aeson.ToJSON ListExperimentGroupsInput where <<<<<<< HEAD <<<<<<< HEAD "group_type" Data.Aeson..= group_type a, +<<<<<<< HEAD <<<<<<< HEAD "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, ======= >>>>>>> 6e8749e1 (Test) +======= + "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, +>>>>>>> 82479b8f (fix: more fixes) "context" Data.Aeson..= context a ======= <<<<<<< HEAD @@ -185,11 +203,17 @@ instance Data.Aeson.FromJSON ListExperimentGroupsInput where <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") ======= >>>>>>> 6e8749e1 (Test) +======= + Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") +>>>>>>> 82479b8f (fix: more fixes) Control.Applicative.<*> (v Data.Aeson..:? "context") ======= <<<<<<< HEAD @@ -221,10 +245,14 @@ data ListExperimentGroupsInputBuilderState = ListExperimentGroupsInputBuilderSta <<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +>>>>>>> 82479b8f (fix: more fixes) contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ======= <<<<<<< HEAD @@ -260,10 +288,14 @@ defaultBuilderState = ListExperimentGroupsInputBuilderState { <<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategyBuilderState = Data.Maybe.Nothing, ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategyBuilderState = Data.Maybe.Nothing, +>>>>>>> 82479b8f (fix: more fixes) contextBuilderState = Data.Maybe.Nothing ======= <<<<<<< HEAD @@ -334,6 +366,7 @@ setGroupType value = <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -342,12 +375,19 @@ setGroupType value = >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +======= +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> ListExperimentGroupsInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> ListExperimentGroupsInputBuilder () setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) @@ -377,11 +417,17 @@ build builder = do <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) +>>>>>>> 82479b8f (fix: more fixes) context' <- Data.Either.Right (contextBuilderState st) ======= <<<<<<< HEAD @@ -409,10 +455,14 @@ build builder = do <<<<<<< HEAD <<<<<<< HEAD group_type = group_type', +<<<<<<< HEAD <<<<<<< HEAD dimension_match_strategy = dimension_match_strategy', ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategy = dimension_match_strategy', +>>>>>>> 82479b8f (fix: more fixes) context = context' ======= <<<<<<< HEAD @@ -447,6 +497,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -455,6 +506,8 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) Io.Superposition.Utility.serQuery "sort_on" (sort_on self) Io.Superposition.Utility.serQuery "name" (name self) @@ -475,7 +528,17 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) + Io.Superposition.Utility.serQuery "sort_on" (sort_on self) + Io.Superposition.Utility.serQuery "name" (name self) + Io.Superposition.Utility.serQuery "page" (page self) + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs index 5ef49fff3..14af56077 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs @@ -362,6 +362,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serQuery "status" (status self) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -374,11 +375,19 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs index d60415e79..5c5c27552 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs @@ -4,6 +4,7 @@ module Io.Superposition.Model.ListExperimentOutput ( setData', <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD setLastModified, ======= @@ -16,11 +17,19 @@ module Io.Superposition.Model.ListExperimentOutput ( setLastModified, >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) setLastModified, ======= setLastModifiedAt, >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + setLastModified, +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) build, ListExperimentOutputBuilder, ListExperimentOutput, @@ -29,6 +38,7 @@ module Io.Superposition.Model.ListExperimentOutput ( <<<<<<< HEAD <<<<<<< HEAD data', +<<<<<<< HEAD <<<<<<< HEAD last_modified ======= @@ -47,7 +57,13 @@ module Io.Superposition.Model.ListExperimentOutput ( ======= last_modified_at >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + last_modified +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -71,6 +87,7 @@ data ListExperimentOutput = ListExperimentOutput { <<<<<<< HEAD <<<<<<< HEAD data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, +<<<<<<< HEAD <<<<<<< HEAD last_modified :: Data.Time.UTCTime ======= @@ -89,7 +106,13 @@ data ListExperimentOutput = ListExperimentOutput { ======= last_modified_at :: Data.Time.UTCTime >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + last_modified :: Data.Time.UTCTime +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -103,6 +126,7 @@ instance Data.Aeson.ToJSON ListExperimentOutput where <<<<<<< HEAD <<<<<<< HEAD "data" Data.Aeson..= data' a, +<<<<<<< HEAD <<<<<<< HEAD "last_modified" Data.Aeson..= last_modified a ======= @@ -121,7 +145,13 @@ instance Data.Aeson.ToJSON ListExperimentOutput where ======= "last_modified_at" Data.Aeson..= last_modified_at a >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + "last_modified" Data.Aeson..= last_modified a +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) ] @@ -134,6 +164,7 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Control.Applicative.<*> (v Data.Aeson..: "data") <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..: "last_modified") ======= @@ -146,11 +177,19 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Control.Applicative.<*> (v Data.Aeson..: "last_modified") >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) Control.Applicative.<*> (v Data.Aeson..: "last_modified") ======= Control.Applicative.<*> (v Data.Aeson..: "last_modified_at") >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + Control.Applicative.<*> (v Data.Aeson..: "last_modified") +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) @@ -161,6 +200,7 @@ data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { <<<<<<< HEAD <<<<<<< HEAD data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), +<<<<<<< HEAD <<<<<<< HEAD last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime ======= @@ -179,7 +219,13 @@ data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { ======= last_modified_atBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } deriving ( GHC.Generics.Generic ) @@ -191,6 +237,7 @@ defaultBuilderState = ListExperimentOutputBuilderState { <<<<<<< HEAD <<<<<<< HEAD data'BuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD <<<<<<< HEAD last_modifiedBuilderState = Data.Maybe.Nothing ======= @@ -209,7 +256,13 @@ defaultBuilderState = ListExperimentOutputBuilderState { ======= last_modified_atBuilderState = Data.Maybe.Nothing >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + last_modifiedBuilderState = Data.Maybe.Nothing +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } type ListExperimentOutputBuilder = Control.Monad.State.Strict.State ListExperimentOutputBuilderState @@ -229,6 +282,7 @@ setData' value = <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -237,6 +291,8 @@ setData' value = >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () setLastModified value = Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) @@ -245,6 +301,11 @@ setLastModifiedAt :: Data.Time.UTCTime -> ListExperimentOutputBuilder () setLastModifiedAt value = Control.Monad.State.Strict.modify (\s -> (s { last_modified_atBuilderState = Data.Maybe.Just value })) >>>>>>> 6e8749e1 (Test) +======= +setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () +setLastModified value = + Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) +>>>>>>> 82479b8f (fix: more fixes) <<<<<<< HEAD <<<<<<< HEAD @@ -262,16 +323,23 @@ build builder = do <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) ======= last_modified_at' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified_at is a required property.") Data.Either.Right (last_modified_atBuilderState st) >>>>>>> 6e8749e1 (Test) +======= + last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) +>>>>>>> 82479b8f (fix: more fixes) Data.Either.Right (ListExperimentOutput { total_pages = total_pages', total_items = total_items', data' = data'', +<<<<<<< HEAD <<<<<<< HEAD last_modified = last_modified' ======= @@ -298,7 +366,13 @@ build builder = do ======= last_modified_at = last_modified_at' >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + last_modified = last_modified' +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) }) @@ -324,6 +398,7 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where total_pages = var2, total_items = var3, data' = var1, +<<<<<<< HEAD <<<<<<< HEAD last_modified = var0 <<<<<<< HEAD @@ -338,6 +413,12 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where ======= last_modified_at = var0 >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + last_modified = var0 +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java index 5b4fbda9a..b7041159b 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java @@ -1819,12 +1819,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); - private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); + private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index 68d29ac8e..dfd7562ef 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -274,6 +274,7 @@ final class SuperpositionAsyncClientImpl extends Client implements Superposition private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -284,11 +285,17 @@ final class SuperpositionAsyncClientImpl extends Client implements Superposition >>>>>>> 0dd5da56 (fix: some fixes) ======= ======= +>>>>>>> de718464 (fix: more fixes) +======= <<<<<<< HEAD ======= .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) >>>>>>> 6e8749e1 (Test) +======= + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) +>>>>>>> 82479b8f (fix: more fixes) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) >>>>>>> 5f8110af (Test) >>>>>>> c1293812 (Test) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java index f18a231d0..d40ed4e31 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java @@ -1818,12 +1818,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); - private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); + private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index 67d555297..593169f02 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -274,6 +274,7 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClien private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -284,11 +285,17 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClien >>>>>>> 0dd5da56 (fix: some fixes) ======= ======= +>>>>>>> de718464 (fix: more fixes) +======= <<<<<<< HEAD ======= .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) >>>>>>> 6e8749e1 (Test) +======= + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) +>>>>>>> 82479b8f (fix: more fixes) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) >>>>>>> 5f8110af (Test) >>>>>>> c1293812 (Test) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java index 2d35d6909..dace1d25a 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java @@ -40,6 +40,7 @@ public final class GetConfigInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, +<<<<<<< HEAD <<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) ======= @@ -57,7 +58,13 @@ public final class GetConfigInput implements SerializableStruct { ======= new HttpHeaderTrait("If-Modified-Since")) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java index ea07c9895..d09080ae8 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java @@ -42,6 +42,7 @@ public final class ListExperimentGroupsInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, +<<<<<<< HEAD <<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) ======= @@ -59,7 +60,13 @@ public final class ListExperimentGroupsInput implements SerializableStruct { ======= new HttpHeaderTrait("If-Modified-Since")) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) .putMember("name", PreludeSchemas.STRING, new HttpQueryTrait("name")) .putMember("created_by", PreludeSchemas.STRING, @@ -75,12 +82,19 @@ >>>>>>> c1293812 (Test) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) ======= >>>>>>> 6e8749e1 (Test) +======= + .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, + new HttpQueryTrait("dimension_match_strategy")) +>>>>>>> 82479b8f (fix: more fixes) .putMember("context", SharedSchemas.CONTEXT_MAP) ======= <<<<<<< HEAD @@ -112,11 +126,17 @@ >>>>>>> c1293812 (Test) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); ======= >>>>>>> 6e8749e1 (Test) +======= + private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); +>>>>>>> 82479b8f (fix: more fixes) private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); ======= <<<<<<< HEAD @@ -145,11 +165,17 @@ >>>>>>> c1293812 (Test) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) private final transient DimensionMatchStrategy dimensionMatchStrategy; ======= >>>>>>> 6e8749e1 (Test) +======= + private final transient DimensionMatchStrategy dimensionMatchStrategy; +>>>>>>> 82479b8f (fix: more fixes) private final transient Map context; ======= <<<<<<< HEAD @@ -179,11 +205,17 @@ private ListExperimentGroupsInput(Builder builder) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) this.dimensionMatchStrategy = builder.dimensionMatchStrategy; ======= >>>>>>> 6e8749e1 (Test) +======= + this.dimensionMatchStrategy = builder.dimensionMatchStrategy; +>>>>>>> 82479b8f (fix: more fixes) this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); ======= <<<<<<< HEAD @@ -288,6 +320,7 @@ public boolean hasGroupType() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -296,12 +329,19 @@ public boolean hasGroupType() { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +======= +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) public Map context() { if (context == null) { return Collections.emptyMap(); @@ -348,10 +388,14 @@ public boolean equals(Object other) { <<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.groupType, that.groupType) +<<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) ======= >>>>>>> 6e8749e1 (Test) +======= + && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) +>>>>>>> 82479b8f (fix: more fixes) && Objects.equals(this.context, that.context); ======= <<<<<<< HEAD @@ -373,6 +417,7 @@ public boolean equals(Object other) { public int hashCode() { <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ======= @@ -386,11 +431,19 @@ public int hashCode() { return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ======= return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, context); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } @Override @@ -435,6 +488,7 @@ public void serializeMembers(ShapeSerializer serializer) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -443,11 +497,18 @@ public void serializeMembers(ShapeSerializer serializer) { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } ======= >>>>>>> 6e8749e1 (Test) +======= + if (dimensionMatchStrategy != null) { + serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); + } +>>>>>>> 82479b8f (fix: more fixes) if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } @@ -490,6 +551,7 @@ public T getMemberValue(Schema member) { case 9 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, sortOn); case 10 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); case 11 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); +<<<<<<< HEAD <<<<<<< HEAD case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); @@ -505,7 +567,14 @@ public T getMemberValue(Schema member) { ======= case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); + case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -534,11 +603,17 @@ public Builder toBuilder() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) builder.dimensionMatchStrategy(this.dimensionMatchStrategy); ======= >>>>>>> 6e8749e1 (Test) +======= + builder.dimensionMatchStrategy(this.dimensionMatchStrategy); +>>>>>>> 82479b8f (fix: more fixes) builder.context(this.context); ======= <<<<<<< HEAD @@ -581,11 +656,17 @@ public static final class Builder implements ShapeBuilder>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) private DimensionMatchStrategy dimensionMatchStrategy; ======= >>>>>>> 6e8749e1 (Test) +======= + private DimensionMatchStrategy dimensionMatchStrategy; +>>>>>>> 82479b8f (fix: more fixes) private Map context; ======= <<<<<<< HEAD @@ -740,6 +821,9 @@ public Builder groupType(List groupType) { * @return this builder. */ <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 82479b8f (fix: more fixes) public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrategy) { this.dimensionMatchStrategy = dimensionMatchStrategy; return this; @@ -748,8 +832,11 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat /** * @return this builder. */ +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) public Builder context(Map context) { this.context = context; return this; @@ -798,6 +885,7 @@ public void setMemberValue(Schema member, Object value) { case 9 -> sortOn((ExperimentGroupSortOn) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, value)); case 10 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); case 11 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); +<<<<<<< HEAD <<<<<<< HEAD case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); @@ -813,7 +901,14 @@ public void setMemberValue(Schema member, Object value) { ======= case 12 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); + case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -876,6 +971,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 9 -> builder.sortOn(ExperimentGroupSortOn.builder().deserializeMember(de, member).build()); case 10 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); case 11 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); +<<<<<<< HEAD <<<<<<< HEAD case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); @@ -891,7 +987,14 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { ======= case 12 -> builder.context(SharedSerde.deserializeContextMap(member, de)); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); + case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java index 5c2527b47..bc6fb45db 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java @@ -42,6 +42,7 @@ public final class ListExperimentInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, +<<<<<<< HEAD <<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) ======= @@ -59,7 +60,13 @@ public final class ListExperimentInput implements SerializableStruct { ======= new HttpHeaderTrait("If-Modified-Since")) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + new HttpHeaderTrait("if-modified-since")) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) .putMember("status", SharedSchemas.EXPERIMENT_STATUS_TYPE_LIST, new HttpQueryTrait("status")) .putMember("from_date", SharedSchemas.DATE_TIME, diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java index 3cdd8335f..f79e166fc 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java @@ -33,12 +33,18 @@ public final class ListExperimentOutput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) .putMember("last_modified", SharedSchemas.DATE_TIME, ======= .putMember("last_modified_at", SharedSchemas.DATE_TIME, >>>>>>> 6e8749e1 (Test) +======= + .putMember("last_modified", SharedSchemas.DATE_TIME, +>>>>>>> 82479b8f (fix: more fixes) new HttpHeaderTrait("last-modified"), new RequiredTrait()) ======= @@ -61,6 +67,7 @@ >>>>>>> c1293812 (Test) private static final Schema $SCHEMA_DATA = $SCHEMA.member("data"); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ======= @@ -73,17 +80,26 @@ >>>>>>> c1293812 (Test) private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ======= private static final Schema $SCHEMA_LAST_MODIFIED_AT = $SCHEMA.member("last_modified_at"); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) private final transient int totalPages; private final transient int totalItems; private final transient List data; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private final transient Instant lastModified; ======= @@ -96,11 +112,19 @@ >>>>>>> c1293812 (Test) private final transient Instant lastModified; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) private final transient Instant lastModified; ======= private final transient Instant lastModifiedAt; >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + private final transient Instant lastModified; +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) private ListExperimentOutput(Builder builder) { this.totalPages = builder.totalPages; @@ -108,6 +132,7 @@ private ListExperimentOutput(Builder builder) { this.data = Collections.unmodifiableList(builder.data); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD this.lastModified = builder.lastModified; ======= @@ -120,11 +145,19 @@ private ListExperimentOutput(Builder builder) { this.lastModified = builder.lastModified; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) this.lastModified = builder.lastModified; ======= this.lastModifiedAt = builder.lastModifiedAt; >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + this.lastModified = builder.lastModified; +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } public int totalPages() { @@ -146,6 +179,7 @@ public boolean hasData() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -154,12 +188,18 @@ public boolean hasData() { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) public Instant lastModified() { return lastModified; ======= public Instant lastModifiedAt() { return lastModifiedAt; >>>>>>> 6e8749e1 (Test) +======= + public Instant lastModified() { + return lastModified; +>>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD @@ -188,6 +228,7 @@ public boolean equals(Object other) { <<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.data, that.data) +<<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.lastModified, that.lastModified); ======= @@ -206,13 +247,20 @@ public boolean equals(Object other) { ======= && Objects.equals(this.lastModifiedAt, that.lastModifiedAt); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + && Objects.equals(this.lastModified, that.lastModified); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } @Override public int hashCode() { <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(totalPages, totalItems, data, lastModified); ======= @@ -226,11 +274,19 @@ public int hashCode() { return Objects.hash(totalPages, totalItems, data, lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) return Objects.hash(totalPages, totalItems, data, lastModified); ======= return Objects.hash(totalPages, totalItems, data, lastModifiedAt); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + return Objects.hash(totalPages, totalItems, data, lastModified); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } @Override @@ -245,6 +301,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeList($SCHEMA_DATA, data, data.size(), SharedSerde.ExperimentListSerializer.INSTANCE); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ======= @@ -257,11 +314,19 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ======= serializer.writeTimestamp($SCHEMA_LAST_MODIFIED_AT, lastModifiedAt); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } @Override @@ -273,6 +338,7 @@ public T getMemberValue(Schema member) { case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_DATA, member, data); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ======= @@ -285,11 +351,19 @@ public T getMemberValue(Schema member) { case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ======= case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_AT, member, lastModifiedAt); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -308,6 +382,7 @@ public Builder toBuilder() { builder.data(this.data); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD builder.lastModified(this.lastModified); ======= @@ -320,11 +395,19 @@ public Builder toBuilder() { builder.lastModified(this.lastModified); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) builder.lastModified(this.lastModified); ======= builder.lastModifiedAt(this.lastModifiedAt); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + builder.lastModified(this.lastModified); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) return builder; } @@ -345,6 +428,7 @@ public static final class Builder implements ShapeBuilder private List data; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private Instant lastModified; ======= @@ -357,11 +441,19 @@ public static final class Builder implements ShapeBuilder private Instant lastModified; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) private Instant lastModified; ======= private Instant lastModifiedAt; >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + private Instant lastModified; +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) private Builder() {} @@ -412,6 +504,7 @@ public Builder data(List data) { *

Required * @return this builder. */ +<<<<<<< HEAD <<<<<<< HEAD public Builder lastModified(Instant lastModified) { this.lastModified = Objects.requireNonNull(lastModified, "lastModified cannot be null"); @@ -421,6 +514,11 @@ public Builder lastModifiedAt(Instant lastModifiedAt) { this.lastModifiedAt = Objects.requireNonNull(lastModifiedAt, "lastModifiedAt cannot be null"); tracker.setMember($SCHEMA_LAST_MODIFIED_AT); >>>>>>> 6e8749e1 (Test) +======= + public Builder lastModified(Instant lastModified) { + this.lastModified = Objects.requireNonNull(lastModified, "lastModified cannot be null"); + tracker.setMember($SCHEMA_LAST_MODIFIED); +>>>>>>> 82479b8f (fix: more fixes) return this; } @@ -446,6 +544,7 @@ public void setMemberValue(Schema member, Object value) { case 2 -> data((List) SchemaUtils.validateSameMember($SCHEMA_DATA, member, value)); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ======= @@ -458,11 +557,19 @@ public void setMemberValue(Schema member, Object value) { case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ======= case 3 -> lastModifiedAt((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_AT, member, value)); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -484,14 +591,21 @@ public ShapeBuilder errorCorrection() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { lastModified(Instant.EPOCH); ======= if (!tracker.checkMember($SCHEMA_LAST_MODIFIED_AT)) { lastModifiedAt(Instant.EPOCH); >>>>>>> 6e8749e1 (Test) +======= + if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { + lastModified(Instant.EPOCH); +>>>>>>> 82479b8f (fix: more fixes) } ======= <<<<<<< HEAD @@ -532,6 +646,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 2 -> builder.data(SharedSerde.deserializeExperimentList(member, de)); <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> builder.lastModified(de.readTimestamp(member)); ======= @@ -544,11 +659,19 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 3 -> builder.lastModified(de.readTimestamp(member)); >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) case 3 -> builder.lastModified(de.readTimestamp(member)); ======= case 3 -> builder.lastModifiedAt(de.readTimestamp(member)); >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + case 3 -> builder.lastModified(de.readTimestamp(member)); +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts index e82f5357a..f91c5bbe6 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts @@ -123,6 +123,7 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // ], <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD * // last_modified: new Date("TIMESTAMP"), // required ======= @@ -135,11 +136,19 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // last_modified: new Date("TIMESTAMP"), // required >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) * // last_modified: new Date("TIMESTAMP"), // required ======= * // last_modified_at: new Date("TIMESTAMP"), // required >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + * // last_modified: new Date("TIMESTAMP"), // required +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts index 0097e96ae..f29bee33a 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts @@ -60,6 +60,7 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -68,9 +69,14 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) * dimension_match_strategy: "exact" || "subset", ======= >>>>>>> 6e8749e1 (Test) +======= + * dimension_match_strategy: "exact" || "subset", +>>>>>>> 82479b8f (fix: more fixes) * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index 351a80e39..b67a66216 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -2029,14 +2029,20 @@ export interface ListExperimentGroupsInput { /** <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 82479b8f (fix: more fixes) * Strategy to follow while filter items based on the context * @public */ dimension_match_strategy?: DimensionMatchStrategy | undefined; /** +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) * Map representing the context. * Keys correspond to the names of the dimensions. * @public @@ -2187,6 +2193,7 @@ export interface ListExperimentOutput { data: (ExperimentResponse)[] | undefined; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD last_modified: Date | undefined; ======= @@ -2199,11 +2206,19 @@ export interface ListExperimentOutput { last_modified: Date | undefined; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) last_modified: Date | undefined; ======= last_modified_at: Date | undefined; >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + last_modified: Date | undefined; +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index 12d465fc6..396af267f 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -4119,6 +4119,7 @@ export const de_ListExperimentCommand = async( $metadata: deserializeMetadata(output), <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ======= @@ -4131,11 +4132,19 @@ export const de_ListExperimentCommand = async( [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ======= [_lma]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) }); const data: Record = __expectNonNull((__expectObject(await parseBody(output.body, context))), "body"); const doc = take(data, { @@ -6247,7 +6256,6 @@ const de_CommandError = async( const _ims_ = "if-modified-since"; const _lm = "last-modified"; const _lm_ = "last_modified"; - const _lma = "last_modified_at"; const _lmb = "last_modified_by"; const _ms = "merge_strategy"; const _n = "name"; diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index 885fe5ef7..9c06110f0 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -1729,11 +1729,15 @@ "target": DATE_TIME, "index": 4, "traits": [ +<<<<<<< HEAD <<<<<<< HEAD Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), ======= Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), >>>>>>> 6e8749e1 (Test) +======= + Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), +>>>>>>> 82479b8f (fix: more fixes) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -10053,11 +10057,15 @@ "target": DATE_TIME, "index": 5, "traits": [ +<<<<<<< HEAD <<<<<<< HEAD Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), ======= Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), >>>>>>> 6e8749e1 (Test) +======= + Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), +>>>>>>> 82479b8f (fix: more fixes) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -10128,6 +10136,7 @@ <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, @@ -10139,13 +10148,27 @@ >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 12, ======= +======= + "dimension_match_strategy": { + "target": DIMENSION_MATCH_STRATEGY, + "index": 12, + "traits": [ + Trait.new(id=ShapeID("smithy.api#notProperty")), + Trait.new(id=ShapeID("smithy.api#httpQuery"), value="dimension_match_strategy"), + + ], + }, + +>>>>>>> 82479b8f (fix: more fixes) "context": { "target": CONTEXT_MAP, - "index": 12, + "index": 13, "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), @@ -11051,11 +11074,15 @@ "target": DATE_TIME, "index": 5, "traits": [ +<<<<<<< HEAD <<<<<<< HEAD Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), ======= Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), >>>>>>> 6e8749e1 (Test) +======= + Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), +>>>>>>> 82479b8f (fix: more fixes) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -11245,6 +11272,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -11253,10 +11281,15 @@ >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) "last_modified": { ======= "last_modified_at": { >>>>>>> 6e8749e1 (Test) +======= + "last_modified": { +>>>>>>> 82479b8f (fix: more fixes) "target": DATE_TIME, "index": 3, "traits": [ diff --git a/clients/python/sdk/superposition_sdk/deserialize.py b/clients/python/sdk/superposition_sdk/deserialize.py index ce6f0b5fc..e2843601c 100644 --- a/clients/python/sdk/superposition_sdk/deserialize.py +++ b/clients/python/sdk/superposition_sdk/deserialize.py @@ -1551,11 +1551,15 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf _key_lowercase = key.lower() match _key_lowercase: case "last-modified": +<<<<<<< HEAD <<<<<<< HEAD kwargs["last_modified"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) ======= kwargs["last_modified_at"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) >>>>>>> 6e8749e1 (Test) +======= + kwargs["last_modified"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) +>>>>>>> 82479b8f (fix: more fixes) case _: pass diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 1696e2f56..1cd90bb20 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -10193,6 +10193,7 @@ class ListExperimentGroupsInput: <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -10201,11 +10202,18 @@ class ListExperimentGroupsInput: >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) :param dimension_match_strategy: Strategy to follow while filter items based on the context ======= >>>>>>> 6e8749e1 (Test) +======= + :param dimension_match_strategy: + Strategy to follow while filter items based on the context + +>>>>>>> 82479b8f (fix: more fixes) :param context: Map representing the context. Keys correspond to the names of the dimensions. @@ -10233,11 +10241,17 @@ class ListExperimentGroupsInput: <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) dimension_match_strategy: str | None = None ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategy: str | None = None +>>>>>>> 82479b8f (fix: more fixes) context: dict[str, Document] | None = None ======= <<<<<<< HEAD @@ -10313,12 +10327,18 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 12: +<<<<<<< HEAD <<<<<<< HEAD kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) case 13: ======= >>>>>>> 6e8749e1 (Test) +======= + kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) + + case 13: +>>>>>>> 82479b8f (fix: more fixes) kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["context"]) <<<<<<< HEAD @@ -11178,12 +11198,18 @@ class ListExperimentOutput: <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) last_modified: datetime ======= last_modified_at: datetime >>>>>>> 6e8749e1 (Test) +======= + last_modified: datetime +>>>>>>> 82479b8f (fix: more fixes) ======= <<<<<<< HEAD @@ -11226,11 +11252,15 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: <<<<<<< HEAD <<<<<<< HEAD case 3: +<<<<<<< HEAD <<<<<<< HEAD kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) ======= kwargs["last_modified_at"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified_at"]) >>>>>>> 6e8749e1 (Test) +======= + kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) +>>>>>>> 82479b8f (fix: more fixes) ======= <<<<<<< HEAD diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index b9435a1b3..bfd5839b4 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1058,6 +1058,7 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: +<<<<<<< HEAD <<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ======= @@ -1075,7 +1076,13 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe ======= headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) return _HTTPRequest( destination=_URI( host="", @@ -2058,6 +2065,7 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: +<<<<<<< HEAD <<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ======= @@ -2075,7 +2083,13 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) ======= headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) return _HTTPRequest( destination=_URI( host="", @@ -2139,6 +2153,7 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: +<<<<<<< HEAD <<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ======= @@ -2156,7 +2171,13 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co ======= headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) return _HTTPRequest( destination=_URI( host="", diff --git a/crates/superposition_sdk/src/client/list_experiment.rs b/crates/superposition_sdk/src/client/list_experiment.rs index f4553b857..0a9c293e9 100644 --- a/crates/superposition_sdk/src/client/list_experiment.rs +++ b/crates/superposition_sdk/src/client/list_experiment.rs @@ -31,6 +31,7 @@ impl super::Client { /// - [`data(Vec::)`](crate::operation::list_experiment::ListExperimentOutput::data): (undocumented) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ======= @@ -43,11 +44,19 @@ impl super::Client { /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ======= /// - [`last_modified_at(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified_at): (undocumented) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) /// - On failure, responds with [`SdkError`](crate::operation::list_experiment::ListExperimentError) pub fn list_experiment(&self) -> crate::operation::list_experiment::builders::ListExperimentFluentBuilder { crate::operation::list_experiment::builders::ListExperimentFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/list_experiment_groups.rs b/crates/superposition_sdk/src/client/list_experiment_groups.rs index 23ed34fb6..e68474d73 100644 --- a/crates/superposition_sdk/src/client/list_experiment_groups.rs +++ b/crates/superposition_sdk/src/client/list_experiment_groups.rs @@ -18,11 +18,17 @@ impl super::Client { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
======= >>>>>>> 6e8749e1 (Test) +======= + /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+>>>>>>> 82479b8f (fix: more fixes) /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
======= <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs index f8fe0fd07..5b8467e57 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs @@ -12,6 +12,7 @@ pub struct ListExperimentOutput { <<<<<<< HEAD <<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model +<<<<<<< HEAD <<<<<<< HEAD pub last_modified: ::aws_smithy_types::DateTime, ======= @@ -29,7 +30,13 @@ pub struct ListExperimentOutput { ======= pub last_modified_at: ::aws_smithy_types::DateTime, >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + pub last_modified: ::aws_smithy_types::DateTime, +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } impl ListExperimentOutput { #[allow(missing_docs)] // documentation missing in model @@ -53,6 +60,7 @@ impl ListExperimentOutput { ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model +<<<<<<< HEAD <<<<<<< HEAD pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { &self.last_modified @@ -60,6 +68,10 @@ impl ListExperimentOutput { pub fn last_modified_at(&self) -> &::aws_smithy_types::DateTime { &self.last_modified_at >>>>>>> 6e8749e1 (Test) +======= + pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { + &self.last_modified +>>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD @@ -85,6 +97,7 @@ pub struct ListExperimentOutputBuilder { pub(crate) data: ::std::option::Option<::std::vec::Vec::>, <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ======= @@ -97,11 +110,19 @@ pub struct ListExperimentOutputBuilder { pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ======= pub(crate) last_modified_at: ::std::option::Option<::aws_smithy_types::DateTime>, >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) } impl ListExperimentOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -160,6 +181,7 @@ impl ListExperimentOutputBuilder { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model /// This field is required. +<<<<<<< HEAD <<<<<<< HEAD pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { self.last_modified = ::std::option::Option::Some(input); @@ -175,16 +197,25 @@ impl ListExperimentOutputBuilder { ======= pub fn last_modified_at(mut self, input: ::aws_smithy_types::DateTime) -> Self { self.last_modified_at = ::std::option::Option::Some(input); +======= + pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { + self.last_modified = ::std::option::Option::Some(input); +>>>>>>> 82479b8f (fix: more fixes) self } #[allow(missing_docs)] // documentation missing in model - pub fn set_last_modified_at(mut self, input: ::std::option::Option<::aws_smithy_types::DateTime>) -> Self { - self.last_modified_at = input; self + pub fn set_last_modified(mut self, input: ::std::option::Option<::aws_smithy_types::DateTime>) -> Self { + self.last_modified = input; self } #[allow(missing_docs)] // documentation missing in model +<<<<<<< HEAD pub fn get_last_modified_at(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { &self.last_modified_at >>>>>>> 6e8749e1 (Test) +======= + pub fn get_last_modified(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { + &self.last_modified +>>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD @@ -200,6 +231,7 @@ impl ListExperimentOutputBuilder { /// - [`data`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::data) <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ======= @@ -212,11 +244,19 @@ impl ListExperimentOutputBuilder { /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ======= /// - [`last_modified_at`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified_at) >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= + /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::list_experiment::ListExperimentOutput { @@ -238,6 +278,7 @@ impl ListExperimentOutputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -246,6 +287,8 @@ impl ListExperimentOutputBuilder { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) last_modified: self.last_modified .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") @@ -254,6 +297,11 @@ impl ListExperimentOutputBuilder { .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified_at", "last_modified_at was not specified but it is required when building ListExperimentOutput") >>>>>>> 6e8749e1 (Test) +======= + last_modified: self.last_modified + .ok_or_else(|| + ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") +>>>>>>> 82479b8f (fix: more fixes) )? , <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs index bf4929fd3..1517e73fe 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs @@ -30,6 +30,7 @@ pub struct ListExperimentGroupsInput { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -38,10 +39,16 @@ pub struct ListExperimentGroupsInput { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, ======= >>>>>>> 6e8749e1 (Test) +======= + /// Strategy to follow while filter items based on the context + pub dimension_match_strategy: ::std::option::Option, +>>>>>>> 82479b8f (fix: more fixes) /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, <<<<<<< HEAD @@ -107,6 +114,7 @@ impl ListExperimentGroupsInput { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -115,12 +123,19 @@ impl ListExperimentGroupsInput { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +======= +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) /// Map representing the context. Keys correspond to the names of the dimensions. pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() @@ -159,11 +174,17 @@ pub struct ListExperimentGroupsInputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) pub(crate) dimension_match_strategy: ::std::option::Option, ======= >>>>>>> 6e8749e1 (Test) +======= + pub(crate) dimension_match_strategy: ::std::option::Option, +>>>>>>> 82479b8f (fix: more fixes) pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, ======= <<<<<<< HEAD @@ -345,6 +366,7 @@ impl ListExperimentGroupsInputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -353,6 +375,10 @@ impl ListExperimentGroupsInputBuilder { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +======= +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -366,8 +392,11 @@ impl ListExperimentGroupsInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). @@ -425,6 +454,7 @@ impl ListExperimentGroupsInputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -433,10 +463,16 @@ impl ListExperimentGroupsInputBuilder { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) dimension_match_strategy: self.dimension_match_strategy , ======= >>>>>>> 6e8749e1 (Test) +======= + dimension_match_strategy: self.dimension_match_strategy + , +>>>>>>> 82479b8f (fix: more fixes) context: self.context , <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs index 564162a6e..0006f65e2 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs @@ -272,6 +272,7 @@ impl ListExperimentGroupsFluentBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -280,6 +281,10 @@ impl ListExperimentGroupsFluentBuilder { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +======= +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -294,8 +299,11 @@ impl ListExperimentGroupsFluentBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { self.inner.get_dimension_match_strategy() } +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) /// /// Adds a key-value pair to `context`. /// diff --git a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs index 95c848dff..a828f9429 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs @@ -95,11 +95,15 @@ pub fn ser_get_config_headers( err )) })?; +<<<<<<< HEAD <<<<<<< HEAD builder = builder.header("if-modified-since", header_value); ======= builder = builder.header("If-Modified-Since", header_value); >>>>>>> 6e8749e1 (Test) +======= + builder = builder.header("if-modified-since", header_value); +>>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs index 4bfa2f535..0d440c863 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs @@ -40,6 +40,7 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -48,6 +49,8 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) output = output.set_last_modified( crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? @@ -56,6 +59,11 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers crate::protocol_serde::shape_list_experiment_output::de_last_modified_at_header(_response_headers) .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified_at from header `last-modified"))? >>>>>>> 6e8749e1 (Test) +======= + output = output.set_last_modified( + crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) + .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? +>>>>>>> 82479b8f (fix: more fixes) ); <<<<<<< HEAD <<<<<<< HEAD @@ -114,11 +122,15 @@ pub fn ser_list_experiment_headers( err )) })?; +<<<<<<< HEAD <<<<<<< HEAD builder = builder.header("if-modified-since", header_value); ======= builder = builder.header("If-Modified-Since", header_value); >>>>>>> 6e8749e1 (Test) +======= + builder = builder.header("if-modified-since", header_value); +>>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs index 7114c8742..cd15527af 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs @@ -91,11 +91,15 @@ pub fn ser_list_experiment_groups_headers( err )) })?; +<<<<<<< HEAD <<<<<<< HEAD builder = builder.header("if-modified-since", header_value); ======= builder = builder.header("If-Modified-Since", header_value); >>>>>>> 6e8749e1 (Test) +======= + builder = builder.header("if-modified-since", header_value); +>>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs index 03c017937..24a38b1ff 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs @@ -1,9 +1,13 @@ // Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. <<<<<<< HEAD +<<<<<<< HEAD pub(crate) fn de_last_modified_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { ======= pub(crate) fn de_last_modified_at_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { >>>>>>> 6e8749e1 (Test) +======= +pub(crate) fn de_last_modified_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { +>>>>>>> 82479b8f (fix: more fixes) let headers = header_map.get_all("last-modified"); let var_1: Vec<::aws_smithy_types::DateTime> = ::aws_smithy_http::header::many_dates(headers, ::aws_smithy_types::date_time::Format::DateTimeWithOffset)? ; diff --git a/crates/superposition_sdk/src/serde_util.rs b/crates/superposition_sdk/src/serde_util.rs index e7131dfb2..22ad1c00a 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -594,6 +594,7 @@ if builder.data.is_none() { builder.data = Some(Default::default()) } <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ======= <<<<<<< HEAD @@ -605,11 +606,19 @@ if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_t if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ======= if builder.last_modified_at.is_none() { builder.last_modified_at = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= +if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) builder } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index 395c036a4..d98cbc9cf 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -19,10 +19,13 @@ pub use crate::types::_bucket::Bucket; <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) pub use crate::types::_experiment_response::ExperimentResponse; pub use crate::types::_variant::Variant; @@ -47,6 +50,10 @@ pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; ======= >>>>>>> 6e8749e1 (Test) +======= +pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; + +>>>>>>> 82479b8f (fix: more fixes) pub use crate::types::_experiment_group_sort_on::ExperimentGroupSortOn; pub use crate::types::_version::Version; @@ -108,8 +115,6 @@ pub use crate::types::_experiment_status_type::ExperimentStatusType; pub use crate::types::_experiment_type::ExperimentType; -pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; - pub use crate::types::_experiment_sort_on::ExperimentSortOn; >>>>>>> 6e8749e1 (Test) diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 19b7c39b2..f4888e02f 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -173,6 +173,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -181,10 +182,15 @@ >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) "name": "if-modified-since", ======= "name": "If-Modified-Since", >>>>>>> 6e8749e1 (Test) +======= + "name": "if-modified-since", +>>>>>>> 82479b8f (fix: more fixes) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { @@ -2177,6 +2183,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -2185,6 +2192,10 @@ >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +======= +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -2194,9 +2205,12 @@ }, { "name": "if-modified-since", +<<<<<<< HEAD ======= "name": "If-Modified-Since", >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 82479b8f (fix: more fixes) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { @@ -2853,10 +2867,13 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) "name": "prefix", "in": "query", "style": "form", @@ -2880,6 +2897,9 @@ ======= "name": "If-Modified-Since", >>>>>>> 6e8749e1 (Test) +======= + "name": "if-modified-since", +>>>>>>> 82479b8f (fix: more fixes) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { diff --git a/docs/docs/api/get-config-json.api.mdx b/docs/docs/api/get-config-json.api.mdx index 37473835f..5f536abc3 100644 --- a/docs/docs/api/get-config-json.api.mdx +++ b/docs/docs/api/get-config-json.api.mdx @@ -48,7 +48,11 @@ Retrieves the full config in JSON format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config-toml.api.mdx b/docs/docs/api/get-config-toml.api.mdx index b552e1ba8..313ffc979 100644 --- a/docs/docs/api/get-config-toml.api.mdx +++ b/docs/docs/api/get-config-toml.api.mdx @@ -48,7 +48,11 @@ Retrieves the full config in TOML format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config.api.mdx b/docs/docs/api/get-config.api.mdx index 24602212d..4ae34e0b9 100644 --- a/docs/docs/api/get-config.api.mdx +++ b/docs/docs/api/get-config.api.mdx @@ -8,6 +8,7 @@ hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD api: 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 ======= <<<<<<< HEAD @@ -20,11 +21,19 @@ api: eJztWEtv2zgQ/iuETruAnWbbzaW3NA3SYFs4cBzsIWsYtDSy2EiklqQSG4b/+86QEi3ZUpo+Fui api: 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 >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= +======= +>>>>>>> de718464 (fix: more fixes) api: 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 ======= api: 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 >>>>>>> 6e8749e1 (Test) +<<<<<<< HEAD >>>>>>> c1293812 (Test) +======= +======= +api: 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 +>>>>>>> 82479b8f (fix: more fixes) +>>>>>>> de718464 (fix: more fixes) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null @@ -67,11 +76,15 @@ Retrieves config data with context evaluation, including applicable contexts, ov >>>>>> 0366c46c (Test) +======= + parameters={[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"version","in":"query","schema":{"type":"string"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} +>>>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/list-experiment-groups.api.mdx b/docs/docs/api/list-experiment-groups.api.mdx index 8f767bbae..f7859c2bc 100644 --- a/docs/docs/api/list-experiment-groups.api.mdx +++ b/docs/docs/api/list-experiment-groups.api.mdx @@ -8,12 +8,18 @@ hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) api: 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 ======= api: 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 >>>>>>> 6e8749e1 (Test) +======= +api: eJztWllv2zgQ/iuEnlrATtx289K3pPV2i922geNisegGBiWNbTaSqCWpJEbg/74zpG7Jiu2kfWqBHJbImW/uo3nwQtCBEqkRMvHeen8JbTSD+xSUiCExbKVkluoRuxNmzXSWplIZtpSKLUVk8FCyYjwJWcpXIuFE5MQbeRKv2w8fw5zmtKT4wRLEQwr+y0CbCxluvLcPXiATg6/pV56mkQgsgdPvmnA9eDpYQ8zpN7NJAalK/zsEBumkitgZAbokc2/6DvIwFESTR5f1K9tRSwefeMoUpAo04iEBzRpYTvfk3+RP2Gj8qPB9KlF0I+2BhMegmVzaDyGJqpGcJnUYYSJC8s7RQPredls97tPPzCnnXa6U7ZYupFwhE9Q6wv724BFHvB7ILCHxBGHHW2rjtSX6nMU+KAInDMSaIPuAMppMJRAykTDgwZqMCIS3o+vE3n8aWRSghExPhhFf4gnm2BJZpKkE3MKIacOVNcpSyZi9OgTu/jTrWHkUDUP9iCZXGZJxgmuGN1ju3KQFUs2IiVUibbRUkcIqe1od2UCy1uyVypcyAp78HP51Ddgfgyr43eYC5m86mcOGBXsB9zwwLOYG3QFzh858bQjNiIWQQhISMATk8+AGPzERpxEQEYvzZa86HIGfD6WumUABRx0v/M2++qHkkGn8/W4tWX7dPmyjPU7mA8jX5Yi4NotYhmIpjpeGiLCCyI+SaR8mdck0lquFTB4TCCKbx+m0JYq5PYuwEPqbYcyA6QRzcREihT9wysdNpeKj6yrlt9L9FfL9knSBP2YJuodOHKJyXnAdFN6rGB1znw4Knho9kiwv4rbcR1ikWFnXbVkrhCcaVF7xe01EonWxachk7bOwEA5wMDpPNcYF8YuvV9PZ4t1sej6fvidRr/65mk8/LT5MP09n9MwJbDYWBCKP++TnSnGrW0qOQ4atc8PHbWZ1ga0l50Sn01E8VSAkiG4eyRD5UK6v6bTsNBY2pS1QAnTB1WOOk58ip1/KKJJ3GF0igryry+u5zzUGGTpArQE6xJuewqQwgE3XxBTzNDRi6H0h+ScSvGDWcDixHBcBONYiCUq/WwMPezqEvy28TLumT2DZfDP5jblGTwMT2OLkOZVjk6yUVCMSCStJAhAWDdAa62iEZzRQgTUQbcjyqLTgpugmS5IB2rRoGtfGpOWbEzZHAMSSSrlQYBNUzG8AS5ZCJ1pzw4JIYArBbpQn+BWQb9WJUz3nt1KELEsSCEBrrhAI9gcaYYNVOZLi+JVIlqUhgtWH5Itf+iJ91T3ufizVaizCjqPtUunWDUIEuBPb9+M7qW50ynscd3961/TESWhT3evJhH505772DMLwZKkcZOl4WxpU28rQ6h3PdsLBJ8806hlpeLSgzlV3m3+ar+z7doqv3qP59qkJJfd2dkN34Sqs3AdFzgJDzkYFE12sr/9piiDCXpXlaXCx5nrde8A5SM+LBsY+yhhsK1hgVOpdJ54+QM+K4Znm5KS4g/2ooI0Bp24utDrKebluHPmfMDtch7AUSW2IzmdrCs9bHuFcw3QKgVi6clqStSEeZ9inYFLBuaY1ejsc1jEUXy5FsEARAursV9D1j5EX83sRUxF6NZngJ5G4TxMkEAOdWVT2XYhQ799e2BioWsWeNEt9C70hH4WxQR5e7Y6/6bVcp+Hcm3Cn/+8j72c4EZl9xNwRrw119bK45WjHXa8bqeRbi1rjbq1JuLCg7eVa9/nsDV8LW6GqdrxV0dWK8dbo0Jgr67E1avXQYd+c0WPPXS47KiaXnpDYPa7MiprQifzzfE5YdqfvsgaddNRlE3EzX48a2f36sWWZI93clp311bmPeEJhMroCdQtqSi0JO2uWuWeqTjG1D6u+LF1b/fXA6ROGbvAVbf1qpmD5JvWajGvWklatqdQWCTdYN7zTyghjt8c9JfNQ9wBBhmlzY/eIOhZmvTnhqTihluqCaxGcZ0Th2zV1I+33gA2QKg9cV9SuSDVO+t00S3XQ805V/WM+v2T2NON4nBawTv9Fy2M3YfSenG8A2T5s7PEhPvaANRhZf1YtrKf3nPZCzYUznRPJUlrmxRScoQXQKiKnjVbWDsLryeuz8eTNeHJGkpDhYm4dLG/+yNFZ19qdEl+66zPt7nO1kUynacSFrZiZioiX86t67s39inIOeRY6w5pcEM88PNBk91VF2y09dnMouVsoNPcjivwljzQMCHTg2roX+Q1sajty2z7gZ4/8en8gh2yjB1Dka+8jQfygPfMAXrf6PhLuT9gJD0DPy9qTsR+0rx1ywHpFf15U++1dB7D1dAtHIxxepA6AqBa1R/Ledxf6GIbns9Axi8sBdI3O71glPWUlN4BtYAtZIb3Om3SfKiO1FsU247Cq8Gvp5JZ0A+bo23se6TEvZrlkL9kwz9rm68ezqu/FGtzcgbx3Hs+bwdJp56sb50EAqRk8W++zL79czfGwn//tQmw3857id/iQviMa+isI+18ldMA+o7VZssrsUOA5mvTvf9MKveQ= +>>>>>>> 82479b8f (fix: more fixes) sidebar_class_name: "post api-method" ======= <<<<<<< HEAD @@ -69,11 +75,15 @@ Lists experiment groups, with support for filtering and pagination. >>>>>> 0366c46c (Test) +======= + parameters={[{"name":"count","in":"query","description":"Number of items to be returned in each page.","schema":{"type":"number","description":"Number of items to be returned in each page."}},{"name":"page","in":"query","description":"Page number to retrieve, starting from 1.","schema":{"type":"number","description":"Page number to retrieve, starting from 1."}},{"name":"all","in":"query","description":"If true, returns all requested items, ignoring pagination parameters page and count.","schema":{"type":"boolean","description":"If true, returns all requested items, ignoring pagination parameters page and count."}},{"name":"name","in":"query","description":"Filter by experiment group name (exact match or substring, depending on backend implementation).","schema":{"type":"string","description":"Filter by experiment group name (exact match or substring, depending on backend implementation)."}},{"name":"created_by","in":"query","description":"Filter by the user who created the experiment group.","schema":{"type":"string","description":"Filter by the user who created the experiment group."}},{"name":"last_modified_by","in":"query","description":"Filter by the user who last modified the experiment group.","schema":{"type":"string","description":"Filter by the user who last modified the experiment group."}},{"name":"sort_on","in":"query","description":"Field to sort the results by.","schema":{"type":"string","enum":["name","created_at","last_modified_at"],"title":"ExperimentGroupSortOn"}},{"name":"sort_by","in":"query","description":"Sort order (ascending or descending).","schema":{"type":"string","description":"Sort order enumeration for list operations.","enum":["desc","asc"],"title":"SortBy"}},{"name":"group_type","in":"query","description":"Filter by the type of group (USER_CREATED or SYSTEM_GENERATED).","style":"form","schema":{"type":"array","items":{"type":"string","enum":["USER_CREATED","SYSTEM_GENERATED"],"title":"GroupType"},"description":"Filter by the type of group (USER_CREATED or SYSTEM_GENERATED)."},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} +>>>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/list-experiment.api.mdx b/docs/docs/api/list-experiment.api.mdx index 3e6e09873..531841d16 100644 --- a/docs/docs/api/list-experiment.api.mdx +++ b/docs/docs/api/list-experiment.api.mdx @@ -8,12 +8,18 @@ hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> de718464 (fix: more fixes) api: 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 ======= api: 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 >>>>>>> 6e8749e1 (Test) +======= +api: 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 +>>>>>>> 82479b8f (fix: more fixes) sidebar_class_name: "post api-method" ======= <<<<<<< HEAD @@ -69,11 +75,15 @@ Retrieves a paginated list of experiments with support for filtering by status, >>>>>> 0366c46c (Test) +======= + parameters={[{"name":"count","in":"query","description":"Number of items to be returned in each page.","schema":{"type":"number","description":"Number of items to be returned in each page."}},{"name":"page","in":"query","description":"Page number to retrieve, starting from 1.","schema":{"type":"number","description":"Page number to retrieve, starting from 1."}},{"name":"all","in":"query","description":"If true, returns all requested items, ignoring pagination parameters page and count.","schema":{"type":"boolean","description":"If true, returns all requested items, ignoring pagination parameters page and count."}},{"name":"status","in":"query","style":"form","schema":{"type":"array","items":{"type":"string","enum":["CREATED","CONCLUDED","INPROGRESS","DISCARDED","PAUSED"],"title":"ExperimentStatusType"}},"explode":true},{"name":"from_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"experiment_name","in":"query","schema":{"type":"string"}},{"name":"experiment_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"experiment_group_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"created_by","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"sort_on","in":"query","schema":{"type":"string","enum":["last_modified_at","created_at"],"title":"ExperimentSortOn"}},{"name":"sort_by","in":"query","description":"Sort order enumeration for list operations.","schema":{"type":"string","description":"Sort order enumeration for list operations.","enum":["desc","asc"],"title":"SortBy"}},{"name":"global_experiments_only","in":"query","schema":{"type":"boolean"}},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} +>>>>>>> 8fc501b7 (fix: more fixes) > From 880b631780febb473e6361d47cd53e4432a1d751 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Fri, 20 Mar 2026 13:19:24 +0530 Subject: [PATCH 08/16] feat: Add prefix filter in list exp --- .../Model/ListExperimentInput.hs | 42 ++++++++++++ .../client/SuperpositionAsyncClient.java | 6 +- .../client/SuperpositionAsyncClientImpl.java | 7 ++ .../client/SuperpositionClient.java | 6 +- .../client/SuperpositionClientImpl.java | 7 ++ .../model/ListExperimentInput.java | 66 +++++++++++++++++++ .../sdk/src/commands/ListExperimentCommand.ts | 6 ++ clients/javascript/sdk/src/models/models_0.ts | 4 ++ .../sdk/superposition_sdk/_private/schemas.py | 8 ++- .../python/sdk/superposition_sdk/models.py | 10 +++ .../src/client/list_experiment.rs | 4 ++ .../list_experiment/_list_experiment_input.rs | 26 ++++++++ .../src/operation/list_experiment/builders.rs | 6 ++ docs/docs/api/Superposition.openapi.json | 5 ++ docs/docs/api/list-experiment.api.mdx | 10 +++ 15 files changed, 206 insertions(+), 7 deletions(-) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs index 14af56077..752a0d0cd 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs @@ -16,10 +16,14 @@ module Io.Superposition.Model.ListExperimentInput ( setSortBy, setGlobalExperimentsOnly, setDimensionMatchStrategy, +<<<<<<< HEAD <<<<<<< HEAD setPrefix, ======= >>>>>>> 6e8749e1 (Test) +======= + setPrefix, +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) setContext, build, ListExperimentInputBuilder, @@ -41,10 +45,14 @@ module Io.Superposition.Model.ListExperimentInput ( sort_by, global_experiments_only, dimension_match_strategy, +<<<<<<< HEAD <<<<<<< HEAD prefix, ======= >>>>>>> 6e8749e1 (Test) +======= + prefix, +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context ) where import qualified Control.Applicative @@ -85,10 +93,14 @@ data ListExperimentInput = ListExperimentInput { sort_by :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, global_experiments_only :: Data.Maybe.Maybe Bool, dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +<<<<<<< HEAD <<<<<<< HEAD prefix :: Data.Maybe.Maybe ([] Data.Text.Text), ======= >>>>>>> 6e8749e1 (Test) +======= + prefix :: Data.Maybe.Maybe ([] Data.Text.Text), +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) } deriving ( GHC.Show.Show, @@ -115,10 +127,14 @@ instance Data.Aeson.ToJSON ListExperimentInput where "sort_by" Data.Aeson..= sort_by a, "global_experiments_only" Data.Aeson..= global_experiments_only a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, +<<<<<<< HEAD <<<<<<< HEAD "prefix" Data.Aeson..= prefix a, ======= >>>>>>> 6e8749e1 (Test) +======= + "prefix" Data.Aeson..= prefix a, +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) "context" Data.Aeson..= context a ] @@ -144,10 +160,14 @@ instance Data.Aeson.FromJSON ListExperimentInput where Control.Applicative.<*> (v Data.Aeson..:? "sort_by") Control.Applicative.<*> (v Data.Aeson..:? "global_experiments_only") Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") +<<<<<<< HEAD <<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..:? "prefix") ======= >>>>>>> 6e8749e1 (Test) +======= + Control.Applicative.<*> (v Data.Aeson..:? "prefix") +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) Control.Applicative.<*> (v Data.Aeson..:? "context") @@ -171,10 +191,14 @@ data ListExperimentInputBuilderState = ListExperimentInputBuilderState { sort_byBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, global_experiments_onlyBuilderState :: Data.Maybe.Maybe Bool, dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, +<<<<<<< HEAD <<<<<<< HEAD prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), ======= >>>>>>> 6e8749e1 (Test) +======= + prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) } deriving ( GHC.Generics.Generic @@ -199,10 +223,14 @@ defaultBuilderState = ListExperimentInputBuilderState { sort_byBuilderState = Data.Maybe.Nothing, global_experiments_onlyBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing, +<<<<<<< HEAD <<<<<<< HEAD prefixBuilderState = Data.Maybe.Nothing, ======= >>>>>>> 6e8749e1 (Test) +======= + prefixBuilderState = Data.Maybe.Nothing, +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) contextBuilderState = Data.Maybe.Nothing } @@ -277,12 +305,18 @@ setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) setPrefix :: Data.Maybe.Maybe ([] Data.Text.Text) -> ListExperimentInputBuilder () setPrefix value = Control.Monad.State.Strict.modify (\s -> (s { prefixBuilderState = value })) +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> ListExperimentInputBuilder () setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) @@ -307,10 +341,14 @@ build builder = do sort_by' <- Data.Either.Right (sort_byBuilderState st) global_experiments_only' <- Data.Either.Right (global_experiments_onlyBuilderState st) dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) +<<<<<<< HEAD <<<<<<< HEAD prefix' <- Data.Either.Right (prefixBuilderState st) ======= >>>>>>> 6e8749e1 (Test) +======= + prefix' <- Data.Either.Right (prefixBuilderState st) +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context' <- Data.Either.Right (contextBuilderState st) Data.Either.Right (ListExperimentInput { count = count', @@ -330,10 +368,14 @@ build builder = do sort_by = sort_by', global_experiments_only = global_experiments_only', dimension_match_strategy = dimension_match_strategy', +<<<<<<< HEAD <<<<<<< HEAD prefix = prefix', ======= >>>>>>> 6e8749e1 (Test) +======= + prefix = prefix', +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context = context' }) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java index b7041159b..5b4fbda9a 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClient.java @@ -1819,12 +1819,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); - private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); + private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index dfd7562ef..17e490279 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -275,6 +275,7 @@ final class SuperpositionAsyncClientImpl extends Client implements Superposition <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -287,6 +288,8 @@ final class SuperpositionAsyncClientImpl extends Client implements Superposition ======= >>>>>>> de718464 (fix: more fixes) ======= +>>>>>>> 964966cd (feat: Add prefix filter in list exp) +======= <<<<<<< HEAD ======= .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) @@ -296,6 +299,10 @@ >>>>>>> de718464 (fix: more fixes) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) >>>>>>> 82479b8f (fix: more fixes) +======= + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) >>>>>>> 5f8110af (Test) >>>>>>> c1293812 (Test) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java index d40ed4e31..f18a231d0 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClient.java @@ -1818,12 +1818,12 @@ final class Builder extends Client.Builder { Node.objectNode() ); - private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); - private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); - private static final HttpBearerAuthTrait httpBearerAuthScheme = new HttpBearerAuthTrait(); private static final AuthSchemeFactory httpBearerAuthSchemeFactory = new HttpBearerAuthScheme.Factory(); + private static final HttpBasicAuthTrait httpBasicAuthScheme = new HttpBasicAuthTrait(); + private static final AuthSchemeFactory httpBasicAuthSchemeFactory = new HttpBasicAuthAuthScheme.Factory(); + private Builder() { configBuilder().putSupportedAuthSchemes(httpBasicAuthSchemeFactory.createAuthScheme(httpBasicAuthScheme), httpBearerAuthSchemeFactory.createAuthScheme(httpBearerAuthScheme)); } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index 593169f02..2797652a9 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -275,6 +275,7 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClien <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -287,6 +288,8 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClien ======= >>>>>>> de718464 (fix: more fixes) ======= +>>>>>>> 964966cd (feat: Add prefix filter in list exp) +======= <<<<<<< HEAD ======= .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) @@ -296,6 +299,10 @@ >>>>>>> de718464 (fix: more fixes) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) >>>>>>> 82479b8f (fix: more fixes) +======= + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) >>>>>>> 5f8110af (Test) >>>>>>> c1293812 (Test) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java index bc6fb45db..790b77485 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java @@ -89,11 +89,16 @@ >>>>>>> de718464 (fix: more fixes) new HttpQueryTrait("global_experiments_only")) .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) +<<<<<<< HEAD <<<<<<< HEAD .putMember("prefix", SharedSchemas.STRING_LIST, new HttpQueryTrait("prefix")) ======= >>>>>>> 6e8749e1 (Test) +======= + .putMember("prefix", SharedSchemas.STRING_LIST, + new HttpQueryTrait("prefix")) +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); @@ -114,10 +119,14 @@ >>>>>>> de718464 (fix: more fixes) private static final Schema $SCHEMA_SORT_BY = $SCHEMA.member("sort_by"); private static final Schema $SCHEMA_GLOBAL_EXPERIMENTS_ONLY = $SCHEMA.member("global_experiments_only"); private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); +<<<<<<< HEAD <<<<<<< HEAD private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); ======= >>>>>>> 6e8749e1 (Test) +======= + private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); private final transient Integer count; @@ -137,10 +146,14 @@ >>>>>>> de718464 (fix: more fixes) private final transient SortBy sortBy; private final transient Boolean globalExperimentsOnly; private final transient DimensionMatchStrategy dimensionMatchStrategy; +<<<<<<< HEAD <<<<<<< HEAD private final transient List prefix; ======= >>>>>>> 6e8749e1 (Test) +======= + private final transient List prefix; +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) private final transient Map context; private ListExperimentInput(Builder builder) { @@ -161,10 +174,14 @@ private ListExperimentInput(Builder builder) { this.sortBy = builder.sortBy; this.globalExperimentsOnly = builder.globalExperimentsOnly; this.dimensionMatchStrategy = builder.dimensionMatchStrategy; +<<<<<<< HEAD <<<<<<< HEAD this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); ======= >>>>>>> 6e8749e1 (Test) +======= + this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); } @@ -279,6 +296,9 @@ public DimensionMatchStrategy dimensionMatchStrategy() { } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public List prefix() { if (prefix == null) { return Collections.emptyList(); @@ -290,8 +310,11 @@ public boolean hasPrefix() { return prefix != null; } +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public Map context() { if (context == null) { return Collections.emptyMap(); @@ -334,20 +357,28 @@ public boolean equals(Object other) { && Objects.equals(this.sortBy, that.sortBy) && Objects.equals(this.globalExperimentsOnly, that.globalExperimentsOnly) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) +<<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.prefix, that.prefix) ======= >>>>>>> 6e8749e1 (Test) +======= + && Objects.equals(this.prefix, that.prefix) +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) && Objects.equals(this.context, that.context); } @Override public int hashCode() { +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, prefix, context); ======= return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, context); >>>>>>> 6e8749e1 (Test) +======= + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, prefix, context); +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) } @Override @@ -404,12 +435,18 @@ public void serializeMembers(ShapeSerializer serializer) { if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } +<<<<<<< HEAD <<<<<<< HEAD if (prefix != null) { serializer.writeList($SCHEMA_PREFIX, prefix, prefix.size(), SharedSerde.StringListSerializer.INSTANCE); } ======= >>>>>>> 6e8749e1 (Test) +======= + if (prefix != null) { + serializer.writeList($SCHEMA_PREFIX, prefix, prefix.size(), SharedSerde.StringListSerializer.INSTANCE); + } +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } @@ -436,12 +473,17 @@ public T getMemberValue(Schema member) { case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_GLOBAL_EXPERIMENTS_ONLY, member, globalExperimentsOnly); case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); +<<<<<<< HEAD <<<<<<< HEAD case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); case 18 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); ======= case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); >>>>>>> 6e8749e1 (Test) +======= + case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); + case 18 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -472,10 +514,14 @@ public Builder toBuilder() { builder.sortBy(this.sortBy); builder.globalExperimentsOnly(this.globalExperimentsOnly); builder.dimensionMatchStrategy(this.dimensionMatchStrategy); +<<<<<<< HEAD <<<<<<< HEAD builder.prefix(this.prefix); ======= >>>>>>> 6e8749e1 (Test) +======= + builder.prefix(this.prefix); +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) builder.context(this.context); return builder; } @@ -509,10 +555,14 @@ public static final class Builder implements ShapeBuilder { private SortBy sortBy; private Boolean globalExperimentsOnly; private DimensionMatchStrategy dimensionMatchStrategy; +<<<<<<< HEAD <<<<<<< HEAD private List prefix; ======= >>>>>>> 6e8749e1 (Test) +======= + private List prefix; +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) private Map context; private Builder() {} @@ -676,6 +726,9 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat * @return this builder. */ <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public Builder prefix(List prefix) { this.prefix = prefix; return this; @@ -684,8 +737,11 @@ public Builder prefix(List prefix) { /** * @return this builder. */ +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public Builder context(Map context) { this.context = context; return this; @@ -718,12 +774,17 @@ public void setMemberValue(Schema member, Object value) { case 14 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); case 15 -> globalExperimentsOnly((boolean) SchemaUtils.validateSameMember($SCHEMA_GLOBAL_EXPERIMENTS_ONLY, member, value)); case 16 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); +<<<<<<< HEAD <<<<<<< HEAD case 17 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); case 18 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); ======= case 17 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); >>>>>>> 6e8749e1 (Test) +======= + case 17 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); + case 18 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -777,12 +838,17 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); case 15 -> builder.globalExperimentsOnly(de.readBoolean(member)); case 16 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); +<<<<<<< HEAD <<<<<<< HEAD case 17 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); case 18 -> builder.context(SharedSerde.deserializeContextMap(member, de)); ======= case 17 -> builder.context(SharedSerde.deserializeContextMap(member, de)); >>>>>>> 6e8749e1 (Test) +======= + case 17 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); + case 18 -> builder.context(SharedSerde.deserializeContextMap(member, de)); +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts index f91c5bbe6..0a20ec962 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts @@ -68,12 +68,18 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * sort_by: "desc" || "asc", * global_experiments_only: true || false, * dimension_match_strategy: "exact" || "subset", +<<<<<<< HEAD <<<<<<< HEAD * prefix: [ * "STRING_VALUE", * ], ======= >>>>>>> 6e8749e1 (Test) +======= + * prefix: [ + * "STRING_VALUE", + * ], +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index b67a66216..d40514bb3 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -2172,10 +2172,14 @@ export interface ListExperimentInput { */ dimension_match_strategy?: DimensionMatchStrategy | undefined; +<<<<<<< HEAD <<<<<<< HEAD prefix?: (string)[] | undefined; ======= >>>>>>> 6e8749e1 (Test) +======= + prefix?: (string)[] | undefined; +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /** * Map representing the context. * Keys correspond to the names of the dimensions. diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index 9c06110f0..809c0a978 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -11205,6 +11205,9 @@ }, <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) "prefix": { "target": STRING_LIST, "index": 17, @@ -11215,15 +11218,18 @@ ], }, +<<<<<<< HEAD "context": { "target": CONTEXT_MAP, "index": 18, "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), ======= +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) "context": { "target": CONTEXT_MAP, - "index": 17, + "index": 18, "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), >>>>>>> 6e8749e1 (Test) diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 1cd90bb20..d8790dd7a 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -11097,10 +11097,14 @@ class ListExperimentInput: sort_by: str | None = None global_experiments_only: bool | None = None dimension_match_strategy: str | None = None +<<<<<<< HEAD <<<<<<< HEAD prefix: list[str] | None = None ======= >>>>>>> 6e8749e1 (Test) +======= + prefix: list[str] | None = None +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context: dict[str, Document] | None = None def serialize(self, serializer: ShapeSerializer): @@ -11172,12 +11176,18 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_INPUT.members["dimension_match_strategy"]) case 17: +<<<<<<< HEAD <<<<<<< HEAD kwargs["prefix"] = _deserialize_string_list(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["prefix"]) case 18: ======= >>>>>>> 6e8749e1 (Test) +======= + kwargs["prefix"] = _deserialize_string_list(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["prefix"]) + + case 18: +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["context"]) case _: diff --git a/crates/superposition_sdk/src/client/list_experiment.rs b/crates/superposition_sdk/src/client/list_experiment.rs index 0a9c293e9..fa7717e88 100644 --- a/crates/superposition_sdk/src/client/list_experiment.rs +++ b/crates/superposition_sdk/src/client/list_experiment.rs @@ -20,10 +20,14 @@ impl super::Client { /// - [`sort_by(SortBy)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::sort_by) / [`set_sort_by(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_sort_by):
required: **false**
Sort order enumeration for list operations.
/// - [`global_experiments_only(bool)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::global_experiments_only) / [`set_global_experiments_only(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_global_experiments_only):
required: **false**
(undocumented)
/// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
+<<<<<<< HEAD <<<<<<< HEAD /// - [`prefix(impl Into)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_prefix):
required: **false**
(undocumented)
======= >>>>>>> 6e8749e1 (Test) +======= + /// - [`prefix(impl Into)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_prefix):
required: **false**
(undocumented)
+>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// - [`context(impl Into, Document)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
/// - On success, responds with [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput) with field(s): /// - [`total_pages(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_pages): (undocumented) diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs index b744f1731..5bbe47ae0 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs @@ -37,11 +37,16 @@ pub struct ListExperimentInput { pub global_experiments_only: ::std::option::Option, /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, +<<<<<<< HEAD <<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, ======= >>>>>>> 6e8749e1 (Test) +======= + #[allow(missing_docs)] // documentation missing in model + pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, } @@ -127,6 +132,9 @@ impl ListExperimentInput { self.dimension_match_strategy.as_ref() } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model /// /// If no value was sent for this field, a default will be set. If you want to determine if no value was sent, use `.prefix.is_none()`. @@ -134,8 +142,11 @@ impl ListExperimentInput { self.prefix.as_deref() .unwrap_or_default() } +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Map representing the context. Keys correspond to the names of the dimensions. pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() @@ -169,10 +180,14 @@ pub struct ListExperimentInputBuilder { pub(crate) sort_by: ::std::option::Option, pub(crate) global_experiments_only: ::std::option::Option, pub(crate) dimension_match_strategy: ::std::option::Option, +<<<<<<< HEAD <<<<<<< HEAD pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, ======= >>>>>>> 6e8749e1 (Test) +======= + pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, } impl ListExperimentInputBuilder { @@ -420,6 +435,9 @@ impl ListExperimentInputBuilder { &self.dimension_match_strategy } <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Appends an item to `prefix`. /// /// To override the contents of this collection use [`set_prefix`](Self::set_prefix). @@ -438,8 +456,11 @@ impl ListExperimentInputBuilder { pub fn get_prefix(&self) -> &::std::option::Option<::std::vec::Vec::<::std::string::String>> { &self.prefix } +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). @@ -497,11 +518,16 @@ impl ListExperimentInputBuilder { , dimension_match_strategy: self.dimension_match_strategy , +<<<<<<< HEAD <<<<<<< HEAD prefix: self.prefix , ======= >>>>>>> 6e8749e1 (Test) +======= + prefix: self.prefix + , +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context: self.context , } diff --git a/crates/superposition_sdk/src/operation/list_experiment/builders.rs b/crates/superposition_sdk/src/operation/list_experiment/builders.rs index 419a35e79..a308d88f0 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/builders.rs @@ -356,6 +356,9 @@ impl ListExperimentFluentBuilder { } /// <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Appends an item to `prefix`. /// /// To override the contents of this collection use [`set_prefix`](Self::set_prefix). @@ -375,8 +378,11 @@ impl ListExperimentFluentBuilder { self.inner.get_prefix() } /// +<<<<<<< HEAD ======= >>>>>>> 6e8749e1 (Test) +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index f4888e02f..8402c2e4f 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -2868,12 +2868,17 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) +======= +======= +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) +>>>>>>> 964966cd (feat: Add prefix filter in list exp) "name": "prefix", "in": "query", "style": "form", diff --git a/docs/docs/api/list-experiment.api.mdx b/docs/docs/api/list-experiment.api.mdx index 531841d16..8a3fa8643 100644 --- a/docs/docs/api/list-experiment.api.mdx +++ b/docs/docs/api/list-experiment.api.mdx @@ -9,10 +9,13 @@ hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 964966cd (feat: Add prefix filter in list exp) api: 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 ======= api: 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 @@ -20,6 +23,9 @@ api: eJztWt1v2zYQ/1cIPW2AnWTt+tK3NNE2Y/mC7XQDskCgJdpiI4kaSSUxAv/vuyP1QdmyIydpsIc ======= api: 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 >>>>>>> 82479b8f (fix: more fixes) +======= +api: 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 +>>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) sidebar_class_name: "post api-method" ======= <<<<<<< HEAD @@ -76,6 +82,7 @@ Retrieves a paginated list of experiments with support for filtering by status, >>>>>> 8fc501b7 (fix: more fixes) +======= + parameters={[{"name":"count","in":"query","description":"Number of items to be returned in each page.","schema":{"type":"number","description":"Number of items to be returned in each page."}},{"name":"page","in":"query","description":"Page number to retrieve, starting from 1.","schema":{"type":"number","description":"Page number to retrieve, starting from 1."}},{"name":"all","in":"query","description":"If true, returns all requested items, ignoring pagination parameters page and count.","schema":{"type":"boolean","description":"If true, returns all requested items, ignoring pagination parameters page and count."}},{"name":"status","in":"query","style":"form","schema":{"type":"array","items":{"type":"string","enum":["CREATED","CONCLUDED","INPROGRESS","DISCARDED","PAUSED"],"title":"ExperimentStatusType"}},"explode":true},{"name":"from_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"experiment_name","in":"query","schema":{"type":"string"}},{"name":"experiment_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"experiment_group_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"created_by","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"sort_on","in":"query","schema":{"type":"string","enum":["last_modified_at","created_at"],"title":"ExperimentSortOn"}},{"name":"sort_by","in":"query","description":"Sort order enumeration for list operations.","schema":{"type":"string","description":"Sort order enumeration for list operations.","enum":["desc","asc"],"title":"SortBy"}},{"name":"global_experiments_only","in":"query","schema":{"type":"boolean"}},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} +>>>>>>> 870f5d17 (feat: Add prefix filter in list exp) > From 15abc702645f1f7223164142059c35ff3a427bcf Mon Sep 17 00:00:00 2001 From: Natarajan Kannan Date: Tue, 17 Feb 2026 16:25:08 +0530 Subject: [PATCH 09/16] feat: add local/remote provider implementations following new structure --- Cargo.lock | 205 +- crates/superposition_provider/Cargo.toml | 4 + .../examples/config.toml | 20 + .../examples/local_file_example.rs | 34 + .../examples/local_file_watch_example.rs | 38 + .../examples/local_http_example.rs | 41 + .../examples/local_with_fallback_example.rs | 69 + .../examples/polling_example.rs | 102 + crates/superposition_provider/src/client.rs | 12 + .../superposition_provider/src/data_source.rs | 93 + .../src/data_source/file.rs | 141 ++ .../src/data_source/http.rs | 216 ++ crates/superposition_provider/src/lib.rs | 8 + .../src/local_provider.rs | 703 ++++++ .../src/remote_provider.rs | 506 +++++ crates/superposition_provider/src/traits.rs | 39 + crates/superposition_provider/src/types.rs | 22 + crates/superposition_provider/src/utils.rs | 20 + ...026-02-14-configuration-resolver-design.md | 226 ++ .../2026-02-14-configuration-resolver-plan.md | 1987 +++++++++++++++++ 20 files changed, 4480 insertions(+), 6 deletions(-) create mode 100644 crates/superposition_provider/examples/config.toml create mode 100644 crates/superposition_provider/examples/local_file_example.rs create mode 100644 crates/superposition_provider/examples/local_file_watch_example.rs create mode 100644 crates/superposition_provider/examples/local_http_example.rs create mode 100644 crates/superposition_provider/examples/local_with_fallback_example.rs create mode 100644 crates/superposition_provider/examples/polling_example.rs create mode 100644 crates/superposition_provider/src/data_source.rs create mode 100644 crates/superposition_provider/src/data_source/file.rs create mode 100644 crates/superposition_provider/src/data_source/http.rs create mode 100644 crates/superposition_provider/src/local_provider.rs create mode 100644 crates/superposition_provider/src/remote_provider.rs create mode 100644 crates/superposition_provider/src/traits.rs create mode 100644 docs/plans/2026-02-14-configuration-resolver-design.md create mode 100644 docs/plans/2026-02-14-configuration-resolver-plan.md diff --git a/Cargo.lock b/Cargo.lock index d1c0f2f3d..ef42e97d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -351,17 +351,32 @@ dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", - "anstyle-wincon", + "anstyle-wincon 1.0.1", "colorchoice", "is-terminal", "utf8parse", ] +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon 3.0.11", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -391,6 +406,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.75" @@ -1537,7 +1563,7 @@ version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1458a1df40e1e2afebb7ab60ce55c1fa8f431146205aa5f4887e0b111c27636" dependencies = [ - "anstream", + "anstream 0.3.2", "anstyle", "bitflags 1.3.2", "clap_lex 0.5.0", @@ -2292,6 +2318,29 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c012a26a7f605efc424dd53697843a72be7dc86ad2d01f7814337794a12231d" +dependencies = [ + "anstream 0.6.21", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -2427,6 +2476,17 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + [[package]] name = "find-msvc-tools" version = "0.1.5" @@ -2587,6 +2647,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "futures" version = "0.3.28" @@ -3048,6 +3117,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + [[package]] name = "hyper" version = "0.14.26" @@ -3240,6 +3315,26 @@ dependencies = [ "serde_core", ] +[[package]] +name = "inotify" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "inout" version = "0.1.4" @@ -3299,6 +3394,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "iso8601" version = "0.6.1" @@ -3430,6 +3531,26 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "kqueue" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "language-tags" version = "0.3.2" @@ -3702,6 +3823,17 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.9.1", + "libc", + "redox_syscall 0.7.1", +] + [[package]] name = "libsqlite3-sys" version = "0.26.0" @@ -3914,6 +4046,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3989,6 +4122,34 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "notify" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" +dependencies = [ + "bitflags 2.9.1", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio 1.0.2", + "notify-types", + "walkdir", + "windows-sys 0.52.0", +] + +[[package]] +name = "notify-types" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585d3cb5e12e01aed9e8a1f70d5c6b5e86fe2a6e48fc8cd0b3e0b8df6f6eb174" +dependencies = [ + "instant", +] + [[package]] name = "nu-ansi-term" version = "0.50.1" @@ -4148,6 +4309,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -4741,6 +4908,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "regex" version = "1.9.4" @@ -5828,7 +6004,9 @@ dependencies = [ "async-trait", "aws-smithy-types", "chrono", + "env_logger", "log", + "notify", "open-feature", "reqwest", "serde", @@ -6719,9 +6897,9 @@ checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -7021,6 +7199,12 @@ dependencies = [ "windows-targets 0.48.0", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.42.0" @@ -7063,6 +7247,15 @@ dependencies = [ "windows-targets 0.52.0", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.42.2" diff --git a/crates/superposition_provider/Cargo.toml b/crates/superposition_provider/Cargo.toml index 88883efcd..19c5ab994 100644 --- a/crates/superposition_provider/Cargo.toml +++ b/crates/superposition_provider/Cargo.toml @@ -26,6 +26,10 @@ tokio = { workspace = true } tokio-util = "0.7" uuid = { workspace = true } +notify = "7" + +[dev-dependencies] +env_logger = "0.11" [lints] workspace = true diff --git a/crates/superposition_provider/examples/config.toml b/crates/superposition_provider/examples/config.toml new file mode 100644 index 000000000..e4adc822a --- /dev/null +++ b/crates/superposition_provider/examples/config.toml @@ -0,0 +1,20 @@ +[default-configs] +timeout = { value = 30, schema = { type = "integer" } } +currency = { value = "Rupee", schema = { type = "string", enum = ["Rupee", "Dollar", "Euro"] } } +price = { value = 10000, schema = { type = "integer", minimum = 0 } } + +[dimensions] +os = { position = 1, schema = { type = "string" } } +city = { position = 2, schema = { type = "string" } } + +[[overrides]] +_context_ = { os = "linux" } +timeout = 45 + +[[overrides]] +_context_ = { city = "Boston" } +currency = "Dollar" + +[[overrides]] +_context_ = { city = "Berlin" } +currency = "Euro" diff --git a/crates/superposition_provider/examples/local_file_example.rs b/crates/superposition_provider/examples/local_file_example.rs new file mode 100644 index 000000000..29e51bf1d --- /dev/null +++ b/crates/superposition_provider/examples/local_file_example.rs @@ -0,0 +1,34 @@ +use std::path::PathBuf; + +use open_feature::EvaluationContext; +use superposition_provider::{ + data_source::file::FileDataSource, local_provider::LocalResolutionProvider, + traits::AllFeatureProvider, OnDemandStrategy, RefreshStrategy, +}; + +#[tokio::main] +async fn main() { + env_logger::init(); + + let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let file_source = FileDataSource::new(manifest_dir.join("examples/config.toml")); + + let provider = LocalResolutionProvider::new( + Box::new(file_source), + None, + RefreshStrategy::OnDemand(OnDemandStrategy { + ttl: 60, + ..Default::default() + }), + ); + provider.init().await.unwrap(); + + let context = EvaluationContext::default() + .with_custom_field("os", "linux") + .with_custom_field("city", "Boston"); + + let config = provider.resolve_all_features(&context).await.unwrap(); + println!("Config: {:?}", config); + + provider.close().await.unwrap(); +} diff --git a/crates/superposition_provider/examples/local_file_watch_example.rs b/crates/superposition_provider/examples/local_file_watch_example.rs new file mode 100644 index 000000000..deaa91ebd --- /dev/null +++ b/crates/superposition_provider/examples/local_file_watch_example.rs @@ -0,0 +1,38 @@ +use std::path::PathBuf; + +use open_feature::EvaluationContext; +use superposition_provider::{ + data_source::file::FileDataSource, local_provider::LocalResolutionProvider, + traits::AllFeatureProvider, RefreshStrategy, WatchStrategy, +}; + +#[tokio::main] +async fn main() { + env_logger::init(); + + let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let config_path = manifest_dir.join("examples/config.toml"); + + println!("Watching config file: {:?}", config_path); + println!("Edit the file in another terminal to see changes.\n"); + + let file_source = FileDataSource::new(config_path); + + let provider = LocalResolutionProvider::new( + Box::new(file_source), + None, + RefreshStrategy::Watch(WatchStrategy::default()), + ); + provider.init().await.unwrap(); + + let context = EvaluationContext::default() + .with_custom_field("os", "linux") + .with_custom_field("city", "Boston"); + + // Poll in a loop to show updated values after file changes + loop { + let config = provider.resolve_all_features(&context).await.unwrap(); + println!("Config: {:?}", config); + tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; + } +} diff --git a/crates/superposition_provider/examples/local_http_example.rs b/crates/superposition_provider/examples/local_http_example.rs new file mode 100644 index 000000000..a28db8c54 --- /dev/null +++ b/crates/superposition_provider/examples/local_http_example.rs @@ -0,0 +1,41 @@ +use open_feature::EvaluationContext; +use superposition_provider::{ + data_source::http::HttpDataSource, + local_provider::LocalResolutionProvider, + traits::{AllFeatureProvider, FeatureExperimentMeta}, + PollingStrategy, RefreshStrategy, SuperpositionOptions, +}; + +#[tokio::main] +async fn main() { + env_logger::init(); + + let http_source = HttpDataSource::new(SuperpositionOptions::new( + "http://localhost:8080".to_string(), + "token".to_string(), + "localorg".to_string(), + "dev".to_string(), + )); + + let provider = LocalResolutionProvider::new( + Box::new(http_source), + None, + RefreshStrategy::Polling(PollingStrategy { + interval: 30, + timeout: Some(10), + }), + ); + provider.init().await.unwrap(); + + let context = EvaluationContext::default() + .with_targeting_key("user-1234") + .with_custom_field("dimension", "d2"); + + let all_config = provider.resolve_all_features(&context).await.unwrap(); + println!("All config: {:?}", all_config); + + let variants = provider.get_applicable_variants(&context).await.unwrap(); + println!("Variants: {:?}", variants); + + provider.close().await.unwrap(); +} diff --git a/crates/superposition_provider/examples/local_with_fallback_example.rs b/crates/superposition_provider/examples/local_with_fallback_example.rs new file mode 100644 index 000000000..d63a1d085 --- /dev/null +++ b/crates/superposition_provider/examples/local_with_fallback_example.rs @@ -0,0 +1,69 @@ +use std::path::PathBuf; + +use open_feature::{EvaluationContext, OpenFeature}; +use superposition_provider::{ + data_source::file::FileDataSource, data_source::http::HttpDataSource, + local_provider::LocalResolutionProvider, PollingStrategy, RefreshStrategy, + SuperpositionOptions, +}; +use tokio::time::{sleep, Duration}; + +#[tokio::main] +async fn main() { + env_logger::init(); + + let http_source = HttpDataSource::new(SuperpositionOptions::new( + "http://localhost:8080".to_string(), + "token".to_string(), + "localorg".to_string(), + "dev".to_string(), + )); + + let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let file_source = FileDataSource::new(manifest_dir.join("examples/config.toml")); + + let provider = LocalResolutionProvider::new( + Box::new(http_source), + Some(Box::new(file_source)), + RefreshStrategy::Polling(PollingStrategy { + interval: 10, + timeout: Some(10), + }), + ); + + // Register with OpenFeature and create a client + let mut api = OpenFeature::singleton_mut().await; + api.set_provider(provider).await; + let client = api.create_client(); + + // Allow time for the provider to initialize via OpenFeature + sleep(Duration::from_secs(2)).await; + + println!("=== Superposition Fallback + Polling Example ==="); + println!("Primary: HTTP (localhost:8080), Fallback: config.toml"); + println!("Polling every 10s. Printing config every 5s (Ctrl-C to stop).\n"); + + let context = EvaluationContext::default() + .with_targeting_key("user-456") + .with_custom_field("os", "linux") + .with_custom_field("city", "Berlin"); + + loop { + let ts = chrono::Utc::now().format("%H:%M:%S"); + + match client + .get_string_value("currency", Some(&context), None) + .await + { + Ok(value) => print!("[{}] currency = {}", ts, value), + Err(e) => print!("[{}] currency error: {:?}", ts, e), + } + + match client.get_int_value("timeout", Some(&context), None).await { + Ok(value) => println!(" | timeout = {}", value), + Err(e) => println!(" | timeout error: {:?}", e), + } + + sleep(Duration::from_secs(5)).await; + } +} diff --git a/crates/superposition_provider/examples/polling_example.rs b/crates/superposition_provider/examples/polling_example.rs new file mode 100644 index 000000000..31445501d --- /dev/null +++ b/crates/superposition_provider/examples/polling_example.rs @@ -0,0 +1,102 @@ +/// Demonstrates the Polling refresh strategy with LocalResolutionProvider +/// using the OpenFeature client interface. +/// +/// This example connects to a Superposition server via HTTP, polls for config +/// changes every 10 seconds, and prints a config value in a loop using the +/// standard OpenFeature client API. Change the config on the server and watch +/// the printed value update automatically. +/// +/// Usage: +/// RUST_LOG=info cargo run --example polling_example +/// +/// Environment variables (all optional, with defaults shown): +/// SUPERPOSITION_ENDPOINT http://localhost:8080 +/// SUPERPOSITION_TOKEN token +/// SUPERPOSITION_ORG_ID localorg +/// SUPERPOSITION_WORKSPACE dev +/// POLL_INTERVAL 10 (seconds between server polls) +/// PRINT_INTERVAL 5 (seconds between printing the value) +/// CONFIG_KEY max_connections (the config key to watch) +use std::env; + +use open_feature::{EvaluationContext, OpenFeature}; +use superposition_provider::{ + data_source::http::HttpDataSource, local_provider::LocalResolutionProvider, PollingStrategy, + RefreshStrategy, SuperpositionOptions, +}; +use tokio::time::{sleep, Duration}; + +fn env_or(key: &str, default: &str) -> String { + env::var(key).unwrap_or_else(|_| default.to_string()) +} + +#[tokio::main] +async fn main() { + env_logger::init(); + + let endpoint = env_or("SUPERPOSITION_ENDPOINT", "http://localhost:8080"); + let token = env_or("SUPERPOSITION_TOKEN", "token"); + let org_id = env_or("SUPERPOSITION_ORG_ID", "localorg"); + let workspace = env_or("SUPERPOSITION_WORKSPACE", "dev"); + let poll_interval: u64 = env_or("POLL_INTERVAL", "10").parse().unwrap_or(10); + let print_interval: u64 = env_or("PRINT_INTERVAL", "5").parse().unwrap_or(5); + let config_key = env_or("CONFIG_KEY", "max_connections"); + + println!("=== Superposition Polling Example ==="); + println!("Endpoint: {}", endpoint); + println!("Org / Workspace: {} / {}", org_id, workspace); + println!("Poll interval: {}s", poll_interval); + println!("Print interval: {}s", print_interval); + println!("Watching key: {}", config_key); + println!(); + + let http_source = HttpDataSource::new(SuperpositionOptions::new( + endpoint, token, org_id, workspace, + )); + + let provider = LocalResolutionProvider::new( + Box::new(http_source), + None, + RefreshStrategy::Polling(PollingStrategy { + interval: poll_interval, + timeout: Some(10), + }), + ); + + // Register with OpenFeature and create a client + let mut api = OpenFeature::singleton_mut().await; + api.set_provider(provider).await; + let client = api.create_client(); + + // Allow time for the provider to initialize via OpenFeature + sleep(Duration::from_secs(2)).await; + + println!( + "Provider ready. Printing config every {}s (Ctrl-C to stop).\n", + print_interval + ); + + let context = EvaluationContext::default(); + + loop { + match client + .get_int_value(&config_key, Some(&context), None) + .await + { + Ok(value) => println!( + "[{}] {} = {}", + chrono::Utc::now().format("%H:%M:%S"), + config_key, + value + ), + Err(e) => eprintln!( + "[{}] Error resolving {}: {:?}", + chrono::Utc::now().format("%H:%M:%S"), + config_key, + e + ), + } + + sleep(Duration::from_secs(print_interval)).await; + } +} diff --git a/crates/superposition_provider/src/client.rs b/crates/superposition_provider/src/client.rs index f4f1273c1..8e829fe20 100644 --- a/crates/superposition_provider/src/client.rs +++ b/crates/superposition_provider/src/client.rs @@ -95,6 +95,12 @@ impl CacConfig { on_demand_strategy.timeout.unwrap_or(30) ); } + RefreshStrategy::Watch(_) => { + info!("Using Watch refresh strategy"); + } + RefreshStrategy::Manual => { + info!("Using Manual refresh strategy"); + } } Ok(()) @@ -351,6 +357,12 @@ impl ExperimentationConfig { on_demand_strategy.ttl ); } + RefreshStrategy::Watch(_) => { + info!("Using Watch refresh strategy for experiments"); + } + RefreshStrategy::Manual => { + info!("Using Manual refresh strategy for experiments"); + } } Ok(()) diff --git a/crates/superposition_provider/src/data_source.rs b/crates/superposition_provider/src/data_source.rs new file mode 100644 index 000000000..1b499f4ea --- /dev/null +++ b/crates/superposition_provider/src/data_source.rs @@ -0,0 +1,93 @@ +pub mod file; +pub mod http; + +use async_trait::async_trait; +use chrono::{DateTime, Utc}; +use serde_json::{Map, Value}; +use superposition_core::experiment::ExperimentGroups; +use superposition_core::Experiments; +use superposition_types::Config; + +use crate::types::Result; + +/// Holds a resolved configuration along with the time it was fetched. +#[derive(Debug, Clone)] +pub struct ConfigData { + pub config: Config, + pub fetched_at: DateTime, +} + +impl ConfigData { + pub fn new(config: Config) -> Self { + Self { + config, + fetched_at: Utc::now(), + } + } +} + +/// Holds active experiments and experiment groups along with the time they were fetched. +#[derive(Debug, Clone)] +pub struct ExperimentData { + pub experiments: Experiments, + pub experiment_groups: ExperimentGroups, + pub fetched_at: DateTime, +} + +impl ExperimentData { + pub fn new(experiments: Experiments, experiment_groups: ExperimentGroups) -> Self { + Self { + experiments, + experiment_groups, + fetched_at: Utc::now(), + } + } +} + +/// Trait for fetching configuration and experiment data from a Superposition backend. +/// +/// Implementors provide the transport mechanism (e.g. HTTP, file-based) while consumers +/// interact with this unified interface. +#[async_trait] +pub trait SuperpositionDataSource: Send + Sync { + /// Fetch the full resolved configuration. + async fn fetch_config(&self) -> Result; + + /// Fetch a resolved configuration filtered by the given context and key prefixes. + async fn fetch_filtered_config( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result; + + /// Fetch all active experiments. + async fn fetch_active_experiments(&self) -> Result>; + + /// Fetch active experiments whose conditions are candidates for the given context + /// and key prefixes. + async fn fetch_candidate_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result>; + + /// Fetch active experiments that match the given context and key prefixes. + async fn fetch_matching_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result>; + + /// Whether this data source supports experiments. + fn supports_experiments(&self) -> bool; + + /// Set up a file watcher and return a stream of change notifications. + /// + /// Returns `Ok(None)` if this data source does not support watching. + fn watch(&self) -> Result> { + Ok(None) + } + + /// Clean up any resources held by this data source. + async fn close(&self) -> Result<()>; +} diff --git a/crates/superposition_provider/src/data_source/file.rs b/crates/superposition_provider/src/data_source/file.rs new file mode 100644 index 000000000..0bed088cb --- /dev/null +++ b/crates/superposition_provider/src/data_source/file.rs @@ -0,0 +1,141 @@ +use std::collections::HashSet; +use std::path::PathBuf; +use std::sync::{Arc, Mutex}; + +use async_trait::async_trait; +use log::error; +use notify::{Event, RecommendedWatcher, Watcher}; +use serde_json::{Map, Value}; +use superposition_core::toml::parse_toml_config; + +use super::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::types::{Result, SuperpositionError, WatchStream}; + +pub struct FileDataSource { + file_path: PathBuf, + watcher: Arc>>, +} + +impl FileDataSource { + pub fn new(file_path: PathBuf) -> Self { + Self { + file_path, + watcher: Arc::new(Mutex::new(None)), + } + } +} + +#[async_trait] +impl SuperpositionDataSource for FileDataSource { + async fn fetch_config(&self) -> Result { + let content = + tokio::fs::read_to_string(&self.file_path) + .await + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to read config file {:?}: {}", + self.file_path, e + )) + })?; + + let config = parse_toml_config(&content).map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to parse TOML config: {}", + e + )) + })?; + + Ok(ConfigData::new(config)) + } + + async fn fetch_filtered_config( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result { + let config_data = self.fetch_config().await?; + let mut config = config_data.config; + + if let Some(ctx) = context { + if !ctx.is_empty() { + config = config.filter_by_dimensions(ctx); + } + } + + if let Some(prefixes) = prefix_filter { + if !prefixes.is_empty() { + let prefix_set: HashSet = + HashSet::from_iter(prefixes.iter().cloned()); + config = config.filter_by_prefix(&prefix_set); + } + } + + Ok(ConfigData::new(config)) + } + + async fn fetch_active_experiments(&self) -> Result> { + Ok(None) + } + + async fn fetch_candidate_active_experiments( + &self, + _context: Option<&Map>, + _prefix_filter: Option<&[String]>, + ) -> Result> { + Ok(None) + } + + async fn fetch_matching_active_experiments( + &self, + _context: Option<&Map>, + _prefix_filter: Option<&[String]>, + ) -> Result> { + Ok(None) + } + + fn supports_experiments(&self) -> bool { + false + } + + fn watch(&self) -> Result> { + let (tx, rx) = tokio::sync::mpsc::channel(16); + + let mut watcher = notify::recommended_watcher(move |res: std::result::Result| { + match res { + Ok(_event) => { + let _ = tx.try_send(()); + } + Err(e) => { + error!("FileDataSource: watch error: {}", e); + } + } + }) + .map_err(|e| { + SuperpositionError::ConfigError(format!("Failed to create file watcher: {}", e)) + })?; + + watcher + .watch(&self.file_path, notify::RecursiveMode::NonRecursive) + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to watch file {:?}: {}", + self.file_path, e + )) + })?; + + let mut guard = self.watcher.lock().map_err(|e| { + SuperpositionError::ConfigError(format!("Failed to lock watcher mutex: {}", e)) + })?; + *guard = Some(watcher); + + Ok(Some(WatchStream { receiver: rx })) + } + + async fn close(&self) -> Result<()> { + let mut guard = self.watcher.lock().map_err(|e| { + SuperpositionError::ConfigError(format!("Failed to lock watcher mutex: {}", e)) + })?; + *guard = None; + Ok(()) + } +} diff --git a/crates/superposition_provider/src/data_source/http.rs b/crates/superposition_provider/src/data_source/http.rs new file mode 100644 index 000000000..1a0cf99c3 --- /dev/null +++ b/crates/superposition_provider/src/data_source/http.rs @@ -0,0 +1,216 @@ +use std::collections::HashSet; + +use async_trait::async_trait; +use log::info; +use serde_json::{Map, Value}; +use superposition_sdk::types::ExperimentStatusType; +use superposition_sdk::{Client, Config as SdkConfig}; +use superposition_types::logic::{apply, partial_apply}; + +use super::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::types::{Result, SuperpositionError, SuperpositionOptions}; +use crate::utils::ConversionUtils; + +pub struct HttpDataSource { + options: SuperpositionOptions, +} + +impl HttpDataSource { + pub fn new(options: SuperpositionOptions) -> Self { + Self { options } + } + + fn create_client(&self) -> Client { + let sdk_config = SdkConfig::builder() + .endpoint_url(&self.options.endpoint) + .bearer_token(self.options.token.clone().into()) + .behavior_version_latest() + .build(); + + Client::from_conf(sdk_config) + } + + async fn fetch_experiments_and_groups(&self) -> Result { + let client = self.create_client(); + + let (experiments_result, groups_result) = tokio::join!( + async { + client + .list_experiment() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .all(true) + .status(ExperimentStatusType::Created) + .status(ExperimentStatusType::Inprogress) + .send() + .await + .map_err(|e| { + SuperpositionError::NetworkError(format!( + "Failed to list experiments: {}", + e + )) + }) + }, + async { + client + .list_experiment_groups() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .all(true) + .send() + .await + .map_err(|e| { + SuperpositionError::NetworkError(format!( + "Failed to list experiment groups: {}", + e + )) + }) + } + ); + + let experiments_response = experiments_result?; + let groups_response = groups_result?; + + let experiments = + ConversionUtils::convert_experiments_response(&experiments_response)?; + let experiment_groups = + ConversionUtils::convert_experiment_groups_response(&groups_response)?; + + info!( + "Successfully fetched {} experiments and {} experiment groups", + experiments.len(), + experiment_groups.len() + ); + + Ok(ExperimentData::new(experiments, experiment_groups)) + } + + /// Filter experiments by context using a matcher function (apply or partial_apply), + /// and optionally by prefix. + fn filter_experiments( + data: &ExperimentData, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + matcher: fn(&Map, &Map) -> bool, + ) -> ExperimentData { + let mut filtered_experiments = data.experiments.clone(); + + // Filter by context using the provided matcher + if let Some(ctx) = context { + if !ctx.is_empty() { + filtered_experiments.retain(|exp| matcher(&exp.context, ctx)); + } + } + + // Filter by prefix: keep experiments where any variant has an override key + // starting with any of the prefixes + if let Some(prefixes) = prefix_filter { + if !prefixes.is_empty() { + filtered_experiments.retain(|exp| { + exp.variants.iter().any(|variant| { + let overrides = variant.overrides.clone().into_inner(); + overrides.keys().any(|key| { + prefixes.iter().any(|prefix| key.starts_with(prefix)) + }) + }) + }); + } + } + + // Keep all groups (they reference experiments by ID) + ExperimentData::new(filtered_experiments, data.experiment_groups.clone()) + } +} + +#[async_trait] +impl SuperpositionDataSource for HttpDataSource { + async fn fetch_config(&self) -> Result { + let client = self.create_client(); + + info!("Fetching config from Superposition service using SDK"); + + let response = client + .get_config() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .send() + .await + .map_err(|e| { + SuperpositionError::NetworkError(format!( + "Failed to get config: {}", + e + )) + })?; + + let config = ConversionUtils::convert_get_config_response(&response)?; + + info!( + "Successfully fetched config with {} contexts, {} overrides, {} default configs", + config.contexts.len(), + config.overrides.len(), + config.default_configs.len() + ); + + Ok(ConfigData::new(config)) + } + + async fn fetch_filtered_config( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result { + let config_data = self.fetch_config().await?; + let mut config = config_data.config; + + // Filter by dimensions if context is provided and non-empty + if let Some(ctx) = context { + if !ctx.is_empty() { + config = config.filter_by_dimensions(ctx); + } + } + + // Filter by prefix if prefix_filter is provided and non-empty + if let Some(prefixes) = prefix_filter { + if !prefixes.is_empty() { + let prefix_set: HashSet = + HashSet::from_iter(prefixes.iter().cloned()); + config = config.filter_by_prefix(&prefix_set); + } + } + + Ok(ConfigData::new(config)) + } + + async fn fetch_active_experiments(&self) -> Result> { + let data = self.fetch_experiments_and_groups().await?; + Ok(Some(data)) + } + + async fn fetch_candidate_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result> { + let data = self.fetch_experiments_and_groups().await?; + let filtered = Self::filter_experiments(&data, context, prefix_filter, partial_apply); + Ok(Some(filtered)) + } + + async fn fetch_matching_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result> { + let data = self.fetch_experiments_and_groups().await?; + let filtered = Self::filter_experiments(&data, context, prefix_filter, apply); + Ok(Some(filtered)) + } + + fn supports_experiments(&self) -> bool { + true + } + + async fn close(&self) -> Result<()> { + Ok(()) + } +} diff --git a/crates/superposition_provider/src/lib.rs b/crates/superposition_provider/src/lib.rs index 059e47cf1..a97757c15 100644 --- a/crates/superposition_provider/src/lib.rs +++ b/crates/superposition_provider/src/lib.rs @@ -1,10 +1,18 @@ pub mod client; +pub mod data_source; +pub mod local_provider; pub mod provider; +pub mod remote_provider; +pub mod traits; pub mod types; pub mod utils; pub use client::*; +pub use data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; +pub use local_provider::LocalResolutionProvider; pub use provider::*; +pub use remote_provider::SuperpositionAPIProvider; +pub use traits::*; pub use types::*; pub use open_feature::{ diff --git a/crates/superposition_provider/src/local_provider.rs b/crates/superposition_provider/src/local_provider.rs new file mode 100644 index 000000000..dbcfbbeb6 --- /dev/null +++ b/crates/superposition_provider/src/local_provider.rs @@ -0,0 +1,703 @@ +use std::collections::HashMap; +use std::sync::Arc; + +use async_trait::async_trait; +use log::{debug, error, info, warn}; +use open_feature::{ + provider::FeatureProvider, + provider::{ProviderMetadata, ProviderStatus, ResolutionDetails}, + EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, +}; +use serde_json::{Map, Value}; +use superposition_core::{eval_config, get_applicable_variants, MergeStrategy}; +use superposition_types::DimensionInfo; +use tokio::sync::RwLock; +use tokio::task::JoinHandle; +use tokio::time::{sleep, Duration}; + +use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; +use crate::types::*; +use crate::utils::ConversionUtils; + +pub struct LocalResolutionProvider { + primary: Arc, + fallback: Option>, + refresh_strategy: RefreshStrategy, + cached_config: Arc>>, + cached_experiments: Arc>>, + polling_task: RwLock>>, + metadata: ProviderMetadata, + status: RwLock, +} + +impl LocalResolutionProvider { + pub fn new( + primary: Box, + fallback: Option>, + refresh_strategy: RefreshStrategy, + ) -> Self { + Self { + primary: Arc::from(primary), + fallback: fallback.map(Arc::from), + refresh_strategy, + cached_config: Arc::new(RwLock::new(None)), + cached_experiments: Arc::new(RwLock::new(None)), + polling_task: RwLock::new(None), + metadata: ProviderMetadata { + name: "LocalResolutionProvider".to_string(), + }, + status: RwLock::new(ProviderStatus::NotReady), + } + } + + pub async fn init(&self) -> Result<()> { + // Fetch initial config from primary, fall back if needed + let config_data = match self.primary.fetch_config().await { + Ok(data) => { + info!("LocalResolutionProvider: fetched config from primary source"); + data + } + Err(e) => { + warn!( + "LocalResolutionProvider: primary config fetch failed: {}", + e + ); + if let Some(fallback) = &self.fallback { + fallback.fetch_config().await.map_err(|fb_err| { + error!( + "LocalResolutionProvider: fallback config fetch also failed: {}", + fb_err + ); + SuperpositionError::ConfigError(format!( + "Both primary and fallback config fetch failed. Primary: {}. Fallback: {}", + e, fb_err + )) + })? + } else { + return Err(SuperpositionError::ConfigError(format!( + "Primary config fetch failed and no fallback configured: {}", + e + ))); + } + } + }; + + { + let mut cached = self.cached_config.write().await; + *cached = Some(config_data); + } + + // Fetch experiments best-effort: try primary, optionally fallback, but don't fail + let exp_data = match self.primary.fetch_active_experiments().await { + Ok(data) => data, + Err(e) => { + warn!( + "LocalResolutionProvider: primary experiment fetch failed (best-effort): {}", + e + ); + if let Some(fallback) = &self.fallback { + match fallback.fetch_active_experiments().await { + Ok(data) => data, + Err(fb_err) => { + warn!( + "LocalResolutionProvider: fallback experiment fetch also failed (best-effort): {}", + fb_err + ); + None + } + } + } else { + None + } + } + }; + + if let Some(data) = exp_data { + let mut cached = self.cached_experiments.write().await; + *cached = Some(data); + info!("LocalResolutionProvider: experiments cached"); + } + + // Start refresh strategy + match &self.refresh_strategy { + RefreshStrategy::Polling(polling_strategy) => { + info!( + "LocalResolutionProvider: starting polling with interval={}s", + polling_strategy.interval + ); + let task = self.start_polling(polling_strategy.interval).await; + let mut polling_task = self.polling_task.write().await; + *polling_task = Some(task); + } + RefreshStrategy::OnDemand(on_demand_strategy) => { + info!( + "LocalResolutionProvider: using OnDemand strategy with ttl={}s", + on_demand_strategy.ttl + ); + } + RefreshStrategy::Watch(watch_strategy) => { + let debounce_ms = watch_strategy.debounce_ms.unwrap_or(500); + match self.primary.watch() { + Ok(Some(stream)) => { + info!( + "LocalResolutionProvider: starting watch with debounce={}ms", + debounce_ms + ); + let task = self.start_watching(stream, debounce_ms).await; + let mut polling_task = self.polling_task.write().await; + *polling_task = Some(task); + } + Ok(None) => { + warn!("Watch strategy selected but data source does not support watching"); + } + Err(e) => { + warn!("Failed to start watch: {}", e); + } + } + } + RefreshStrategy::Manual => { + info!("LocalResolutionProvider: using Manual refresh strategy"); + } + } + + { + let mut status = self.status.write().await; + *status = ProviderStatus::Ready; + } + + Ok(()) + } + + pub async fn refresh(&self) -> Result<()> { + self.do_refresh().await + } + + pub async fn close(&self) -> Result<()> { + // Abort polling task + { + let mut polling_task = self.polling_task.write().await; + if let Some(task) = polling_task.take() { + task.abort(); + } + } + + // Close data sources + if let Err(e) = self.primary.close().await { + warn!("LocalResolutionProvider: error closing primary source: {}", e); + } + if let Some(fallback) = &self.fallback { + if let Err(e) = fallback.close().await { + warn!( + "LocalResolutionProvider: error closing fallback source: {}", + e + ); + } + } + + // Clear caches + { + let mut cached = self.cached_config.write().await; + *cached = None; + } + { + let mut cached = self.cached_experiments.write().await; + *cached = None; + } + + // Set status to NotReady + { + let mut status = self.status.write().await; + *status = ProviderStatus::NotReady; + } + + Ok(()) + } + + async fn do_refresh(&self) -> Result<()> { + // Fetch config from primary; keep last known good on failure + let config_result = self.primary.fetch_config().await; + match &config_result { + Ok(data) => { + let mut cached = self.cached_config.write().await; + *cached = Some(data.clone()); + debug!("LocalResolutionProvider: config refreshed from primary"); + } + Err(e) => { + warn!( + "LocalResolutionProvider: config refresh failed, keeping last known good: {}", + e + ); + } + } + + // Experiments refresh is best-effort, don't propagate errors + if self.primary.supports_experiments() { + match self.primary.fetch_active_experiments().await { + Ok(Some(data)) => { + let mut cached = self.cached_experiments.write().await; + *cached = Some(data); + debug!("LocalResolutionProvider: experiments refreshed from primary"); + } + Ok(None) => { + debug!("LocalResolutionProvider: no experiments returned from primary"); + } + Err(e) => { + warn!( + "LocalResolutionProvider: experiment refresh failed, keeping last known good: {}", + e + ); + } + } + } + + config_result.map(|_| ()) + } + + async fn start_polling(&self, interval: u64) -> JoinHandle<()> { + let primary = self.primary.clone(); + let cached_config = self.cached_config.clone(); + let cached_experiments = self.cached_experiments.clone(); + + tokio::spawn(async move { + loop { + sleep(Duration::from_secs(interval)).await; + + // Refresh config + match primary.fetch_config().await { + Ok(data) => { + let mut cached = cached_config.write().await; + *cached = Some(data); + debug!("LocalResolutionProvider: config updated via polling"); + } + Err(e) => { + error!("LocalResolutionProvider: polling config error: {}", e); + } + } + + // Refresh experiments + match primary.fetch_active_experiments().await { + Ok(Some(data)) => { + let mut cached = cached_experiments.write().await; + *cached = Some(data); + debug!("LocalResolutionProvider: experiments updated via polling"); + } + Ok(None) => {} + Err(e) => { + error!( + "LocalResolutionProvider: polling experiments error: {}", + e + ); + } + } + } + }) + } + + async fn start_watching( + &self, + mut watch_stream: crate::types::WatchStream, + debounce_ms: u64, + ) -> JoinHandle<()> { + let primary = self.primary.clone(); + let cached_config = self.cached_config.clone(); + let cached_experiments = self.cached_experiments.clone(); + + tokio::spawn(async move { + loop { + match watch_stream.receiver.recv().await { + Some(()) => { + // Debounce: wait, then drain any queued events + sleep(Duration::from_millis(debounce_ms)).await; + while watch_stream.receiver.try_recv().is_ok() {} + + // Refresh config + match primary.fetch_config().await { + Ok(data) => { + let mut cached = cached_config.write().await; + *cached = Some(data); + debug!("LocalResolutionProvider: config updated via watch"); + } + Err(e) => { + error!( + "LocalResolutionProvider: watch config refresh error: {}", + e + ); + } + } + + // Refresh experiments + match primary.fetch_active_experiments().await { + Ok(Some(data)) => { + let mut cached = cached_experiments.write().await; + *cached = Some(data); + debug!( + "LocalResolutionProvider: experiments updated via watch" + ); + } + Ok(None) => {} + Err(e) => { + error!( + "LocalResolutionProvider: watch experiments refresh error: {}", + e + ); + } + } + } + None => { + info!("LocalResolutionProvider: watch channel closed, stopping"); + break; + } + } + } + }) + } + + async fn ensure_fresh_data(&self) -> Result<()> { + if let RefreshStrategy::OnDemand(on_demand) = &self.refresh_strategy { + let ttl = on_demand.ttl; + let use_stale_on_error = on_demand.use_stale_on_error.unwrap_or(false); + + let should_refresh = { + let cached = self.cached_config.read().await; + match cached.as_ref() { + Some(data) => { + let elapsed = + (chrono::Utc::now() - data.fetched_at).num_seconds(); + elapsed > ttl as i64 + } + None => true, + } + }; + + if should_refresh { + debug!("LocalResolutionProvider: TTL expired, refreshing on-demand"); + if let Err(e) = self.do_refresh().await { + if !use_stale_on_error { + return Err(e); + } + warn!( + "LocalResolutionProvider: on-demand refresh failed, using stale data: {}", + e + ); + } + } + } + Ok(()) + } + + async fn get_dimensions_info(&self) -> HashMap { + let cached = self.cached_config.read().await; + match cached.as_ref() { + Some(data) => data.config.dimensions.clone(), + None => HashMap::new(), + } + } + + async fn eval_with_context( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + self.ensure_fresh_data().await?; + + let (mut query_data, targeting_key) = + ConversionUtils::evaluation_context_to_query(context); + + let dimensions_info = self.get_dimensions_info().await; + + // If experiments are cached, get applicable variants and inject variantIds + { + let cached_exp = self.cached_experiments.read().await; + if let Some(exp_data) = cached_exp.as_ref() { + match get_applicable_variants( + &dimensions_info, + exp_data.experiments.clone(), + &exp_data.experiment_groups, + &query_data, + &targeting_key.clone().unwrap_or_default(), + None, + ) { + Ok(variant_ids) => { + query_data.insert( + "variantIds".to_string(), + Value::Array( + variant_ids.into_iter().map(Value::String).collect(), + ), + ); + } + Err(e) => { + warn!( + "LocalResolutionProvider: failed to get applicable variants: {}", + e + ); + } + } + } + } + + // Evaluate config using cached data + let cached = self.cached_config.read().await; + match cached.as_ref() { + Some(config_data) => eval_config( + (*config_data.config.default_configs).clone(), + &config_data.config.contexts, + &config_data.config.overrides, + &config_data.config.dimensions, + &query_data, + MergeStrategy::MERGE, + prefix_filter.map(|p| p.to_vec()), + ) + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to evaluate config: {}", + e + )) + }), + None => Err(SuperpositionError::ConfigError( + "No cached config available".into(), + )), + } + } +} + +#[async_trait] +impl AllFeatureProvider for LocalResolutionProvider { + async fn resolve_all_features( + &self, + context: &EvaluationContext, + ) -> Result> { + self.eval_with_context(context, None).await + } + + async fn resolve_all_features_with_filter( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + self.eval_with_context(context, prefix_filter).await + } +} + +#[async_trait] +impl FeatureExperimentMeta for LocalResolutionProvider { + async fn get_applicable_variants( + &self, + context: &EvaluationContext, + ) -> Result> { + self.ensure_fresh_data().await?; + + let (query_data, targeting_key) = + ConversionUtils::evaluation_context_to_query(context); + let dimensions_info = self.get_dimensions_info().await; + + let cached_exp = self.cached_experiments.read().await; + match cached_exp.as_ref() { + Some(exp_data) => { + get_applicable_variants( + &dimensions_info, + exp_data.experiments.clone(), + &exp_data.experiment_groups, + &query_data, + &targeting_key.unwrap_or_default(), + None, + ) + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to get applicable variants: {}", + e + )) + }) + } + None => Ok(vec![]), + } + } +} + +#[async_trait] +impl FeatureProvider for LocalResolutionProvider { + async fn initialize(&mut self, _context: &EvaluationContext) { + info!("Initializing LocalResolutionProvider..."); + { + let mut status = self.status.write().await; + *status = ProviderStatus::NotReady; + } + if (self.init().await).is_err() { + let mut status = self.status.write().await; + *status = ProviderStatus::Error; + return; + } + + let mut status = self.status.write().await; + *status = ProviderStatus::Ready; + + info!("LocalResolutionProvider initialized successfully"); + } + + async fn resolve_bool_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_bool() { + Some(bool_val) => Ok(ResolutionDetails::new(bool_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a boolean", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating boolean flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_string_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_str() { + Some(str_val) => Ok(ResolutionDetails::new(str_val.to_owned())), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a string", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating String flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_int_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_i64() { + Some(int_val) => Ok(ResolutionDetails::new(int_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not an integer", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating integer flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_float_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_f64() { + Some(float_val) => Ok(ResolutionDetails::new(float_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a float", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating float flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_struct_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match ConversionUtils::serde_value_to_struct_value(value) { + Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), + Err(e) => { + error!("Error converting value to StructValue: {}", e); + Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!( + "Flag '{}' is not a struct: {}", + flag_key, e + )), + }) + } + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating Object flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + fn metadata(&self) -> &ProviderMetadata { + &self.metadata + } + + fn status(&self) -> ProviderStatus { + match self.status.try_read() { + Ok(status) => match *status { + ProviderStatus::Ready => ProviderStatus::Ready, + ProviderStatus::Error => ProviderStatus::Error, + ProviderStatus::NotReady => ProviderStatus::NotReady, + ProviderStatus::STALE => ProviderStatus::STALE, + }, + Err(_) => ProviderStatus::NotReady, + } + } +} diff --git a/crates/superposition_provider/src/remote_provider.rs b/crates/superposition_provider/src/remote_provider.rs new file mode 100644 index 000000000..db560e3ad --- /dev/null +++ b/crates/superposition_provider/src/remote_provider.rs @@ -0,0 +1,506 @@ +use std::collections::HashMap; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use async_trait::async_trait; +use aws_smithy_types::Document; +use log::{debug, error, info, warn}; +use open_feature::{ + provider::FeatureProvider, + provider::{ProviderMetadata, ProviderStatus, ResolutionDetails}, + EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, +}; +use serde_json::{Map, Value}; +use superposition_sdk::{Client, Config as SdkConfig}; +use tokio::sync::RwLock; + +use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; +use crate::types::*; +use crate::utils::ConversionUtils; + +// --------------------------------------------------------------------------- +// ResponseCache internals +// --------------------------------------------------------------------------- + +struct CacheEntry { + value: Map, + created_at: Instant, +} + +struct ResponseCache { + entries: HashMap, + max_entries: usize, + ttl: Duration, +} + +impl ResponseCache { + fn new(max_entries: usize, ttl: Duration) -> Self { + Self { + entries: HashMap::new(), + max_entries, + ttl, + } + } + + fn get(&self, key: &str) -> Option<&Map> { + self.entries.get(key).and_then(|entry| { + if entry.created_at.elapsed() < self.ttl { + Some(&entry.value) + } else { + None + } + }) + } + + fn put(&mut self, key: String, value: Map) { + // If at capacity, evict expired entries first + if self.entries.len() >= self.max_entries { + let now = Instant::now(); + self.entries + .retain(|_, entry| now.duration_since(entry.created_at) < self.ttl); + } + + // If still at capacity, remove the oldest entry + if self.entries.len() >= self.max_entries { + if let Some(oldest_key) = self + .entries + .iter() + .min_by_key(|(_, entry)| entry.created_at) + .map(|(k, _)| k.clone()) + { + self.entries.remove(&oldest_key); + } + } + + self.entries.insert( + key, + CacheEntry { + value, + created_at: Instant::now(), + }, + ); + } + + fn cache_key(context: &EvaluationContext) -> String { + let mut parts: Vec = Vec::new(); + + // Include targeting_key + if let Some(ref tk) = context.targeting_key { + parts.push(format!("tk={}", tk)); + } + + // Include sorted custom_fields for deterministic keys + let mut field_keys: Vec<&String> = context.custom_fields.keys().collect(); + field_keys.sort(); + for k in field_keys { + if let Some(v) = context.custom_fields.get(k) { + let serde_val = + ConversionUtils::convert_evaluation_context_value_to_serde_value(v); + parts.push(format!("{}={}", k, serde_val)); + } + } + + parts.join("|") + } +} + +// --------------------------------------------------------------------------- +// SuperpositionAPIProvider +// --------------------------------------------------------------------------- + +pub struct SuperpositionAPIProvider { + options: SuperpositionOptions, + cache: Option>>, + metadata: ProviderMetadata, + status: RwLock, +} + +impl SuperpositionAPIProvider { + /// Create a new provider without response caching. + pub fn new(options: SuperpositionOptions) -> Self { + Self { + options, + cache: None, + metadata: ProviderMetadata { + name: "SuperpositionAPIProvider".to_string(), + }, + status: RwLock::new(ProviderStatus::NotReady), + } + } + + /// Create a new provider with response caching. + pub fn with_cache(options: SuperpositionOptions, cache_options: CacheOptions) -> Self { + let max_entries = cache_options.size.unwrap_or(1000); + let ttl = Duration::from_secs(cache_options.ttl.unwrap_or(300)); + let cache = ResponseCache::new(max_entries, ttl); + + Self { + options, + cache: Some(Arc::new(RwLock::new(cache))), + metadata: ProviderMetadata { + name: "SuperpositionAPIProvider".to_string(), + }, + status: RwLock::new(ProviderStatus::NotReady), + } + } + + fn create_client(&self) -> Client { + let sdk_config = SdkConfig::builder() + .endpoint_url(&self.options.endpoint) + .bearer_token(self.options.token.clone().into()) + .behavior_version_latest() + .build(); + + Client::from_conf(sdk_config) + } + + async fn resolve_remote( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + // 1. Check cache for the full (unfiltered) result + if let Some(ref cache_arc) = self.cache { + let cache_key = ResponseCache::cache_key(context); + let cache = cache_arc.read().await; + if let Some(cached_value) = cache.get(&cache_key) { + debug!("SuperpositionAPIProvider: cache hit for key"); + let result = if let Some(prefixes) = prefix_filter { + filter_by_prefix(cached_value, prefixes) + } else { + cached_value.clone() + }; + return Ok(result); + } + } + + // 2. Create SDK client + let client = self.create_client(); + + // 3. Extract context and targeting_key + let (query_data, _targeting_key) = + ConversionUtils::evaluation_context_to_query(context); + + // 4. Build and send the get_resolved_config request + // Always fetch WITHOUT prefix filter so we can cache the full result + let mut builder = client + .get_resolved_config() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id); + + // Set context dimensions from evaluation context + let sdk_context: HashMap = query_data + .iter() + .map(|(k, v)| (k.clone(), serde_value_to_document(v))) + .collect(); + builder = builder.set_context(Some(sdk_context)); + + // NOTE: We intentionally do NOT set prefix filter on the SDK request + // so we always get the full config and can cache it. Prefix filtering + // is applied locally after caching. + + let response = builder.send().await.map_err(|e| { + SuperpositionError::NetworkError(format!( + "Failed to get resolved config: {}", + e + )) + })?; + + // 5. Convert response Document to Map + let config_doc = response.config(); + let config_value = ConversionUtils::document_to_value(config_doc).map_err(|e| { + SuperpositionError::SerializationError(format!( + "Failed to convert resolved config response: {}", + e + )) + })?; + + let full_result = match config_value { + Value::Object(map) => map, + other => { + warn!( + "SuperpositionAPIProvider: resolved config is not an object, wrapping: {:?}", + other + ); + let mut map = Map::new(); + map.insert("_value".to_string(), other); + map + } + }; + + // Cache the full (unfiltered) result + if let Some(ref cache_arc) = self.cache { + let cache_key = ResponseCache::cache_key(context); + let mut cache = cache_arc.write().await; + cache.put(cache_key, full_result.clone()); + } + + // Apply prefix filtering locally + let result = if let Some(prefixes) = prefix_filter { + filter_by_prefix(&full_result, prefixes) + } else { + full_result + }; + + Ok(result) + } + +} + +// --------------------------------------------------------------------------- +// Helper functions +// --------------------------------------------------------------------------- + +/// Filter a config map to only include keys that start with one of the given prefixes. +fn filter_by_prefix(config: &Map, prefixes: &[String]) -> Map { + if prefixes.is_empty() { + return config.clone(); + } + config + .iter() + .filter(|(key, _)| prefixes.iter().any(|prefix| key.starts_with(prefix))) + .map(|(k, v)| (k.clone(), v.clone())) + .collect() +} + +/// Convert a serde_json::Value to an aws_smithy_types::Document. +fn serde_value_to_document(value: &Value) -> Document { + match value { + Value::Null => Document::Null, + Value::Bool(b) => Document::Bool(*b), + Value::Number(n) => { + if let Some(u) = n.as_u64() { + Document::Number(aws_smithy_types::Number::PosInt(u)) + } else if let Some(i) = n.as_i64() { + Document::Number(aws_smithy_types::Number::NegInt(i)) + } else if let Some(f) = n.as_f64() { + Document::Number(aws_smithy_types::Number::Float(f)) + } else { + Document::Null + } + } + Value::String(s) => Document::String(s.clone()), + Value::Array(arr) => { + Document::Array(arr.iter().map(serde_value_to_document).collect()) + } + Value::Object(obj) => { + let map: HashMap = obj + .iter() + .map(|(k, v)| (k.clone(), serde_value_to_document(v))) + .collect(); + Document::Object(map) + } + } +} + +// --------------------------------------------------------------------------- +// Trait implementations +// --------------------------------------------------------------------------- + +#[async_trait] +impl AllFeatureProvider for SuperpositionAPIProvider { + async fn resolve_all_features( + &self, + context: &EvaluationContext, + ) -> Result> { + self.resolve_remote(context, None).await + } + + async fn resolve_all_features_with_filter( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + self.resolve_remote(context, prefix_filter).await + } +} + +#[async_trait] +impl FeatureExperimentMeta for SuperpositionAPIProvider { + async fn get_applicable_variants( + &self, + _context: &EvaluationContext, + ) -> Result> { + // Remote resolution handles experiments server-side + Ok(vec![]) + } +} + +#[async_trait] +impl FeatureProvider for SuperpositionAPIProvider { + async fn initialize(&mut self, _context: &EvaluationContext) { + info!("Initializing SuperpositionAPIProvider..."); + { + let mut status = self.status.write().await; + *status = ProviderStatus::Ready; + } + info!("SuperpositionAPIProvider initialized successfully"); + } + + async fn resolve_bool_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_bool() { + Some(bool_val) => Ok(ResolutionDetails::new(bool_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a boolean", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating boolean flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_string_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_str() { + Some(str_val) => Ok(ResolutionDetails::new(str_val.to_owned())), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a string", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating String flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_int_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_i64() { + Some(int_val) => Ok(ResolutionDetails::new(int_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not an integer", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating integer flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_float_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_f64() { + Some(float_val) => Ok(ResolutionDetails::new(float_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a float", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating float flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + async fn resolve_struct_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match ConversionUtils::serde_value_to_struct_value(value) { + Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), + Err(e) => { + error!("Error converting value to StructValue: {}", e); + Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!( + "Flag '{}' is not a struct: {}", + flag_key, e + )), + }) + } + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + error!("Error evaluating Object flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }) + } + } + } + + fn metadata(&self) -> &ProviderMetadata { + &self.metadata + } + + fn status(&self) -> ProviderStatus { + match self.status.try_read() { + Ok(status) => match *status { + ProviderStatus::Ready => ProviderStatus::Ready, + ProviderStatus::Error => ProviderStatus::Error, + ProviderStatus::NotReady => ProviderStatus::NotReady, + ProviderStatus::STALE => ProviderStatus::STALE, + }, + Err(_) => ProviderStatus::NotReady, + } + } +} diff --git a/crates/superposition_provider/src/traits.rs b/crates/superposition_provider/src/traits.rs new file mode 100644 index 000000000..596379828 --- /dev/null +++ b/crates/superposition_provider/src/traits.rs @@ -0,0 +1,39 @@ +use async_trait::async_trait; +use open_feature::EvaluationContext; +use serde_json::{Map, Value}; + +use crate::types::Result; + +/// Trait for bulk configuration resolution. +/// +/// Implementors provide the ability to resolve all feature flags at once, +/// optionally filtered by key prefixes. +#[async_trait] +pub trait AllFeatureProvider: Send + Sync { + /// Resolve all features for the given evaluation context. + async fn resolve_all_features( + &self, + context: &EvaluationContext, + ) -> Result>; + + /// Resolve all features for the given evaluation context, optionally + /// filtered to only include keys matching the provided prefixes. + async fn resolve_all_features_with_filter( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result>; +} + +/// Trait for experiment variant resolution. +/// +/// Implementors provide the ability to determine which experiment variants +/// are applicable for a given evaluation context. +#[async_trait] +pub trait FeatureExperimentMeta: Send + Sync { + /// Get the list of applicable experiment variant IDs for the given context. + async fn get_applicable_variants( + &self, + context: &EvaluationContext, + ) -> Result>; +} diff --git a/crates/superposition_provider/src/types.rs b/crates/superposition_provider/src/types.rs index e407bcdfa..2fcafeb0a 100644 --- a/crates/superposition_provider/src/types.rs +++ b/crates/superposition_provider/src/types.rs @@ -105,10 +105,32 @@ impl Default for OnDemandStrategy { } } +/// Configuration for the watch refresh strategy. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WatchStrategy { + /// Debounce duration in milliseconds (default: 500). + pub debounce_ms: Option, +} + +impl Default for WatchStrategy { + fn default() -> Self { + Self { + debounce_ms: Some(500), + } + } +} + +/// A stream of change notifications from a data source. +pub struct WatchStream { + pub receiver: tokio::sync::mpsc::Receiver<()>, +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub enum RefreshStrategy { Polling(PollingStrategy), OnDemand(OnDemandStrategy), + Watch(WatchStrategy), + Manual, } impl Default for RefreshStrategy { diff --git a/crates/superposition_provider/src/utils.rs b/crates/superposition_provider/src/utils.rs index 9f5d400d4..fef2e089a 100644 --- a/crates/superposition_provider/src/utils.rs +++ b/crates/superposition_provider/src/utils.rs @@ -577,6 +577,26 @@ impl ConversionUtils { dimension_data } + /// Convert an EvaluationContext into a (Map, Option) tuple + /// containing the custom fields as serde values and the targeting key. + /// This is used by both local and remote providers. + pub fn evaluation_context_to_query( + ctx: &open_feature::EvaluationContext, + ) -> (Map, Option) { + let context = ctx + .custom_fields + .iter() + .map(|(k, v)| { + ( + k.clone(), + Self::convert_evaluation_context_value_to_serde_value(v), + ) + }) + .collect(); + + (context, ctx.targeting_key.clone()) + } + /// Convert Config back to the legacy format for compatibility with existing provider logic pub fn config_to_legacy_format(config: &Config) -> HashMap { let mut result = HashMap::new(); diff --git a/docs/plans/2026-02-14-configuration-resolver-design.md b/docs/plans/2026-02-14-configuration-resolver-design.md new file mode 100644 index 000000000..dc8261df5 --- /dev/null +++ b/docs/plans/2026-02-14-configuration-resolver-design.md @@ -0,0 +1,226 @@ +# Configuration Resolver (Superposition Provider Refactor) + +## Overview + +Refactor the `superposition_provider` crate to introduce a trait-based architecture with pluggable data sources, supporting both local (in-process) and remote configuration resolution. The existing implementation (`provider.rs`, `client.rs`) is kept for comparison. + +## Goals + +1. Define clean trait abstractions: `AllFeatureProvider`, `FeatureExperimentMeta`, `SuperpositionDataSource` +2. Support pluggable data sources (HTTP, File/TOML) via `SuperpositionDataSource` +3. Implement `LocalResolutionProvider` with primary + fallback data sources and multiple refresh strategies +4. Implement `SuperpositionAPIProvider` for remote resolution +5. All providers implement OpenFeature's `FeatureProvider` trait +6. Provide examples for HTTP, File, and primary+fallback configurations + +## Module Layout + +``` +crates/superposition_provider/src/ +├── lib.rs # Re-exports +├── types.rs # Error types, options (existing, extended) +├── traits.rs # AllFeatureProvider + FeatureExperimentMeta traits +├── data_source.rs # SuperpositionDataSource trait, ConfigData, ExperimentData +├── data_source/ +│ ├── http.rs # HttpDataSource +│ └── file.rs # FileDataSource (TOML) +├── local_provider.rs # LocalResolutionProvider +├── remote_provider.rs # SuperpositionAPIProvider +├── utils.rs # Existing ConversionUtils (kept) +├── provider.rs # Existing provider (kept for comparison) +└── client.rs # Existing client (kept for comparison) +``` + +Uses Rust 2018 module style (`data_source.rs` + `data_source/` directory, no `mod.rs`). + +## Core Traits + +### AllFeatureProvider + +Bulk configuration resolution. Returns all (or filtered) resolved config values. + +```rust +#[async_trait] +pub trait AllFeatureProvider: Send + Sync { + async fn resolve_all_features( + &self, + context: &EvaluationContext, + ) -> Result>; + + async fn resolve_all_features_with_filter( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result>; +} +``` + +### FeatureExperimentMeta + +Experiment variant resolution. + +```rust +#[async_trait] +pub trait FeatureExperimentMeta: Send + Sync { + async fn get_applicable_variants( + &self, + context: &EvaluationContext, + ) -> Result>; +} +``` + +### SuperpositionDataSource + +Abstraction for raw data fetching. Each source implements its own filtering logic. + +```rust +pub struct ConfigData { + pub config: Config, + pub fetched_at: DateTime, +} + +pub struct ExperimentData { + pub experiments: Experiments, + pub experiment_groups: ExperimentGroups, + pub fetched_at: DateTime, +} + +#[async_trait] +pub trait SuperpositionDataSource: Send + Sync { + async fn fetch_config(&self) -> Result; + + async fn fetch_filtered_config( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result; + + async fn fetch_active_experiments(&self) -> Result>; + + async fn fetch_candidate_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result>; + + async fn fetch_matching_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result>; + + fn supports_experiments(&self) -> bool; + + async fn close(&self) -> Result<()>; +} +``` + +- `fetch_candidate_active_experiments` - partial context matching (uses `Contextual::filter_by_eval`) +- `fetch_matching_active_experiments` - exact context matching (uses `Contextual::filter_exact_match`) + +## Data Source Implementations + +### HttpDataSource + +Wraps `superposition_sdk::Client`. Takes `SuperpositionOptions`. + +- `fetch_config` → `client.get_config()` +- `fetch_filtered_config` → fetches full config, filters locally via `Config::filter_by_prefix` / `Config::filter_by_dimensions` +- `fetch_active_experiments` → `client.list_experiment()` + `client.list_experiment_groups()` +- `fetch_candidate_active_experiments` → fetches all, filters via `Contextual::filter_by_eval` +- `fetch_matching_active_experiments` → fetches all, filters via `Contextual::filter_exact_match` +- `supports_experiments` → `true` +- `close` → no-op + +### FileDataSource + +Reads TOML config via `superposition_core::toml::parse_toml_config`. Takes `PathBuf`. + +- `fetch_config` → reads file, parses TOML +- `fetch_filtered_config` → parses full config, filters locally +- All experiment methods → `Ok(None)` +- `supports_experiments` → `false` +- `close` → no-op + +## LocalResolutionProvider + +In-process resolver with primary + optional fallback data source. + +```rust +pub struct LocalResolutionProvider { + primary: Box, + fallback: Option>, + refresh_strategy: RefreshStrategy, + cached_config: Arc>>, + cached_experiments: Arc>>, + polling_task: RwLock>>, +} +``` + +### Initialization + +1. Fetch from primary data source +2. If primary fails and fallback exists, fetch from fallback +3. If both fail, return error +4. Start refresh strategy + +### Refresh Strategies + +- **Polling** - spawns tokio task that periodically fetches from primary +- **OnDemand** - lazy fetch with TTL; uses stale data if fetch fails (configurable) +- **Manual** - no automatic refresh; caller invokes `refresh()` explicitly + +On refresh failure: keep last known good data (never overwrite cache with error). + +### Trait Implementations + +- **AllFeatureProvider**: reads cached config, calls `eval_config`. If experiments cached, calls `get_applicable_variants` and injects `variantIds` into context before evaluation. +- **FeatureExperimentMeta**: reads cached experiments/groups, calls `get_applicable_variants`. +- **FeatureProvider** (OpenFeature): delegates to `resolve_all_features`, extracts single key. + +### Public API + +```rust +impl LocalResolutionProvider { + pub fn new(primary, fallback, refresh_strategy) -> Self; + pub async fn init(&self) -> Result<()>; + pub async fn refresh(&self) -> Result<()>; + pub async fn close(&self) -> Result<()>; +} +``` + +## SuperpositionAPIProvider (Remote Resolution) + +Sends context over network, gets resolved config back. + +```rust +pub struct SuperpositionAPIProvider { + options: SuperpositionOptions, + cache: Option>, +} +``` + +- Uses `superposition_sdk::Client` to call resolve APIs +- Optional local response cache keyed on hash of (context + targeting_key) with TTL eviction +- Implements `AllFeatureProvider`, `FeatureExperimentMeta`, and OpenFeature `FeatureProvider` + +## EvaluationContext + +Re-uses `open_feature::EvaluationContext` directly. No custom wrapper type. All traits and providers accept `&EvaluationContext` from the OpenFeature SDK. + +## Examples + +Three example binaries in `crates/superposition_provider/examples/`: + +### `local_http_example.rs` +LocalResolutionProvider with HTTP source, polling refresh. + +### `local_file_example.rs` +LocalResolutionProvider with TOML file source, on-demand refresh. + +### `local_with_fallback_example.rs` +LocalResolutionProvider with HTTP primary + TOML fallback. Demonstrates: +- Bulk resolution (`resolve_all_features`) +- Filtered resolution (`resolve_all_features_with_filter`) +- Experiment variants (`get_applicable_variants`) +- Manual refresh (`refresh()`) diff --git a/docs/plans/2026-02-14-configuration-resolver-plan.md b/docs/plans/2026-02-14-configuration-resolver-plan.md new file mode 100644 index 000000000..e97031ad8 --- /dev/null +++ b/docs/plans/2026-02-14-configuration-resolver-plan.md @@ -0,0 +1,1987 @@ +# Configuration Resolver Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Refactor the `superposition_provider` crate to use a trait-based architecture with pluggable data sources (HTTP, File), supporting both local and remote configuration resolution. + +**Architecture:** Three core traits (`AllFeatureProvider`, `FeatureExperimentMeta`, `SuperpositionDataSource`) with two provider implementations (`LocalResolutionProvider`, `SuperpositionAPIProvider`). Data sources are pluggable via `SuperpositionDataSource` trait. All providers implement OpenFeature's `FeatureProvider`. + +**Tech Stack:** Rust, async-trait, tokio, serde_json, open-feature, superposition_core (eval_config, get_applicable_variants, parse_toml_config), superposition_sdk (HTTP client), superposition_types (Config, Contextual) + +**Design doc:** `docs/plans/2026-02-14-configuration-resolver-design.md` + +--- + +### Task 1: Define core traits (`traits.rs`) + +**Files:** +- Create: `crates/superposition_provider/src/traits.rs` +- Modify: `crates/superposition_provider/src/lib.rs` + +**Step 1: Create `traits.rs` with `AllFeatureProvider` and `FeatureExperimentMeta` traits** + +```rust +use async_trait::async_trait; +use open_feature::EvaluationContext; +use serde_json::{Map, Value}; + +use crate::types::Result; + +/// Trait for bulk configuration resolution +/// +/// Provides methods to resolve all feature flags at once, +/// which is more efficient than resolving them one by one. +#[async_trait] +pub trait AllFeatureProvider: Send + Sync { + /// Resolve all features for the given evaluation context + async fn resolve_all_features( + &self, + context: &EvaluationContext, + ) -> Result>; + + /// Resolve features matching prefix filters + /// + /// If prefix_filter is None, behaves like resolve_all_features + async fn resolve_all_features_with_filter( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result>; +} + +/// Trait for experiment metadata and variant resolution +#[async_trait] +pub trait FeatureExperimentMeta: Send + Sync { + /// Get applicable variant IDs for the given context + async fn get_applicable_variants( + &self, + context: &EvaluationContext, + ) -> Result>; +} +``` + +**Step 2: Add `traits` module to `lib.rs`** + +Add `pub mod traits;` to `crates/superposition_provider/src/lib.rs` and re-export: `pub use traits::*;` + +**Step 3: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles with no errors + +**Step 4: Commit** + +```bash +git add crates/superposition_provider/src/traits.rs crates/superposition_provider/src/lib.rs +git commit -m "feat: add AllFeatureProvider and FeatureExperimentMeta traits" +``` + +--- + +### Task 2: Define `SuperpositionDataSource` trait (`data_source.rs`) + +**Files:** +- Create: `crates/superposition_provider/src/data_source.rs` +- Modify: `crates/superposition_provider/src/lib.rs` + +**Step 1: Create `data_source.rs` with trait, `ConfigData`, and `ExperimentData`** + +```rust +use async_trait::async_trait; +use chrono::{DateTime, Utc}; +use serde_json::{Map, Value}; +use superposition_core::experiment::ExperimentGroups; +use superposition_core::Experiments; +use superposition_types::Config; + +use crate::types::Result; + +pub mod file; +pub mod http; + +/// Data fetched from a configuration source +#[derive(Debug, Clone)] +pub struct ConfigData { + pub config: Config, + pub fetched_at: DateTime, +} + +impl ConfigData { + pub fn new(config: Config) -> Self { + Self { + config, + fetched_at: Utc::now(), + } + } +} + +/// Experiment data fetched from a source +#[derive(Debug, Clone)] +pub struct ExperimentData { + pub experiments: Experiments, + pub experiment_groups: ExperimentGroups, + pub fetched_at: DateTime, +} + +impl ExperimentData { + pub fn new(experiments: Experiments, experiment_groups: ExperimentGroups) -> Self { + Self { + experiments, + experiment_groups, + fetched_at: Utc::now(), + } + } +} + +/// Trait for abstracting data sources for Superposition configuration and experiments +/// +/// Allows plugging different data sources (HTTP, File, Redis, etc.) +/// into the Superposition provider system. Each implementation handles +/// its own filtering logic. +#[async_trait] +pub trait SuperpositionDataSource: Send + Sync { + /// Fetch the latest configuration from the data source + async fn fetch_config(&self) -> Result; + + /// Fetch configuration with context/prefix filters + /// + /// Each data source implements its own filtering strategy. + /// HTTP may use server-side filtering; File filters after parse. + async fn fetch_filtered_config( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result; + + /// Fetch all active experiment data + /// + /// Returns None if the data source doesn't support experiments + async fn fetch_active_experiments(&self) -> Result>; + + /// Fetch active experiments filtered with partial context matching + /// + /// Uses partial/candidate matching - experiments whose context + /// could potentially match the given dimensions. + /// Returns None if the data source doesn't support experiments. + async fn fetch_candidate_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result>; + + /// Fetch active experiments filtered with exact context matching + /// + /// Uses exact matching - only experiments whose context + /// exactly matches the given dimensions. + /// Returns None if the data source doesn't support experiments. + async fn fetch_matching_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result>; + + /// Check if this data source supports experiments + fn supports_experiments(&self) -> bool; + + /// Close and cleanup resources used by this data source + async fn close(&self) -> Result<()>; +} +``` + +**Step 2: Create placeholder files for submodules** + +Create empty `crates/superposition_provider/src/data_source/http.rs` and `crates/superposition_provider/src/data_source/file.rs` (just comments for now so it compiles). + +**Step 3: Add `data_source` module to `lib.rs`** + +Add `pub mod data_source;` and re-export: `pub use data_source::{ConfigData, ExperimentData, SuperpositionDataSource};` + +**Step 4: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles with no errors + +**Step 5: Commit** + +```bash +git add crates/superposition_provider/src/data_source.rs crates/superposition_provider/src/data_source/ crates/superposition_provider/src/lib.rs +git commit -m "feat: add SuperpositionDataSource trait with ConfigData and ExperimentData" +``` + +--- + +### Task 3: Implement `HttpDataSource` + +**Files:** +- Modify: `crates/superposition_provider/src/data_source/http.rs` + +**Reference files:** +- `crates/superposition_provider/src/client.rs` (existing HTTP fetch logic in `CacConfig::get_config_static`, `ExperimentationConfig::get_experiments_static`, `ExperimentationConfig::get_experiment_groups_static`) +- `crates/superposition_provider/src/utils.rs` (`ConversionUtils::convert_get_config_response`, `convert_experiments_response`, `convert_experiment_groups_response`) + +**Step 1: Implement `HttpDataSource` struct and `SuperpositionDataSource` trait** + +```rust +use std::collections::HashSet; + +use async_trait::async_trait; +use log::info; +use serde_json::{Map, Value}; +use superposition_types::logic::{apply, partial_apply}; + +use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::types::{Result, SuperpositionError, SuperpositionOptions}; +use crate::utils::ConversionUtils; + +/// HTTP-based data source using the Superposition SDK +/// +/// Fetches configuration and experiment data from the Superposition +/// service over HTTP. +pub struct HttpDataSource { + options: SuperpositionOptions, +} + +impl HttpDataSource { + pub fn new(options: SuperpositionOptions) -> Self { + Self { options } + } + + fn create_client(&self) -> superposition_sdk::Client { + use superposition_sdk::{Client, Config as SdkConfig}; + + let sdk_config = SdkConfig::builder() + .endpoint_url(&self.options.endpoint) + .bearer_token(self.options.token.clone().into()) + .behavior_version_latest() + .build(); + + Client::from_conf(sdk_config) + } + + async fn fetch_experiments_and_groups(&self) -> Result { + use superposition_sdk::types::ExperimentStatusType; + + let client = self.create_client(); + + let (experiments_result, groups_result) = tokio::join!( + client + .list_experiment() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .all(true) + .status(ExperimentStatusType::Created) + .status(ExperimentStatusType::Inprogress) + .send(), + client + .list_experiment_groups() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .all(true) + .send() + ); + + let experiments_response = experiments_result.map_err(|e| { + SuperpositionError::NetworkError(format!("Failed to list experiments: {}", e)) + })?; + let groups_response = groups_result.map_err(|e| { + SuperpositionError::NetworkError(format!("Failed to list experiment groups: {}", e)) + })?; + + let experiments = ConversionUtils::convert_experiments_response(&experiments_response)?; + let groups = ConversionUtils::convert_experiment_groups_response(&groups_response)?; + + Ok(ExperimentData::new(experiments, groups)) + } + + /// Filter experiments by partial context match (any dimension matches) + fn filter_experiments_candidate( + exp_data: &ExperimentData, + context: &Map, + ) -> ExperimentData { + let filtered_experiments = exp_data + .experiments + .iter() + .filter(|exp| partial_apply(&exp.context, context)) + .cloned() + .collect(); + + let filtered_groups = exp_data + .experiment_groups + .iter() + .filter(|group| partial_apply(&group.context, context)) + .cloned() + .collect(); + + ExperimentData::new(filtered_experiments, filtered_groups) + } + + /// Filter experiments by exact context match (all dimensions must match) + fn filter_experiments_matching( + exp_data: &ExperimentData, + context: &Map, + ) -> ExperimentData { + let filtered_experiments = exp_data + .experiments + .iter() + .filter(|exp| apply(&exp.context, context)) + .cloned() + .collect(); + + let filtered_groups = exp_data + .experiment_groups + .iter() + .filter(|group| apply(&group.context, context)) + .cloned() + .collect(); + + ExperimentData::new(filtered_experiments, filtered_groups) + } + + /// Filter experiments by prefix - keep experiments that have variants + /// with override keys matching any of the given prefixes + fn filter_experiments_by_prefix( + exp_data: &ExperimentData, + prefixes: &[String], + ) -> ExperimentData { + let filtered_experiments = exp_data + .experiments + .iter() + .filter(|exp| { + exp.variants.iter().any(|variant| { + let overrides: Map = variant.overrides.clone().into(); + overrides.keys().any(|key| { + prefixes.iter().any(|prefix| key.starts_with(prefix)) + }) + }) + }) + .cloned() + .collect(); + + // Keep all groups - they reference experiments by ID + ExperimentData::new(filtered_experiments, exp_data.experiment_groups.clone()) + } +} + +#[async_trait] +impl SuperpositionDataSource for HttpDataSource { + async fn fetch_config(&self) -> Result { + let client = self.create_client(); + + info!("HttpDataSource: fetching config"); + + let response = client + .get_config() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .send() + .await + .map_err(|e| { + SuperpositionError::NetworkError(format!("Failed to get config: {}", e)) + })?; + + let config = ConversionUtils::convert_get_config_response(&response)?; + Ok(ConfigData::new(config)) + } + + async fn fetch_filtered_config( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result { + let config_data = self.fetch_config().await?; + let mut config = config_data.config; + + if let Some(ctx) = context { + if !ctx.is_empty() { + config = config.filter_by_dimensions(ctx); + } + } + + if let Some(prefixes) = prefix_filter { + if !prefixes.is_empty() { + config = config.filter_by_prefix(&HashSet::from_iter(prefixes.iter().cloned())); + } + } + + Ok(ConfigData::new(config)) + } + + async fn fetch_active_experiments(&self) -> Result> { + let data = self.fetch_experiments_and_groups().await?; + Ok(Some(data)) + } + + async fn fetch_candidate_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result> { + let mut data = self.fetch_experiments_and_groups().await?; + + if let Some(ctx) = context { + if !ctx.is_empty() { + data = Self::filter_experiments_candidate(&data, ctx); + } + } + + if let Some(prefixes) = prefix_filter { + if !prefixes.is_empty() { + data = Self::filter_experiments_by_prefix(&data, prefixes); + } + } + + Ok(Some(data)) + } + + async fn fetch_matching_active_experiments( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result> { + let mut data = self.fetch_experiments_and_groups().await?; + + if let Some(ctx) = context { + if !ctx.is_empty() { + data = Self::filter_experiments_matching(&data, ctx); + } + } + + if let Some(prefixes) = prefix_filter { + if !prefixes.is_empty() { + data = Self::filter_experiments_by_prefix(&data, prefixes); + } + } + + Ok(Some(data)) + } + + fn supports_experiments(&self) -> bool { + true + } + + async fn close(&self) -> Result<()> { + Ok(()) + } +} +``` + +**Step 2: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles with no errors (may need minor adjustments for `partial_apply` / `apply` import paths) + +**Step 3: Commit** + +```bash +git add crates/superposition_provider/src/data_source/http.rs +git commit -m "feat: implement HttpDataSource for SuperpositionDataSource trait" +``` + +--- + +### Task 4: Implement `FileDataSource` + +**Files:** +- Modify: `crates/superposition_provider/src/data_source/file.rs` + +**Reference files:** +- `crates/superposition_core/src/toml.rs` (`parse_toml_config`) + +**Step 1: Implement `FileDataSource`** + +```rust +use std::collections::HashSet; +use std::path::PathBuf; + +use async_trait::async_trait; +use log::info; +use serde_json::{Map, Value}; +use superposition_core::toml::parse_toml_config; + +use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::types::{Result, SuperpositionError}; + +/// File-based data source using TOML configuration files +/// +/// Reads configuration from a TOML file using `superposition_core::toml::parse_toml_config`. +/// Does not support experiments - all experiment methods return `Ok(None)`. +pub struct FileDataSource { + file_path: PathBuf, +} + +impl FileDataSource { + pub fn new(file_path: PathBuf) -> Self { + Self { file_path } + } +} + +#[async_trait] +impl SuperpositionDataSource for FileDataSource { + async fn fetch_config(&self) -> Result { + info!("FileDataSource: reading config from {:?}", self.file_path); + + let content = tokio::fs::read_to_string(&self.file_path) + .await + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to read config file {:?}: {}", + self.file_path, e + )) + })?; + + let config = parse_toml_config(&content).map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to parse TOML config from {:?}: {}", + self.file_path, e + )) + })?; + + Ok(ConfigData::new(config)) + } + + async fn fetch_filtered_config( + &self, + context: Option<&Map>, + prefix_filter: Option<&[String]>, + ) -> Result { + let config_data = self.fetch_config().await?; + let mut config = config_data.config; + + if let Some(ctx) = context { + if !ctx.is_empty() { + config = config.filter_by_dimensions(ctx); + } + } + + if let Some(prefixes) = prefix_filter { + if !prefixes.is_empty() { + config = config.filter_by_prefix(&HashSet::from_iter(prefixes.iter().cloned())); + } + } + + Ok(ConfigData::new(config)) + } + + async fn fetch_active_experiments(&self) -> Result> { + Ok(None) + } + + async fn fetch_candidate_active_experiments( + &self, + _context: Option<&Map>, + _prefix_filter: Option<&[String]>, + ) -> Result> { + Ok(None) + } + + async fn fetch_matching_active_experiments( + &self, + _context: Option<&Map>, + _prefix_filter: Option<&[String]>, + ) -> Result> { + Ok(None) + } + + fn supports_experiments(&self) -> bool { + false + } + + async fn close(&self) -> Result<()> { + Ok(()) + } +} +``` + +**Step 2: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles with no errors + +**Step 3: Commit** + +```bash +git add crates/superposition_provider/src/data_source/file.rs +git commit -m "feat: implement FileDataSource for SuperpositionDataSource trait" +``` + +--- + +### Task 5: Add `Manual` variant to `RefreshStrategy` + +**Files:** +- Modify: `crates/superposition_provider/src/types.rs` + +**Step 1: Add `Manual` variant to `RefreshStrategy` enum** + +Add to the existing `RefreshStrategy` enum in `types.rs`: + +```rust +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum RefreshStrategy { + Polling(PollingStrategy), + OnDemand(OnDemandStrategy), + Manual, +} +``` + +**Step 2: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles (existing match statements in `client.rs` will need a `Manual` arm - add a no-op arm if needed) + +**Step 3: Commit** + +```bash +git add crates/superposition_provider/src/types.rs crates/superposition_provider/src/client.rs +git commit -m "feat: add Manual variant to RefreshStrategy" +``` + +--- + +### Task 6: Implement `LocalResolutionProvider` + +**Files:** +- Create: `crates/superposition_provider/src/local_provider.rs` +- Modify: `crates/superposition_provider/src/lib.rs` + +**Reference files:** +- `crates/superposition_provider/src/provider.rs` (existing `SuperpositionProvider` for pattern reference) +- `crates/superposition_provider/src/client.rs` (existing refresh/polling logic) +- `crates/superposition_core/src/config.rs` (`eval_config`) +- `crates/superposition_core/src/experiment.rs` (`get_applicable_variants`) + +**Step 1: Create `local_provider.rs` with struct and construction/init/refresh/close** + +```rust +use std::collections::HashMap; +use std::sync::Arc; + +use async_trait::async_trait; +use log::{debug, error, info, warn}; +use open_feature::{ + provider::{FeatureProvider, ProviderMetadata, ProviderStatus, ResolutionDetails}, + EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, +}; +use serde_json::{Map, Value}; +use superposition_core::{eval_config, get_applicable_variants, MergeStrategy}; +use superposition_types::DimensionInfo; +use tokio::sync::RwLock; +use tokio::task::JoinHandle; +use tokio::time::{sleep, Duration}; + +use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; +use crate::types::*; +use crate::utils::ConversionUtils; + +/// Local (in-process) resolution provider +/// +/// Caches raw configuration and experiment data from a primary data source +/// (with optional fallback), and resolves configuration locally using +/// `superposition_core::eval_config`. +pub struct LocalResolutionProvider { + primary: Arc, + fallback: Option>, + refresh_strategy: RefreshStrategy, + cached_config: Arc>>, + cached_experiments: Arc>>, + polling_task: RwLock>>, + metadata: ProviderMetadata, + status: RwLock, +} + +impl LocalResolutionProvider { + pub fn new( + primary: Box, + fallback: Option>, + refresh_strategy: RefreshStrategy, + ) -> Self { + Self { + primary: Arc::from(primary), + fallback: fallback.map(Arc::from), + refresh_strategy, + cached_config: Arc::new(RwLock::new(None)), + cached_experiments: Arc::new(RwLock::new(None)), + polling_task: RwLock::new(None), + metadata: ProviderMetadata { + name: "LocalResolutionProvider".to_string(), + }, + status: RwLock::new(ProviderStatus::NotReady), + } + } + + /// Initialize the provider: fetch initial data and start refresh strategy + pub async fn init(&self) -> Result<()> { + info!("Initializing LocalResolutionProvider..."); + + // Try primary first + let config_result = self.primary.fetch_config().await; + let exp_result = self.primary.fetch_active_experiments().await; + + match config_result { + Ok(config_data) => { + let mut cached = self.cached_config.write().await; + *cached = Some(config_data); + info!("Config fetched from primary data source"); + } + Err(primary_err) => { + warn!("Primary data source failed: {}", primary_err); + // Try fallback + if let Some(fallback) = &self.fallback { + match fallback.fetch_config().await { + Ok(config_data) => { + let mut cached = self.cached_config.write().await; + *cached = Some(config_data); + info!("Config fetched from fallback data source"); + } + Err(fallback_err) => { + error!("Fallback data source also failed: {}", fallback_err); + return Err(SuperpositionError::ConfigError(format!( + "Both primary ({}) and fallback ({}) data sources failed", + primary_err, fallback_err + ))); + } + } + } else { + return Err(primary_err); + } + } + } + + // Handle experiments (best-effort, only if primary supports them) + match exp_result { + Ok(Some(exp_data)) => { + let mut cached = self.cached_experiments.write().await; + *cached = Some(exp_data); + info!("Experiments fetched from primary data source"); + } + Ok(None) => { + debug!("Primary data source does not support experiments"); + } + Err(e) => { + warn!("Failed to fetch experiments from primary: {}", e); + // Try fallback for experiments + if let Some(fallback) = &self.fallback { + if fallback.supports_experiments() { + match fallback.fetch_active_experiments().await { + Ok(Some(exp_data)) => { + let mut cached = self.cached_experiments.write().await; + *cached = Some(exp_data); + info!("Experiments fetched from fallback data source"); + } + _ => { + warn!("Fallback also failed to fetch experiments"); + } + } + } + } + } + } + + // Start refresh strategy + match &self.refresh_strategy { + RefreshStrategy::Polling(strategy) => { + info!("Starting polling with interval={}s", strategy.interval); + let task = self.start_polling(strategy.interval).await; + let mut polling_task = self.polling_task.write().await; + *polling_task = Some(task); + } + RefreshStrategy::OnDemand(strategy) => { + info!("Using on-demand strategy with ttl={}s", strategy.ttl); + } + RefreshStrategy::Manual => { + info!("Using manual refresh strategy"); + } + } + + let mut status = self.status.write().await; + *status = ProviderStatus::Ready; + + info!("LocalResolutionProvider initialized successfully"); + Ok(()) + } + + /// Manually refresh data from the primary data source + pub async fn refresh(&self) -> Result<()> { + info!("Manual refresh triggered"); + self.do_refresh().await + } + + /// Close the provider and clean up resources + pub async fn close(&self) -> Result<()> { + let mut polling_task = self.polling_task.write().await; + if let Some(task) = polling_task.take() { + task.abort(); + } + + self.primary.close().await?; + if let Some(fallback) = &self.fallback { + fallback.close().await?; + } + + let mut cached_config = self.cached_config.write().await; + *cached_config = None; + let mut cached_experiments = self.cached_experiments.write().await; + *cached_experiments = None; + + let mut status = self.status.write().await; + *status = ProviderStatus::NotReady; + + Ok(()) + } + + async fn do_refresh(&self) -> Result<()> { + // Fetch config - keep last known good on failure + match self.primary.fetch_config().await { + Ok(config_data) => { + let mut cached = self.cached_config.write().await; + *cached = Some(config_data); + debug!("Config refreshed from primary"); + } + Err(e) => { + warn!("Refresh failed for config, keeping last known good: {}", e); + } + } + + // Fetch experiments - keep last known good on failure + if self.primary.supports_experiments() { + match self.primary.fetch_active_experiments().await { + Ok(Some(exp_data)) => { + let mut cached = self.cached_experiments.write().await; + *cached = Some(exp_data); + debug!("Experiments refreshed from primary"); + } + Ok(None) => {} + Err(e) => { + warn!( + "Refresh failed for experiments, keeping last known good: {}", + e + ); + } + } + } + + Ok(()) + } + + async fn start_polling(&self, interval: u64) -> JoinHandle<()> { + let primary = self.primary.clone(); + let cached_config = self.cached_config.clone(); + let cached_experiments = self.cached_experiments.clone(); + + tokio::spawn(async move { + loop { + sleep(Duration::from_secs(interval)).await; + + match primary.fetch_config().await { + Ok(config_data) => { + let mut cached = cached_config.write().await; + *cached = Some(config_data); + debug!("Config updated via polling"); + } + Err(e) => { + error!("Polling config refresh failed: {}", e); + } + } + + if primary.supports_experiments() { + match primary.fetch_active_experiments().await { + Ok(Some(exp_data)) => { + let mut cached = cached_experiments.write().await; + *cached = Some(exp_data); + debug!("Experiments updated via polling"); + } + Ok(None) => {} + Err(e) => { + error!("Polling experiments refresh failed: {}", e); + } + } + } + } + }) + } + + async fn ensure_fresh_data(&self) -> Result<()> { + if let RefreshStrategy::OnDemand(strategy) = &self.refresh_strategy { + let should_refresh = { + let cached = self.cached_config.read().await; + match cached.as_ref() { + Some(data) => { + let elapsed = chrono::Utc::now() - data.fetched_at; + elapsed.num_seconds() > strategy.ttl as i64 + } + None => true, + } + }; + + if should_refresh { + debug!("On-demand TTL expired, refreshing"); + if let Err(e) = self.do_refresh().await { + if !strategy.use_stale_on_error.unwrap_or(false) { + return Err(e); + } + warn!("On-demand refresh failed, using stale data: {}", e); + } + } + } + Ok(()) + } + + fn get_context_from_evaluation_context( + evaluation_context: &EvaluationContext, + ) -> (Map, Option) { + let context = evaluation_context + .custom_fields + .iter() + .map(|(k, v)| { + ( + k.clone(), + ConversionUtils::convert_evaluation_context_value_to_serde_value(v), + ) + }) + .collect(); + + (context, evaluation_context.targeting_key.clone()) + } + + async fn get_dimensions_info(&self) -> HashMap { + let cached = self.cached_config.read().await; + cached + .as_ref() + .map(|d| d.config.dimensions.clone()) + .unwrap_or_default() + } + + async fn eval_with_context( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + self.ensure_fresh_data().await?; + + let (mut query_data, targeting_key) = + Self::get_context_from_evaluation_context(context); + + let dimensions_info = self.get_dimensions_info().await; + + // Get experiment variants if available + let cached_experiments = self.cached_experiments.read().await; + if let Some(exp_data) = cached_experiments.as_ref() { + let variant_ids = get_applicable_variants( + &dimensions_info, + exp_data.experiments.clone(), + &exp_data.experiment_groups, + &query_data, + &targeting_key.unwrap_or_default(), + prefix_filter.map(|p| p.to_vec()), + ) + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to get applicable variants: {}", + e + )) + })?; + + query_data.insert( + "variantIds".to_string(), + Value::Array(variant_ids.into_iter().map(Value::String).collect()), + ); + } + drop(cached_experiments); + + // Evaluate config + let cached_config = self.cached_config.read().await; + match cached_config.as_ref() { + Some(config_data) => eval_config( + (*config_data.config.default_configs).clone(), + &config_data.config.contexts, + &config_data.config.overrides, + &config_data.config.dimensions, + &query_data, + MergeStrategy::MERGE, + prefix_filter.map(|p| p.to_vec()), + ) + .map_err(|e| { + SuperpositionError::ConfigError(format!("Failed to evaluate config: {}", e)) + }), + None => Err(SuperpositionError::ConfigError( + "No cached config available".into(), + )), + } + } +} +``` + +**Step 2: Implement `AllFeatureProvider` for `LocalResolutionProvider`** + +```rust +#[async_trait] +impl AllFeatureProvider for LocalResolutionProvider { + async fn resolve_all_features( + &self, + context: &EvaluationContext, + ) -> Result> { + self.eval_with_context(context, None).await + } + + async fn resolve_all_features_with_filter( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + self.eval_with_context(context, prefix_filter).await + } +} +``` + +**Step 3: Implement `FeatureExperimentMeta` for `LocalResolutionProvider`** + +```rust +#[async_trait] +impl FeatureExperimentMeta for LocalResolutionProvider { + async fn get_applicable_variants( + &self, + context: &EvaluationContext, + ) -> Result> { + self.ensure_fresh_data().await?; + + let (query_data, targeting_key) = + Self::get_context_from_evaluation_context(context); + let dimensions_info = self.get_dimensions_info().await; + + let cached_experiments = self.cached_experiments.read().await; + match cached_experiments.as_ref() { + Some(exp_data) => get_applicable_variants( + &dimensions_info, + exp_data.experiments.clone(), + &exp_data.experiment_groups, + &query_data, + &targeting_key.unwrap_or_default(), + None, + ) + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to get applicable variants: {}", + e + )) + }), + None => Ok(vec![]), + } + } +} +``` + +**Step 4: Implement `FeatureProvider` (OpenFeature) for `LocalResolutionProvider`** + +Follow the same pattern as `crates/superposition_provider/src/provider.rs`: + +```rust +#[async_trait] +impl FeatureProvider for LocalResolutionProvider { + async fn initialize(&mut self, _context: &EvaluationContext) { + info!("Initializing LocalResolutionProvider via OpenFeature..."); + { + let mut status = self.status.write().await; + *status = ProviderStatus::NotReady; + } + if (self.init().await).is_err() { + let mut status = self.status.write().await; + *status = ProviderStatus::Error; + return; + } + let mut status = self.status.write().await; + *status = ProviderStatus::Ready; + } + + async fn resolve_bool_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(bool_val) = value.as_bool() { + return Ok(ResolutionDetails::new(bool_val)); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found in configuration".to_string()), + }) + } + Err(e) => { + error!("Error evaluating boolean flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error evaluating flag: {}", e)), + }) + } + } + } + + async fn resolve_string_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(str_val) = value.as_str() { + return Ok(ResolutionDetails::new(str_val.to_owned())); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found in configuration".to_string()), + }) + } + Err(e) => { + error!("Error evaluating string flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error evaluating flag: {}", e)), + }) + } + } + } + + async fn resolve_int_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(int_val) = value.as_i64() { + return Ok(ResolutionDetails::new(int_val)); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found in configuration".to_string()), + }) + } + Err(e) => { + error!("Error evaluating integer flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error evaluating flag: {}", e)), + }) + } + } + } + + async fn resolve_float_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(float_val) = value.as_f64() { + return Ok(ResolutionDetails::new(float_val)); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found in configuration".to_string()), + }) + } + Err(e) => { + error!("Error evaluating float flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error evaluating flag: {}", e)), + }) + } + } + } + + async fn resolve_struct_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + match ConversionUtils::serde_value_to_struct_value(value) { + Ok(struct_value) => { + return Ok(ResolutionDetails::new(struct_value)); + } + Err(e) => { + return Err(EvaluationError { + code: EvaluationErrorCode::ParseError, + message: Some(format!("Failed to parse struct value: {}", e)), + }); + } + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found in configuration".to_string()), + }) + } + Err(e) => { + error!("Error evaluating struct flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error evaluating flag: {}", e)), + }) + } + } + } + + fn metadata(&self) -> &ProviderMetadata { + &self.metadata + } + + fn status(&self) -> ProviderStatus { + match self.status.try_read() { + Ok(status) => match *status { + ProviderStatus::Ready => ProviderStatus::Ready, + ProviderStatus::Error => ProviderStatus::Error, + ProviderStatus::NotReady => ProviderStatus::NotReady, + ProviderStatus::STALE => ProviderStatus::STALE, + }, + Err(_) => ProviderStatus::NotReady, + } + } +} +``` + +**Step 5: Add module to `lib.rs`** + +Add `pub mod local_provider;` and re-export: `pub use local_provider::LocalResolutionProvider;` + +**Step 6: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles with no errors + +**Step 7: Commit** + +```bash +git add crates/superposition_provider/src/local_provider.rs crates/superposition_provider/src/lib.rs +git commit -m "feat: implement LocalResolutionProvider with primary/fallback and refresh strategies" +``` + +--- + +### Task 7: Implement `SuperpositionAPIProvider` (Remote Resolution) + +**Files:** +- Create: `crates/superposition_provider/src/remote_provider.rs` +- Modify: `crates/superposition_provider/src/lib.rs` + +**Step 1: Create `remote_provider.rs`** + +Note: This provider calls a resolve API endpoint that accepts context and returns already-resolved config. The exact SDK method for remote resolution needs to be verified against the `superposition_sdk` crate. If a dedicated resolve endpoint exists, use it. Otherwise, this provider can use `get_config` + local eval as a fallback (similar to LocalResolutionProvider but without caching raw data). + +```rust +use std::collections::HashMap; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use async_trait::async_trait; +use log::{debug, error, info}; +use open_feature::{ + provider::{FeatureProvider, ProviderMetadata, ProviderStatus, ResolutionDetails}, + EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, +}; +use serde_json::{Map, Value}; +use tokio::sync::RwLock; + +use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; +use crate::types::*; +use crate::utils::ConversionUtils; + +struct CacheEntry { + value: Map, + created_at: Instant, +} + +struct ResponseCache { + entries: HashMap, + max_entries: usize, + ttl: Duration, +} + +impl ResponseCache { + fn new(max_entries: usize, ttl: Duration) -> Self { + Self { + entries: HashMap::new(), + max_entries, + ttl, + } + } + + fn get(&self, key: &str) -> Option<&Map> { + self.entries.get(key).and_then(|entry| { + if entry.created_at.elapsed() < self.ttl { + Some(&entry.value) + } else { + None + } + }) + } + + fn put(&mut self, key: String, value: Map) { + // Evict expired entries if at capacity + if self.entries.len() >= self.max_entries { + self.entries + .retain(|_, entry| entry.created_at.elapsed() < self.ttl); + } + // If still at capacity, remove oldest + if self.entries.len() >= self.max_entries { + if let Some(oldest_key) = self + .entries + .iter() + .min_by_key(|(_, entry)| entry.created_at) + .map(|(k, _)| k.clone()) + { + self.entries.remove(&oldest_key); + } + } + self.entries.insert( + key, + CacheEntry { + value, + created_at: Instant::now(), + }, + ); + } + + fn cache_key(context: &EvaluationContext) -> String { + // Hash the context for cache key + let mut parts: Vec = Vec::new(); + if let Some(tk) = &context.targeting_key { + parts.push(format!("tk:{}", tk)); + } + let mut field_keys: Vec<&String> = context.custom_fields.keys().collect(); + field_keys.sort(); + for key in field_keys { + let value = &context.custom_fields[key]; + parts.push(format!( + "{}:{}", + key, + ConversionUtils::convert_evaluation_context_value_to_serde_value(value) + )); + } + parts.join("|") + } +} + +/// Remote resolution provider using the Superposition API +/// +/// Sends evaluation context over the network and receives resolved +/// configuration from the Superposition service. +pub struct SuperpositionAPIProvider { + options: SuperpositionOptions, + cache: Option>>, + metadata: ProviderMetadata, + status: RwLock, +} + +impl SuperpositionAPIProvider { + pub fn new(options: SuperpositionOptions) -> Self { + Self { + options, + cache: None, + metadata: ProviderMetadata { + name: "SuperpositionAPIProvider".to_string(), + }, + status: RwLock::new(ProviderStatus::Ready), + } + } + + pub fn with_cache(options: SuperpositionOptions, cache_options: CacheOptions) -> Self { + let cache = ResponseCache::new( + cache_options.size.unwrap_or(1000), + Duration::from_secs(cache_options.ttl.unwrap_or(300)), + ); + Self { + options, + cache: Some(Arc::new(RwLock::new(cache))), + metadata: ProviderMetadata { + name: "SuperpositionAPIProvider".to_string(), + }, + status: RwLock::new(ProviderStatus::Ready), + } + } + + fn create_client(&self) -> superposition_sdk::Client { + use superposition_sdk::{Client, Config as SdkConfig}; + + let sdk_config = SdkConfig::builder() + .endpoint_url(&self.options.endpoint) + .bearer_token(self.options.token.clone().into()) + .behavior_version_latest() + .build(); + + Client::from_conf(sdk_config) + } + + async fn resolve_remote( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + // Check cache first + if let Some(cache) = &self.cache { + let cache_key = ResponseCache::cache_key(context); + let cache_read = cache.read().await; + if let Some(cached) = cache_read.get(&cache_key) { + debug!("Cache hit for context"); + let result = if let Some(prefixes) = prefix_filter { + cached + .iter() + .filter(|(k, _)| prefixes.iter().any(|p| k.starts_with(p))) + .map(|(k, v)| (k.clone(), v.clone())) + .collect() + } else { + cached.clone() + }; + return Ok(result); + } + drop(cache_read); + } + + let client = self.create_client(); + + let (query_data, targeting_key) = Self::get_context_from_evaluation_context(context); + + // Use the SDK resolve API + // Build query parameters from the context + let mut request = client + .get_resolved_config() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id); + + // Add targeting key if present + if let Some(tk) = &targeting_key { + request = request.targeting_key(tk.as_str()); + } + + // Add context fields as query parameters + // The resolve API typically accepts context as a JSON body or query params + // Using the SDK's built-in method for passing context + for (key, value) in &query_data { + request = request.context(key.clone(), value.to_string()); + } + + if let Some(prefixes) = prefix_filter { + for prefix in prefixes { + request = request.filter_keys(prefix.clone()); + } + } + + let response = request.send().await.map_err(|e| { + SuperpositionError::NetworkError(format!("Failed to resolve config: {}", e)) + })?; + + // Convert response to Map + let config = ConversionUtils::convert_get_config_response(&response)?; + + // For remote resolution, the response should already be resolved + // We return the default_configs as the resolved values + let result: Map = (*config.default_configs).clone(); + + // Cache the result + if let Some(cache) = &self.cache { + let cache_key = ResponseCache::cache_key(context); + let mut cache_write = cache.write().await; + cache_write.put(cache_key, result.clone()); + } + + Ok(result) + } + + fn get_context_from_evaluation_context( + evaluation_context: &EvaluationContext, + ) -> (Map, Option) { + let context = evaluation_context + .custom_fields + .iter() + .map(|(k, v)| { + ( + k.clone(), + ConversionUtils::convert_evaluation_context_value_to_serde_value(v), + ) + }) + .collect(); + + (context, evaluation_context.targeting_key.clone()) + } +} + +#[async_trait] +impl AllFeatureProvider for SuperpositionAPIProvider { + async fn resolve_all_features( + &self, + context: &EvaluationContext, + ) -> Result> { + self.resolve_remote(context, None).await + } + + async fn resolve_all_features_with_filter( + &self, + context: &EvaluationContext, + prefix_filter: Option<&[String]>, + ) -> Result> { + self.resolve_remote(context, prefix_filter).await + } +} + +#[async_trait] +impl FeatureExperimentMeta for SuperpositionAPIProvider { + async fn get_applicable_variants( + &self, + _context: &EvaluationContext, + ) -> Result> { + // Remote resolution handles experiments server-side + // The resolved config already includes experiment results + // Return empty - variants are already applied in the resolved config + Ok(vec![]) + } +} + +#[async_trait] +impl FeatureProvider for SuperpositionAPIProvider { + async fn initialize(&mut self, _context: &EvaluationContext) { + let mut status = self.status.write().await; + *status = ProviderStatus::Ready; + } + + async fn resolve_bool_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(bool_val) = value.as_bool() { + return Ok(ResolutionDetails::new(bool_val)); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found".to_string()), + }) + } + Err(e) => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error: {}", e)), + }), + } + } + + async fn resolve_string_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(str_val) = value.as_str() { + return Ok(ResolutionDetails::new(str_val.to_owned())); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found".to_string()), + }) + } + Err(e) => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error: {}", e)), + }), + } + } + + async fn resolve_int_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(int_val) = value.as_i64() { + return Ok(ResolutionDetails::new(int_val)); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found".to_string()), + }) + } + Err(e) => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error: {}", e)), + }), + } + } + + async fn resolve_float_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + if let Some(float_val) = value.as_f64() { + return Ok(ResolutionDetails::new(float_val)); + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found".to_string()), + }) + } + Err(e) => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error: {}", e)), + }), + } + } + + async fn resolve_struct_value( + &self, + flag_key: &str, + evaluation_context: &EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => { + if let Some(value) = config.get(flag_key) { + match ConversionUtils::serde_value_to_struct_value(value) { + Ok(struct_value) => { + return Ok(ResolutionDetails::new(struct_value)); + } + Err(e) => { + return Err(EvaluationError { + code: EvaluationErrorCode::ParseError, + message: Some(format!("Failed to parse struct value: {}", e)), + }); + } + } + } + Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some("Flag not found".to_string()), + }) + } + Err(e) => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Error: {}", e)), + }), + } + } + + fn metadata(&self) -> &ProviderMetadata { + &self.metadata + } + + fn status(&self) -> ProviderStatus { + match self.status.try_read() { + Ok(status) => match *status { + ProviderStatus::Ready => ProviderStatus::Ready, + ProviderStatus::Error => ProviderStatus::Error, + ProviderStatus::NotReady => ProviderStatus::NotReady, + ProviderStatus::STALE => ProviderStatus::STALE, + }, + Err(_) => ProviderStatus::NotReady, + } + } +} +``` + +**Step 2: Add module to `lib.rs`** + +Add `pub mod remote_provider;` and re-export: `pub use remote_provider::SuperpositionAPIProvider;` + +**Step 3: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles (the `get_resolved_config` SDK method may need adjustment based on actual SDK API - check `superposition_sdk` for the correct method name and parameters) + +**Step 4: Commit** + +```bash +git add crates/superposition_provider/src/remote_provider.rs crates/superposition_provider/src/lib.rs +git commit -m "feat: implement SuperpositionAPIProvider for remote resolution" +``` + +--- + +### Task 8: Update `lib.rs` with final re-exports + +**Files:** +- Modify: `crates/superposition_provider/src/lib.rs` + +**Step 1: Update `lib.rs` to export all new modules** + +```rust +// Existing modules (kept for comparison) +pub mod client; +pub mod provider; +pub mod types; +pub mod utils; + +// New trait-based architecture +pub mod data_source; +pub mod local_provider; +pub mod remote_provider; +pub mod traits; + +// Re-exports - existing +pub use client::*; +pub use provider::*; +pub use types::*; + +// Re-exports - new +pub use data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; +pub use local_provider::LocalResolutionProvider; +pub use remote_provider::SuperpositionAPIProvider; +pub use traits::*; + +pub use open_feature::{ + provider::{ProviderMetadata, ProviderStatus, ResolutionDetails}, + EvaluationContext, +}; +``` + +**Step 2: Verify it compiles** + +Run: `cargo check -p superposition_provider` +Expected: compiles with no errors + +**Step 3: Commit** + +```bash +git add crates/superposition_provider/src/lib.rs +git commit -m "feat: update lib.rs with re-exports for new trait-based architecture" +``` + +--- + +### Task 9: Create examples + +**Files:** +- Create: `crates/superposition_provider/examples/local_http_example.rs` +- Create: `crates/superposition_provider/examples/local_file_example.rs` +- Create: `crates/superposition_provider/examples/local_with_fallback_example.rs` + +**Step 1: Create `local_http_example.rs`** + +```rust +use open_feature::EvaluationContext; +use superposition_provider::{ + data_source::http::HttpDataSource, + local_provider::LocalResolutionProvider, + traits::{AllFeatureProvider, FeatureExperimentMeta}, + PollingStrategy, RefreshStrategy, SuperpositionOptions, +}; + +#[tokio::main] +async fn main() { + env_logger::init(); + + let http_source = HttpDataSource::new(SuperpositionOptions::new( + "http://localhost:8080".to_string(), + "token".to_string(), + "org1".to_string(), + "workspace1".to_string(), + )); + + let provider = LocalResolutionProvider::new( + Box::new(http_source), + None, + RefreshStrategy::Polling(PollingStrategy { + interval: 30, + timeout: Some(10), + }), + ); + provider.init().await.unwrap(); + + let context = EvaluationContext::default() + .with_targeting_key("user-123") + .with_custom_field("os", "android"); + + // AllFeatureProvider usage + let all_config = provider.resolve_all_features(&context).await.unwrap(); + println!("All config: {:?}", all_config); + + // FeatureExperimentMeta usage + let variants = provider.get_applicable_variants(&context).await.unwrap(); + println!("Variants: {:?}", variants); + + provider.close().await.unwrap(); +} +``` + +**Step 2: Create `local_file_example.rs`** + +```rust +use std::path::PathBuf; + +use open_feature::EvaluationContext; +use superposition_provider::{ + data_source::file::FileDataSource, + local_provider::LocalResolutionProvider, + traits::AllFeatureProvider, + OnDemandStrategy, RefreshStrategy, +}; + +#[tokio::main] +async fn main() { + env_logger::init(); + + let file_source = FileDataSource::new(PathBuf::from("./config.toml")); + + let provider = LocalResolutionProvider::new( + Box::new(file_source), + None, + RefreshStrategy::OnDemand(OnDemandStrategy { + ttl: 60, + ..Default::default() + }), + ); + provider.init().await.unwrap(); + + let context = EvaluationContext::default() + .with_custom_field("os", "linux"); + + let config = provider.resolve_all_features(&context).await.unwrap(); + println!("Config: {:?}", config); + + provider.close().await.unwrap(); +} +``` + +**Step 3: Create `local_with_fallback_example.rs`** + +```rust +use std::path::PathBuf; + +use open_feature::EvaluationContext; +use superposition_provider::{ + data_source::file::FileDataSource, + data_source::http::HttpDataSource, + local_provider::LocalResolutionProvider, + traits::{AllFeatureProvider, FeatureExperimentMeta}, + PollingStrategy, RefreshStrategy, SuperpositionOptions, +}; + +#[tokio::main] +async fn main() { + env_logger::init(); + + // Primary: HTTP data source + let http_source = HttpDataSource::new(SuperpositionOptions::new( + "http://localhost:8080".to_string(), + "token".to_string(), + "org1".to_string(), + "workspace1".to_string(), + )); + + // Fallback: TOML file data source + let file_source = FileDataSource::new(PathBuf::from("./config.toml")); + + let provider = LocalResolutionProvider::new( + Box::new(http_source), + Some(Box::new(file_source)), + RefreshStrategy::Polling(PollingStrategy { + interval: 30, + timeout: Some(10), + }), + ); + provider.init().await.unwrap(); + + let context = EvaluationContext::default() + .with_targeting_key("user-456") + .with_custom_field("os", "android") + .with_custom_field("app_version", "3.2.1"); + + // Bulk resolution + let all_config = provider.resolve_all_features(&context).await.unwrap(); + println!("All config: {:?}", all_config); + + // Filtered resolution + let filtered = provider + .resolve_all_features_with_filter( + &context, + Some(&["payment.".to_string(), "ui.".to_string()]), + ) + .await + .unwrap(); + println!("Filtered config: {:?}", filtered); + + // Experiment variants + let variants = provider.get_applicable_variants(&context).await.unwrap(); + println!("Variants: {:?}", variants); + + // Manual refresh + provider.refresh().await.unwrap(); + + provider.close().await.unwrap(); +} +``` + +**Step 4: Add `env_logger` dev-dependency to `Cargo.toml`** + +Add to `[dev-dependencies]` in `crates/superposition_provider/Cargo.toml`: +```toml +[dev-dependencies] +env_logger = "0.11" +``` + +**Step 5: Verify examples compile** + +Run: `cargo check -p superposition_provider --examples` +Expected: compiles with no errors + +**Step 6: Commit** + +```bash +git add crates/superposition_provider/examples/ crates/superposition_provider/Cargo.toml +git commit -m "feat: add examples for LocalResolutionProvider with HTTP, File, and fallback" +``` + +--- + +### Task 10: Final verification + +**Step 1: Run full crate check** + +Run: `cargo check -p superposition_provider` +Expected: compiles with no errors and no warnings + +**Step 2: Run existing tests** + +Run: `cargo test -p superposition_provider -- --skip test_rust_provider_integration` +Expected: existing unit tests pass + +**Step 3: Check examples compile** + +Run: `cargo check -p superposition_provider --examples` +Expected: compiles + +**Step 4: Run workspace check to ensure no regressions** + +Run: `cargo check --workspace` +Expected: no compilation errors in any crate + +**Step 5: Commit any final fixes** + +```bash +git add -A +git commit -m "fix: final adjustments for configuration resolver implementation" +``` From c474de61d01b5bd4ddc97b014b41c2205605bba0 Mon Sep 17 00:00:00 2001 From: Natarajan Kannan Date: Wed, 18 Feb 2026 12:16:12 +0530 Subject: [PATCH 10/16] chore: address code-rabbit comments --- .../src/local_provider.rs | 35 +++++++++++++------ .../src/remote_provider.rs | 35 +++++++++++++------ 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/crates/superposition_provider/src/local_provider.rs b/crates/superposition_provider/src/local_provider.rs index dbcfbbeb6..f62d641e1 100644 --- a/crates/superposition_provider/src/local_provider.rs +++ b/crates/superposition_provider/src/local_provider.rs @@ -556,8 +556,11 @@ impl FeatureProvider for LocalResolutionProvider { Err(e) => { error!("Error evaluating boolean flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -585,8 +588,11 @@ impl FeatureProvider for LocalResolutionProvider { Err(e) => { error!("Error evaluating String flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -614,8 +620,11 @@ impl FeatureProvider for LocalResolutionProvider { Err(e) => { error!("Error evaluating integer flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -643,8 +652,11 @@ impl FeatureProvider for LocalResolutionProvider { Err(e) => { error!("Error evaluating float flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -678,8 +690,11 @@ impl FeatureProvider for LocalResolutionProvider { Err(e) => { error!("Error evaluating Object flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } diff --git a/crates/superposition_provider/src/remote_provider.rs b/crates/superposition_provider/src/remote_provider.rs index db560e3ad..69d310562 100644 --- a/crates/superposition_provider/src/remote_provider.rs +++ b/crates/superposition_provider/src/remote_provider.rs @@ -359,8 +359,11 @@ impl FeatureProvider for SuperpositionAPIProvider { Err(e) => { error!("Error evaluating boolean flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -388,8 +391,11 @@ impl FeatureProvider for SuperpositionAPIProvider { Err(e) => { error!("Error evaluating String flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -417,8 +423,11 @@ impl FeatureProvider for SuperpositionAPIProvider { Err(e) => { error!("Error evaluating integer flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -446,8 +455,11 @@ impl FeatureProvider for SuperpositionAPIProvider { Err(e) => { error!("Error evaluating float flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } @@ -481,8 +493,11 @@ impl FeatureProvider for SuperpositionAPIProvider { Err(e) => { error!("Error evaluating Object flag {}: {}", flag_key, e); Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), }) } } From 48f6b3d194ab0ebf255e3d27b13dcb280b484400 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Fri, 20 Mar 2026 00:49:24 +0530 Subject: [PATCH 11/16] feat: WIP --- crates/cac_client/src/lib.rs | 17 +- crates/superposition_provider/src/client.rs | 6 +- .../superposition_provider/src/conversions.rs | 76 +++++++ .../superposition_provider/src/data_source.rs | 126 ++++++++++- .../src/data_source/file.rs | 203 ++++++++++++------ crates/superposition_provider/src/lib.rs | 1 + crates/superposition_provider/src/types.rs | 2 +- crates/superposition_provider/src/utils.rs | 182 ++++------------ crates/superposition_types/src/config.rs | 78 ++++--- .../superposition_types/src/config/tests.rs | 22 +- crates/superposition_types/src/overridden.rs | 14 ++ 11 files changed, 464 insertions(+), 263 deletions(-) create mode 100644 crates/superposition_provider/src/conversions.rs diff --git a/crates/cac_client/src/lib.rs b/crates/cac_client/src/lib.rs index 5848d1f57..ce40eaec5 100644 --- a/crates/cac_client/src/lib.rs +++ b/crates/cac_client/src/lib.rs @@ -160,20 +160,11 @@ impl Client { prefix: Option>, ) -> Result { let cac = self.config.read().await; - let mut config = cac.to_owned(); - if let Some(prefix_list) = prefix { - config = config.filter_by_prefix(&HashSet::from_iter(prefix_list)); - } - - let dimension_filtered_config = query_data - .filter(|query_map| !query_map.is_empty()) - .map(|query_map| config.filter_by_dimensions(&query_map)); - - if let Some(filtered_config) = dimension_filtered_config { - config = filtered_config; - }; + let filtered_config = cac + .to_owned() + .filter(query_data.as_ref(), prefix.map(HashSet::from_iter).as_ref()); - Ok(config) + Ok(filtered_config) } pub async fn get_last_modified(&self) -> DateTime { diff --git a/crates/superposition_provider/src/client.rs b/crates/superposition_provider/src/client.rs index 8e829fe20..135d0ab73 100644 --- a/crates/superposition_provider/src/client.rs +++ b/crates/superposition_provider/src/client.rs @@ -215,7 +215,7 @@ impl CacConfig { })?; // Use ConversionUtils to convert to proper Config type - let config = ConversionUtils::convert_get_config_response(&response)?; + let config = ConversionUtils::convert_get_config_response(response)?; info!("Successfully fetched and converted config with {} contexts, {} overrides, {} default configs", config.contexts.len(), config.overrides.len(), config.default_configs.len()); @@ -518,7 +518,7 @@ impl ExperimentationConfig { )) })?; - let experiments = ConversionUtils::convert_experiments_response(&response)?; + let experiments = ConversionUtils::convert_experiments_response(response)?; info!( "Successfully fetched and converted {} experiments", @@ -559,7 +559,7 @@ impl ExperimentationConfig { })?; let experiment_groups = - ConversionUtils::convert_experiment_groups_response(&response)?; + ConversionUtils::convert_experiment_groups_response(response)?; info!( "Successfully fetched and converted {} experiment groups", diff --git a/crates/superposition_provider/src/conversions.rs b/crates/superposition_provider/src/conversions.rs new file mode 100644 index 000000000..8c6a5992b --- /dev/null +++ b/crates/superposition_provider/src/conversions.rs @@ -0,0 +1,76 @@ +use std::collections::HashMap; + +use aws_smithy_types::Document; +use serde_json::{Map, Value}; + +pub fn value_to_document(value: Value) -> Document { + match value { + Value::Null => Document::Null, + Value::Bool(b) => Document::Bool(b), + Value::Number(n) => { + if let Some(i) = n.as_i64() { + Document::Number(aws_smithy_types::Number::NegInt(i.into())) + } else if let Some(u) = n.as_u64() { + Document::Number(aws_smithy_types::Number::PosInt(u.into())) + } else if let Some(f) = n.as_f64() { + Document::Number(aws_smithy_types::Number::Float(f)) + } else { + Document::Null + } + } + Value::String(s) => Document::String(s), + Value::Array(arr) => { + Document::Array(arr.into_iter().map(value_to_document).collect()) + } + Value::Object(obj) => { + let map = obj + .into_iter() + .map(|(k, v)| (k, value_to_document(v))) + .collect(); + Document::Object(map) + } + } +} + +pub fn map_to_hashmap(map: Map) -> HashMap { + map.into_iter() + .map(|(k, v)| (k, value_to_document(v))) + .collect() +} + +pub fn hashmap_to_map(hashmap: HashMap) -> Map { + hashmap + .into_iter() + .map(|(k, v)| (k, document_to_value(v))) + .collect() +} + +/// Recursively convert AWS Smithy Document to serde_json::Value by properly matching variants +pub fn document_to_value(doc: Document) -> Value { + match doc { + Document::Object(obj) => { + let hashmap = obj + .into_iter() + .map(|(k, v)| (k, document_to_value(v))) + .collect(); + Value::Object(hashmap) + } + Document::Array(arr) => { + Value::Array(arr.into_iter().map(document_to_value).collect()) + } + Document::Number(num) => { + use aws_smithy_types::Number; + match num { + Number::PosInt(val) => Value::Number(serde_json::Number::from(val)), + Number::NegInt(val) => Value::Number(serde_json::Number::from(val)), + Number::Float(val) => Value::Number( + serde_json::Number::from_f64(val) + .unwrap_or_else(|| serde_json::Number::from(0)), + ), + } + } + Document::String(s) => Value::String(s), + Document::Bool(b) => Value::Bool(b), + Document::Null => Value::Null, + } +} diff --git a/crates/superposition_provider/src/data_source.rs b/crates/superposition_provider/src/data_source.rs index 1b499f4ea..f4e3add51 100644 --- a/crates/superposition_provider/src/data_source.rs +++ b/crates/superposition_provider/src/data_source.rs @@ -1,6 +1,8 @@ pub mod file; pub mod http; +use std::fmt::Display; + use async_trait::async_trait; use chrono::{DateTime, Utc}; use serde_json::{Map, Value}; @@ -10,6 +12,40 @@ use superposition_types::Config; use crate::types::Result; +pub enum FetchResponse { + NotModified, + Data(T), +} + +impl FetchResponse { + pub fn is_not_modified(&self) -> bool { + matches!(self, FetchResponse::NotModified) + } + + pub fn into_data(self) -> Option { + match self { + FetchResponse::Data(data) => Some(data), + FetchResponse::NotModified => None, + } + } + + pub fn map_data U>(self, f: F) -> FetchResponse { + match self { + FetchResponse::Data(data) => FetchResponse::Data(f(data)), + FetchResponse::NotModified => FetchResponse::NotModified, + } + } +} + +impl Display for FetchResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + FetchResponse::NotModified => write!(f, "NotModified"), + FetchResponse::Data(data) => write!(f, "Data({})", data), + } + } +} + /// Holds a resolved configuration along with the time it was fetched. #[derive(Debug, Clone)] pub struct ConfigData { @@ -26,6 +62,56 @@ impl ConfigData { } } +pub struct ExperimentResponse { + pub data: Experiments, + pub fetched_at: DateTime, +} + +impl ExperimentResponse { + pub fn new(experiments: Experiments) -> Self { + Self { + data: experiments, + fetched_at: Utc::now(), + } + } +} + +impl Display for ExperimentResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "ExperimentResponse(data: {} experiments, fetched_at: {})", + self.data.len(), + self.fetched_at + ) + } +} + +pub struct ExperimentGroupResponse { + pub data: ExperimentGroups, + pub fetched_at: DateTime, +} + +impl ExperimentGroupResponse { + pub fn new(experiment_groups: ExperimentGroups) -> Self { + Self { + data: experiment_groups, + fetched_at: Utc::now(), + } + } +} + +impl Display for ExperimentGroupResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "ExperimentGroupResponse(data: {} experiment groups, fetched_at: {})", + self.data.len(), + self.fetched_at + ) + } +} + /// Holds active experiments and experiment groups along with the time they were fetched. #[derive(Debug, Clone)] pub struct ExperimentData { @@ -51,32 +137,50 @@ impl ExperimentData { #[async_trait] pub trait SuperpositionDataSource: Send + Sync { /// Fetch the full resolved configuration. - async fn fetch_config(&self) -> Result; + async fn fetch_config( + &self, + last_fetched_at: Option>, + ) -> Result>; /// Fetch a resolved configuration filtered by the given context and key prefixes. async fn fetch_filtered_config( &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result; + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result>; /// Fetch all active experiments. - async fn fetch_active_experiments(&self) -> Result>; + async fn fetch_active_experiments( + &self, + last_fetched_at: Option>, + ) -> Result<( + FetchResponse, + FetchResponse, + )>; /// Fetch active experiments whose conditions are candidates for the given context /// and key prefixes. async fn fetch_candidate_active_experiments( &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result>; + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result<( + FetchResponse, + FetchResponse, + )>; /// Fetch active experiments that match the given context and key prefixes. async fn fetch_matching_active_experiments( &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result>; + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result<( + FetchResponse, + FetchResponse, + )>; /// Whether this data source supports experiments. fn supports_experiments(&self) -> bool; diff --git a/crates/superposition_provider/src/data_source/file.rs b/crates/superposition_provider/src/data_source/file.rs index 0bed088cb..1c18c3051 100644 --- a/crates/superposition_provider/src/data_source/file.rs +++ b/crates/superposition_provider/src/data_source/file.rs @@ -1,19 +1,25 @@ -use std::collections::HashSet; use std::path::PathBuf; use std::sync::{Arc, Mutex}; use async_trait::async_trait; +use chrono::{DateTime, Utc}; use log::error; use notify::{Event, RecommendedWatcher, Watcher}; use serde_json::{Map, Value}; -use superposition_core::toml::parse_toml_config; +use superposition_core::{ConfigFormat, TomlFormat}; +use tokio::sync::broadcast; -use super::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::data_source::FetchResponse; use crate::types::{Result, SuperpositionError, WatchStream}; +use super::{ + ConfigData, ExperimentGroupResponse, ExperimentResponse, SuperpositionDataSource, +}; + pub struct FileDataSource { file_path: PathBuf, watcher: Arc>>, + broadcast_tx: Arc>>>, } impl FileDataSource { @@ -21,76 +27,91 @@ impl FileDataSource { Self { file_path, watcher: Arc::new(Mutex::new(None)), + broadcast_tx: Arc::new(Mutex::new(None)), } } } #[async_trait] impl SuperpositionDataSource for FileDataSource { - async fn fetch_config(&self) -> Result { - let content = - tokio::fs::read_to_string(&self.file_path) - .await - .map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to read config file {:?}: {}", - self.file_path, e - )) - })?; - - let config = parse_toml_config(&content).map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to parse TOML config: {}", - e - )) + async fn fetch_config( + &self, + _: Option>, + ) -> Result> { + let content = tokio::fs::read_to_string(&self.file_path) + .await + .map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to read config file {:?}: {}", + self.file_path, e + )) + })?; + + let config = TomlFormat::parse_config(&content).map_err(|e| { + SuperpositionError::ConfigError(format!("Failed to parse TOML config: {}", e)) })?; - Ok(ConfigData::new(config)) + Ok(FetchResponse::Data(ConfigData::new(config))) } async fn fetch_filtered_config( &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result { - let config_data = self.fetch_config().await?; - let mut config = config_data.config; - - if let Some(ctx) = context { - if !ctx.is_empty() { - config = config.filter_by_dimensions(ctx); - } - } - - if let Some(prefixes) = prefix_filter { - if !prefixes.is_empty() { - let prefix_set: HashSet = - HashSet::from_iter(prefixes.iter().cloned()); - config = config.filter_by_prefix(&prefix_set); - } - } - - Ok(ConfigData::new(config)) + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result> { + let resp = self + .fetch_config(last_fetched_at) + .await? + .map_data(|mut data| { + data.config = data.config.filter( + context.as_ref(), + prefix_filter.map(|p| p.into_iter().collect()).as_ref(), + ); + data + }); + + Ok(resp) } - async fn fetch_active_experiments(&self) -> Result> { - Ok(None) + async fn fetch_active_experiments( + &self, + _last_fetched_at: Option>, + ) -> Result<( + FetchResponse, + FetchResponse, + )> { + Err(SuperpositionError::ConfigError( + "Experiments not supported by FileDataSource".into(), + )) } async fn fetch_candidate_active_experiments( &self, - _context: Option<&Map>, - _prefix_filter: Option<&[String]>, - ) -> Result> { - Ok(None) + _context: Option>, + _prefix_filter: Option>, + _last_fetched_at: Option>, + ) -> Result<( + FetchResponse, + FetchResponse, + )> { + Err(SuperpositionError::ConfigError( + "Experiments not supported by FileDataSource".into(), + )) } async fn fetch_matching_active_experiments( &self, - _context: Option<&Map>, - _prefix_filter: Option<&[String]>, - ) -> Result> { - Ok(None) + _context: Option>, + _prefix_filter: Option>, + _last_fetched_at: Option>, + ) -> Result<( + FetchResponse, + FetchResponse, + )> { + Err(SuperpositionError::ConfigError( + "Experiments not supported by FileDataSource".into(), + )) } fn supports_experiments(&self) -> bool { @@ -98,20 +119,43 @@ impl SuperpositionDataSource for FileDataSource { } fn watch(&self) -> Result> { - let (tx, rx) = tokio::sync::mpsc::channel(16); + // Check if already watching - return a new subscriber to existing broadcast + let tx_guard = self.broadcast_tx.lock().map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to lock broadcast mutex: {}", + e + )) + })?; + + if let Some(tx) = tx_guard.as_ref() { + // Already watching - return a new subscriber + return Ok(Some(WatchStream { + receiver: tx.subscribe(), + })); + } + + // Drop the lock before creating the watcher to avoid holding lock during setup + drop(tx_guard); + + // Create broadcast channel for multiple consumers + let (tx, _rx) = broadcast::channel(16); + let tx_clone = tx.clone(); - let mut watcher = notify::recommended_watcher(move |res: std::result::Result| { - match res { + let mut watcher = notify::recommended_watcher( + move |res: std::result::Result| match res { Ok(_event) => { - let _ = tx.try_send(()); + let _ = tx_clone.send(()); } Err(e) => { error!("FileDataSource: watch error: {}", e); } - } - }) + }, + ) .map_err(|e| { - SuperpositionError::ConfigError(format!("Failed to create file watcher: {}", e)) + SuperpositionError::ConfigError(format!( + "Failed to create file watcher: {}", + e + )) })?; watcher @@ -123,19 +167,52 @@ impl SuperpositionDataSource for FileDataSource { )) })?; - let mut guard = self.watcher.lock().map_err(|e| { - SuperpositionError::ConfigError(format!("Failed to lock watcher mutex: {}", e)) + let mut watcher_guard = self.watcher.lock().map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to lock watcher mutex: {}", + e + )) + })?; + + let mut tx_guard = self.broadcast_tx.lock().map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to lock broadcast mutex: {}", + e + )) })?; - *guard = Some(watcher); - Ok(Some(WatchStream { receiver: rx })) + // Double-check in case another thread raced us + if let Some(tx) = tx_guard.as_ref() { + return Ok(Some(WatchStream { + receiver: tx.subscribe(), + })); + } + + *watcher_guard = Some(watcher); + *tx_guard = Some(tx.clone()); + + Ok(Some(WatchStream { + receiver: tx.subscribe(), + })) } async fn close(&self) -> Result<()> { let mut guard = self.watcher.lock().map_err(|e| { - SuperpositionError::ConfigError(format!("Failed to lock watcher mutex: {}", e)) + SuperpositionError::ConfigError(format!( + "Failed to lock watcher mutex: {}", + e + )) })?; *guard = None; + + let mut tx_guard = self.broadcast_tx.lock().map_err(|e| { + SuperpositionError::ConfigError(format!( + "Failed to lock broadcast mutex: {}", + e + )) + })?; + *tx_guard = None; + Ok(()) } } diff --git a/crates/superposition_provider/src/lib.rs b/crates/superposition_provider/src/lib.rs index a97757c15..7a27ea5da 100644 --- a/crates/superposition_provider/src/lib.rs +++ b/crates/superposition_provider/src/lib.rs @@ -1,4 +1,5 @@ pub mod client; +pub mod conversions; pub mod data_source; pub mod local_provider; pub mod provider; diff --git a/crates/superposition_provider/src/types.rs b/crates/superposition_provider/src/types.rs index 2fcafeb0a..292e2b8a6 100644 --- a/crates/superposition_provider/src/types.rs +++ b/crates/superposition_provider/src/types.rs @@ -122,7 +122,7 @@ impl Default for WatchStrategy { /// A stream of change notifications from a data source. pub struct WatchStream { - pub receiver: tokio::sync::mpsc::Receiver<()>, + pub receiver: tokio::sync::broadcast::Receiver<()>, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/crates/superposition_provider/src/utils.rs b/crates/superposition_provider/src/utils.rs index fef2e089a..8d699a996 100644 --- a/crates/superposition_provider/src/utils.rs +++ b/crates/superposition_provider/src/utils.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; -use aws_smithy_types::Document; use log::debug; use serde_json::{json, Map, Value}; use superposition_core::experiment::{ExperimentGroups, FfiExperimentGroup}; @@ -18,43 +17,39 @@ use superposition_types::{ Overrides, }; -use crate::types::*; +use crate::{conversions, types::*}; pub struct ConversionUtils; impl ConversionUtils { pub fn convert_get_config_response( - response: &superposition_sdk::operation::get_config::GetConfigOutput, + response: superposition_sdk::operation::get_config::GetConfigOutput, ) -> Result { debug!("Converting get_config response to superposition_types::Config"); // Convert default configs - these are already Value types - let default_configs = - Self::convert_condition_document(response.default_configs())?; + let default_configs = conversions::hashmap_to_map(response.default_configs); // Convert overrides - HashMap> - let overrides = { - let mut result_map = HashMap::new(); - for (override_key, inner_map) in response.overrides() { - let override_values = Self::convert_condition_document(inner_map)?; - - // Create Overrides directly from Map - let overrides_obj = Cac::::try_from(override_values) + let overrides = response + .overrides + .into_iter() + .map(|(k, v)| { + let override_values = conversions::hashmap_to_map(v); + let override_obj = Cac::::try_from(override_values) .map_err(|e| SuperpositionError::SerializationError(e.to_string()))?; - - result_map.insert(override_key.clone(), overrides_obj.into_inner()); - } - result_map - }; + Ok((k, override_obj.into_inner())) + }) + .collect::>>()?; // Convert contexts - Vec let contexts = response - .contexts() - .iter() + .contexts + .into_iter() .map(|context_partial| { // Convert condition Document to Map let condition_map = - Self::convert_condition_document(context_partial.condition())?; + conversions::hashmap_to_map(context_partial.condition); // Create Condition directly from Map let condition = @@ -65,48 +60,40 @@ impl ConversionUtils { )) })?; - let override_with_keys = OverrideWithKeys::try_from( - context_partial.override_with_keys().to_vec(), - ) - .map_err(|e| { - SuperpositionError::SerializationError(format!( - "Invalid override_with_keys: {e}", - )) - })?; + let override_with_keys = + OverrideWithKeys::try_from(context_partial.override_with_keys) + .map_err(|e| { + SuperpositionError::SerializationError(format!( + "Invalid override_with_keys: {e}", + )) + })?; Ok(Context { - id: context_partial.id().to_string(), + id: context_partial.id, condition: condition.into_inner(), - priority: context_partial.priority(), - weight: context_partial.weight(), + priority: context_partial.priority, + weight: context_partial.weight, override_with_keys, }) }) .collect::>>()?; let dimensions = response - .dimensions() - .iter() + .dimensions + .into_iter() .map(|(key, dimension_info)| { - let schema = dimension_info - .schema() - .iter() - .map(|(k, v)| Self::document_to_value(v).map(|val| (k.clone(), val))) - .collect::>>()?; + let schema = conversions::hashmap_to_map(dimension_info.schema); let dim_info = DimensionInfo { schema: ExtendedMap::from(schema), - position: dimension_info.position(), + position: dimension_info.position, dimension_type: Self::try_dimension_type( - dimension_info.dimension_type(), + dimension_info.dimension_type, )?, - dependency_graph: DependencyGraph( - dimension_info.dependency_graph().clone(), - ), + dependency_graph: DependencyGraph(dimension_info.dependency_graph), value_compute_function_name: dimension_info - .value_compute_function_name() - .map(String::from), + .value_compute_function_name, }; - Ok((key.clone(), dim_info)) + Ok((key, dim_info)) }) .collect::>>()?; @@ -124,14 +111,14 @@ impl ConversionUtils { } fn try_dimension_type( - dim_type: &superposition_sdk::types::DimensionType, + dim_type: superposition_sdk::types::DimensionType, ) -> Result { match dim_type { superposition_sdk::types::DimensionType::RemoteCohort(cohort_based_on) => { - Ok(DimensionType::RemoteCohort(cohort_based_on.clone())) + Ok(DimensionType::RemoteCohort(cohort_based_on)) } superposition_sdk::types::DimensionType::LocalCohort(cohort_based_on) => { - Ok(DimensionType::LocalCohort(cohort_based_on.clone())) + Ok(DimensionType::LocalCohort(cohort_based_on)) } superposition_sdk::types::DimensionType::Regular => { Ok(DimensionType::Regular {}) @@ -314,34 +301,22 @@ impl ConversionUtils { }) } - fn convert_condition_document( - context: &HashMap, - ) -> Result> { - let mut condition_map = Map::new(); - for (key, doc) in context { - let value = Self::document_to_value(doc)?; - condition_map.insert(key.clone(), value); - } - Ok(condition_map) - } - /// Convert list_experiment SDK response to structured experiment data pub fn convert_experiments_response( - response: &superposition_sdk::operation::list_experiment::ListExperimentOutput, + response: superposition_sdk::operation::list_experiment::ListExperimentOutput, ) -> Result { debug!("Converting experiments response"); - let exp_list = response.data(); let mut trimmed_exp_list: Experiments = Vec::new(); - for exp in exp_list { + for exp in response.data { // Convert experiment context (condition) - let condition_map = Self::convert_condition_document(exp.context())?; + let condition_map = conversions::hashmap_to_map(exp.context); // Convert variants let mut variants: Variants = Variants::new(vec![]); - for variant in exp.variants() { - let variant_type = match variant.variant_type() { + for variant in exp.variants { + let variant_type = match variant.variant_type { superposition_sdk::types::VariantType::Control => { VariantType::CONTROL } @@ -356,7 +331,7 @@ impl ConversionUtils { }; // Convert variant overrides - check if overrides exist - let overrides_map = Self::hashmap_to_map(variant.overrides())?; + let overrides_map = conversions::hashmap_to_map(variant.overrides); let override_ = Exp::::try_from(overrides_map) .map_err(|e| SuperpositionError::SerializationError(e.to_string()))?; @@ -405,16 +380,15 @@ impl ConversionUtils { } pub fn convert_experiment_groups_response( - response: &ListExperimentGroupsOutput, + response: ListExperimentGroupsOutput, ) -> Result { debug!("Converting experiment groups response"); - let group_list = response.data(); let mut trimmed_group_list: ExperimentGroups = Vec::new(); - for exp_group in group_list { + for exp_group in response.data { // Convert experiment context (condition) - let condition_map = Self::convert_condition_document(exp_group.context())?; + let condition_map = conversions::hashmap_to_map(exp_group.context); let context = Exp::::try_from(condition_map) .map_err(|e| { @@ -438,7 +412,7 @@ impl ConversionUtils { id: exp_group.id.clone(), context, traffic_percentage: exp_group.traffic_percentage as u8, - member_experiment_ids: exp_group.member_experiment_ids().to_vec(), + member_experiment_ids: exp_group.member_experiment_ids, group_type, buckets: Buckets::try_from( exp_group @@ -461,68 +435,6 @@ impl ConversionUtils { Ok(trimmed_group_list) } - /// Convert AWS Smithy Document to serde_json::Value - pub fn document_to_value(doc: &aws_smithy_types::Document) -> Result { - Self::document_to_value_recursive(doc) - } - - pub fn hashmap_to_map( - hashmap: &HashMap, - ) -> Result> { - hashmap - .iter() - .map(|(k, v)| { - let value = Self::document_to_value(v)?; - Ok((k.clone(), value)) - }) - .collect() - } - - /// Recursively convert AWS Smithy Document to serde_json::Value by properly matching variants - fn document_to_value_recursive(doc: &aws_smithy_types::Document) -> Result { - use aws_smithy_types::Document; - - match doc { - Document::Object(obj) => { - let mut map = Map::new(); - for (key, value) in obj { - let converted_value = Self::document_to_value_recursive(value)?; - map.insert(key.clone(), converted_value); - } - Ok(Value::Object(map)) - } - Document::Array(arr) => { - let mut vec = Vec::new(); - for item in arr { - let converted_item = Self::document_to_value_recursive(item)?; - vec.push(converted_item); - } - Ok(Value::Array(vec)) - } - Document::Number(num) => { - use aws_smithy_types::Number; - match num { - Number::PosInt(val) => { - Ok(Value::Number(serde_json::Number::from(*val))) - } - Number::NegInt(val) => { - Ok(Value::Number(serde_json::Number::from(*val))) - } - Number::Float(val) => Ok(Value::Number( - serde_json::Number::from_f64(*val).ok_or_else(|| { - SuperpositionError::SerializationError( - "Invalid float value".into(), - ) - })?, - )), - } - } - Document::String(s) => Ok(Value::String(s.clone())), - Document::Bool(b) => Ok(Value::Bool(*b)), - Document::Null => Ok(Value::Null), - } - } - pub fn convert_evaluation_context_value_to_serde_value( value: &open_feature::EvaluationContextFieldValue, ) -> Value { @@ -641,7 +553,7 @@ impl ConversionUtils { /// Evaluate config using superposition_types logic and return resolved values pub fn evaluate_config( - config: &Config, + config: Config, dimension_data: &Map, prefix_filter: Option<&[String]>, ) -> Result> { diff --git a/crates/superposition_types/src/config.rs b/crates/superposition_types/src/config.rs index 39b47a11f..796515502 100644 --- a/crates/superposition_types/src/config.rs +++ b/crates/superposition_types/src/config.rs @@ -20,7 +20,7 @@ use crate::database::schema::dimensions; use crate::{ database::models::cac::{DependencyGraph, DimensionType}, logic::evaluate_local_cohorts_skip_unresolved, - overridden::filter_config_keys_by_prefix, + overridden::{filter_config_keys_by_prefix, filter_into_config_keys_by_prefix}, Cac, Contextual, Exp, ExtendedMap, }; @@ -88,6 +88,10 @@ impl Overrides { } Ok(Self(override_map)) } + + pub fn into_inner(self) -> Map { + self.0 + } } impl IntoIterator for Overrides { @@ -289,28 +293,27 @@ pub struct Config { } impl Config { - pub fn filter_by_dimensions(&self, dimension_data: &Map) -> Self { + pub fn filter_by_dimensions(self, dimension_data: &Map) -> Self { let modified_context = evaluate_local_cohorts_skip_unresolved(&self.dimensions, dimension_data); - let filtered_context = - Context::filter_by_eval(self.contexts.clone(), &modified_context); - + let filtered_context = Context::filter_by_eval(self.contexts, &modified_context); + let mut initial_overrides = self.overrides; let filtered_overrides: HashMap = filtered_context .iter() .flat_map(|ele| { let override_with_key = ele.override_with_keys.get_key(); - self.overrides - .get(override_with_key) - .map(|value| (override_with_key.to_string(), value.clone())) + initial_overrides + .remove(override_with_key) + .map(|value| (override_with_key.to_string(), value)) }) .collect(); Self { contexts: filtered_context, overrides: filtered_overrides, - default_configs: self.default_configs.clone(), - dimensions: self.dimensions.clone(), + default_configs: self.default_configs, + dimensions: self.dimensions, } } @@ -318,39 +321,60 @@ impl Config { filter_config_keys_by_prefix(&self.default_configs, prefix_list).into() } - pub fn filter_by_prefix(&self, prefix_list: &HashSet) -> Self { - let mut filtered_overrides: HashMap = HashMap::new(); - + pub fn filter_by_prefix(self, prefix_list: &HashSet) -> Self { let filtered_default_config = self.filter_default_by_prefix(prefix_list); - for (key, overrides) in &self.overrides { - let filtered_overrides_map = - filter_config_keys_by_prefix(overrides, prefix_list); - - let _ = Cac::::try_from(filtered_overrides_map).map( - |filtered_overrides_map| { - filtered_overrides - .insert(key.clone(), filtered_overrides_map.into_inner()) - }, - ); - } + let filtered_overrides = self + .overrides + .into_iter() + .filter_map(|(key, overrides)| { + let filtered_overrides_map = filter_into_config_keys_by_prefix( + overrides.into_inner(), + prefix_list, + ); + Cac::::try_from(filtered_overrides_map).ok().map( + |filtered_overrides_map| (key, filtered_overrides_map.into_inner()), + ) + }) + .collect::>(); let filtered_context: Vec = self .contexts - .iter() + .into_iter() .filter(|context| { filtered_overrides.contains_key(context.override_with_keys.get_key()) }) - .cloned() .collect(); Self { contexts: filtered_context, overrides: filtered_overrides, default_configs: filtered_default_config, - dimensions: self.dimensions.clone(), + dimensions: self.dimensions, } } + + pub fn filter( + self, + dimension_data: Option<&Map>, + prefix_list: Option<&HashSet>, + ) -> Self { + let mut config = self; + + if let Some(prefixes) = prefix_list { + if !prefixes.is_empty() { + config = config.filter_by_prefix(prefixes); + } + } + + if let Some(ctx) = dimension_data { + if !ctx.is_empty() { + config = config.filter_by_dimensions(ctx); + } + } + + config + } } #[derive(Serialize, Deserialize, Clone, Debug, Default, uniffi::Record)] diff --git a/crates/superposition_types/src/config/tests.rs b/crates/superposition_types/src/config/tests.rs index f5f3031e5..51c4d7c76 100644 --- a/crates/superposition_types/src/config/tests.rs +++ b/crates/superposition_types/src/config/tests.rs @@ -91,12 +91,12 @@ fn filter_by_dimensions_with_dimension() { let config = with_dimensions::get_config(); assert_eq!( - config.filter_by_dimensions(&get_dimension_data1()), + config.clone().filter_by_dimensions(&get_dimension_data1()), with_dimensions::get_dimension_filtered_config1() ); assert_eq!( - config.filter_by_dimensions(&get_dimension_data2()), + config.clone().filter_by_dimensions(&get_dimension_data2()), with_dimensions::get_dimension_filtered_config2() ); @@ -111,12 +111,12 @@ fn filter_by_dimensions_without_dimension() { let config = without_dimensions::get_config(); assert_eq!( - config.filter_by_dimensions(&get_dimension_data1()), + config.clone().filter_by_dimensions(&get_dimension_data1()), without_dimensions::get_dimension_filtered_config1() ); assert_eq!( - config.filter_by_dimensions(&get_dimension_data2()), + config.clone().filter_by_dimensions(&get_dimension_data2()), without_dimensions::get_dimension_filtered_config2() ); @@ -185,7 +185,7 @@ fn filter_by_prefix_with_dimension() { let prefix_list = HashSet::from_iter(vec![String::from("test.")]); assert_eq!( - config.filter_by_prefix(&prefix_list), + config.clone().filter_by_prefix(&prefix_list), with_dimensions::get_prefix_filtered_config1() ); @@ -193,19 +193,20 @@ fn filter_by_prefix_with_dimension() { HashSet::from_iter(vec![String::from("test."), String::from("test2.")]); assert_eq!( - config.filter_by_prefix(&prefix_list), + config.clone().filter_by_prefix(&prefix_list), with_dimensions::get_prefix_filtered_config2() ); let prefix_list = HashSet::from_iter(vec![String::from("abcd")]); + let dimensions = config.dimensions.clone(); assert_eq!( config.filter_by_prefix(&prefix_list), Config { contexts: Vec::new(), overrides: HashMap::new(), default_configs: Map::new().into(), - dimensions: config.dimensions.clone(), + dimensions, } ); } @@ -217,7 +218,7 @@ fn filter_by_prefix_without_dimension() { let prefix_list = HashSet::from_iter(vec![String::from("test.")]); assert_eq!( - config.filter_by_prefix(&prefix_list), + config.clone().filter_by_prefix(&prefix_list), without_dimensions::get_prefix_filtered_config1() ); @@ -225,19 +226,20 @@ fn filter_by_prefix_without_dimension() { HashSet::from_iter(vec![String::from("test."), String::from("test2.")]); assert_eq!( - config.filter_by_prefix(&prefix_list), + config.clone().filter_by_prefix(&prefix_list), without_dimensions::get_prefix_filtered_config2() ); let prefix_list = HashSet::from_iter(vec![String::from("abcd")]); + let dimensions = config.dimensions.clone(); assert_eq!( config.filter_by_prefix(&prefix_list), Config { contexts: Vec::new(), overrides: HashMap::new(), default_configs: Map::new().into(), - dimensions: config.dimensions.clone(), + dimensions, } ); } diff --git a/crates/superposition_types/src/overridden.rs b/crates/superposition_types/src/overridden.rs index cf386047c..704e753b1 100644 --- a/crates/superposition_types/src/overridden.rs +++ b/crates/superposition_types/src/overridden.rs @@ -19,6 +19,20 @@ pub(crate) fn filter_config_keys_by_prefix( .collect() } +pub(crate) fn filter_into_config_keys_by_prefix( + overrides: Map, + prefix_list: &HashSet, +) -> Map { + overrides + .into_iter() + .filter(|(key, _)| { + prefix_list + .iter() + .any(|prefix_str| key.starts_with(prefix_str)) + }) + .collect() +} + pub trait Overridden>>: Clone { fn get_overrides(&self) -> Overrides; From 6c7f6d3dbff710ba25ccb05f4402d9b7b005f124 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Mon, 23 Mar 2026 19:08:20 +0530 Subject: [PATCH 12/16] recovery try 2 --- Cargo.lock | 1 + crates/superposition_core/src/experiment.rs | 17 +- crates/superposition_core/src/ffi.rs | 6 +- crates/superposition_core/src/ffi_legacy.rs | 43 +- crates/superposition_provider/Cargo.toml | 1 + .../examples/polling_example.rs | 4 +- crates/superposition_provider/src/client.rs | 10 +- .../superposition_provider/src/conversions.rs | 4 +- .../superposition_provider/src/data_source.rs | 108 ++-- .../src/data_source/file.rs | 19 +- .../src/data_source/http.rs | 321 ++++++------ .../src/local_provider.rs | 469 ++++++++++++------ .../src/remote_provider.rs | 50 +- 13 files changed, 608 insertions(+), 445 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef42e97d1..34027be9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6004,6 +6004,7 @@ dependencies = [ "async-trait", "aws-smithy-types", "chrono", + "derive_more 0.99.17", "env_logger", "log", "notify", diff --git a/crates/superposition_core/src/experiment.rs b/crates/superposition_core/src/experiment.rs index cbb55335d..3e6e7f7ed 100644 --- a/crates/superposition_core/src/experiment.rs +++ b/crates/superposition_core/src/experiment.rs @@ -104,22 +104,19 @@ pub fn get_applicable_variants( query_data: &Map, identifier: &str, prefix: Option>, -) -> Result, String> { +) -> Vec { let context = evaluate_local_cohorts(dimensions_info, query_data); let buckets = get_applicable_buckets_from_group(experiment_groups, &context, identifier); let experiments: HashMap = - get_satisfied_experiments(experiments, &context, prefix)? + get_satisfied_experiments(experiments, &context, prefix) .into_iter() .map(|exp| (exp.id.clone(), exp)) .collect(); - let applicable_variants = - get_applicable_variants_from_group_response(&experiments, &context, &buckets); - - Ok(applicable_variants) + get_applicable_variants_from_group_response(&experiments, &context, &buckets) } pub fn get_applicable_buckets_from_group( @@ -202,7 +199,7 @@ pub fn get_satisfied_experiments( mut experiments: Experiments, context: &Map, filter_prefixes: Option>, -) -> Result { +) -> Experiments { if let Some(prefix_list) = filter_prefixes.filter(|p| !p.is_empty()) { let prefix_list: HashSet = HashSet::from_iter(prefix_list); experiments = FfiExperiment::filter_keys_by_prefix(experiments, &prefix_list); @@ -212,14 +209,14 @@ pub fn get_satisfied_experiments( experiments = FfiExperiment::get_satisfied(experiments, context); } - Ok(experiments) + experiments } pub fn filter_experiments_by_context( mut experiments: Experiments, context: &Map, filter_prefixes: Option>, -) -> Result { +) -> Experiments { if let Some(prefix_list) = filter_prefixes.filter(|p| !p.is_empty()) { let prefix_list: HashSet = HashSet::from_iter(prefix_list); experiments = FfiExperiment::filter_keys_by_prefix(experiments, &prefix_list); @@ -229,5 +226,5 @@ pub fn filter_experiments_by_context( experiments = FfiExperiment::filter_by_eval(experiments, context); } - Ok(experiments) + experiments } diff --git a/crates/superposition_core/src/ffi.rs b/crates/superposition_core/src/ffi.rs index 82c1d494f..44860b5f9 100644 --- a/crates/superposition_core/src/ffi.rs +++ b/crates/superposition_core/src/ffi.rs @@ -66,8 +66,7 @@ fn ffi_eval_logic( &_q, &identifier, filter_prefixes.clone(), - ) - .map_err(OperationError::Unexpected)?; + ); _q.insert("variantIds".to_string(), variants.into()); } @@ -153,8 +152,7 @@ fn ffi_get_applicable_variants( &_query_data, &identifier, prefix, - ) - .map_err(OperationError::Unexpected)?; + ); Ok(r) } diff --git a/crates/superposition_core/src/ffi_legacy.rs b/crates/superposition_core/src/ffi_legacy.rs index f89c87741..3b1c3c9ab 100644 --- a/crates/superposition_core/src/ffi_legacy.rs +++ b/crates/superposition_core/src/ffi_legacy.rs @@ -147,22 +147,16 @@ pub unsafe extern "C" fn core_get_resolved_config( if let Some(e_args) = experimentation { let identifier = e_args.targeting_key; - match get_applicable_variants( + let variants = get_applicable_variants( &dimensions, e_args.experiments, &e_args.experiment_groups, &query_data, &identifier, filter_prefixes.clone(), - ) { - Ok(variants) => { - query_data.insert("variantIds".to_string(), variants.into()); - } - Err(e) => { - copy_string(ebuf, format!("Failed to get applicable variants: {}", e)); - return ptr::null_mut(); - } - } + ); + + query_data.insert("variantIds".to_string(), variants.into()); } // Call pure config resolution logic @@ -297,22 +291,16 @@ pub unsafe extern "C" fn core_get_resolved_config_with_reasoning( if let Some(e_args) = experimentation { let identifier = e_args.targeting_key; - match get_applicable_variants( + let variants = get_applicable_variants( &dimensions, e_args.experiments, &e_args.experiment_groups, &query_data, &identifier, filter_prefixes.clone(), - ) { - Ok(variants) => { - query_data.insert("variantIds".to_string(), variants.into()); - } - Err(e) => { - copy_string(ebuf, format!("Failed to get applicable variants: {}", e)); - return ptr::null_mut(); - } - } + ); + + query_data.insert("variantIds".to_string(), variants.into()); } // Call config resolution with reasoning @@ -431,23 +419,18 @@ pub unsafe extern "C" fn core_get_applicable_variants( }; // Call the experimentation logic - match get_applicable_variants( + let result = get_applicable_variants( &dimensions, experiments, &experiment_groups, &query_data, &identifier, filter_prefixes, - ) { - Ok(result) => match serde_json::to_string(&result) { - Ok(json_str) => string_to_c_str(json_str), - Err(e) => { - copy_string(ebuf, format!("Failed to serialize result: {}", e)); - ptr::null_mut() - } - }, + ); + match serde_json::to_string(&result) { + Ok(json_str) => string_to_c_str(json_str), Err(e) => { - copy_string(ebuf, e); + copy_string(ebuf, format!("Failed to serialize result: {}", e)); ptr::null_mut() } } diff --git a/crates/superposition_provider/Cargo.toml b/crates/superposition_provider/Cargo.toml index 19c5ab994..9ec393e7e 100644 --- a/crates/superposition_provider/Cargo.toml +++ b/crates/superposition_provider/Cargo.toml @@ -13,6 +13,7 @@ description = "Open feature provider for Superposition." async-trait = "0.1" aws-smithy-types = { version = "1.3.0" } chrono = { workspace = true } +derive_more = { workspace = true } log = { workspace = true } open-feature = "0.2.5" reqwest = { workspace = true } diff --git a/crates/superposition_provider/examples/polling_example.rs b/crates/superposition_provider/examples/polling_example.rs index 31445501d..e51123bc8 100644 --- a/crates/superposition_provider/examples/polling_example.rs +++ b/crates/superposition_provider/examples/polling_example.rs @@ -21,8 +21,8 @@ use std::env; use open_feature::{EvaluationContext, OpenFeature}; use superposition_provider::{ - data_source::http::HttpDataSource, local_provider::LocalResolutionProvider, PollingStrategy, - RefreshStrategy, SuperpositionOptions, + data_source::http::HttpDataSource, local_provider::LocalResolutionProvider, + PollingStrategy, RefreshStrategy, SuperpositionOptions, }; use tokio::time::{sleep, Duration}; diff --git a/crates/superposition_provider/src/client.rs b/crates/superposition_provider/src/client.rs index 135d0ab73..3c33dcb6b 100644 --- a/crates/superposition_provider/src/client.rs +++ b/crates/superposition_provider/src/client.rs @@ -608,20 +608,14 @@ impl ExperimentationConfig { ) { (Some(experiments), Some(experiment_groups)) => { // Use get_applicable_variants from superposition_core - get_applicable_variants( + Ok(get_applicable_variants( dimensions_info, experiments.clone(), experiment_groups, contexts, &identifier.unwrap_or_default(), None, - ) - .map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to get applicable variants: {}", - e - )) - }) + )) } _ => Err(SuperpositionError::ConfigError( "No cached experiments or experiment groups available".into(), diff --git a/crates/superposition_provider/src/conversions.rs b/crates/superposition_provider/src/conversions.rs index 8c6a5992b..73412eb6e 100644 --- a/crates/superposition_provider/src/conversions.rs +++ b/crates/superposition_provider/src/conversions.rs @@ -9,9 +9,9 @@ pub fn value_to_document(value: Value) -> Document { Value::Bool(b) => Document::Bool(b), Value::Number(n) => { if let Some(i) = n.as_i64() { - Document::Number(aws_smithy_types::Number::NegInt(i.into())) + Document::Number(aws_smithy_types::Number::NegInt(i)) } else if let Some(u) = n.as_u64() { - Document::Number(aws_smithy_types::Number::PosInt(u.into())) + Document::Number(aws_smithy_types::Number::PosInt(u)) } else if let Some(f) = n.as_f64() { Document::Number(aws_smithy_types::Number::Float(f)) } else { diff --git a/crates/superposition_provider/src/data_source.rs b/crates/superposition_provider/src/data_source.rs index f4e3add51..2e5f5cc93 100644 --- a/crates/superposition_provider/src/data_source.rs +++ b/crates/superposition_provider/src/data_source.rs @@ -22,6 +22,13 @@ impl FetchResponse { matches!(self, FetchResponse::NotModified) } + pub fn data(&self) -> Option<&T> { + match self { + FetchResponse::Data(data) => Some(data), + FetchResponse::NotModified => None, + } + } + pub fn into_data(self) -> Option { match self { FetchResponse::Data(data) => Some(data), @@ -62,51 +69,33 @@ impl ConfigData { } } -pub struct ExperimentResponse { - pub data: Experiments, - pub fetched_at: DateTime, -} - -impl ExperimentResponse { - pub fn new(experiments: Experiments) -> Self { - Self { - data: experiments, - fetched_at: Utc::now(), - } - } -} - -impl Display for ExperimentResponse { +impl Display for ConfigData { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, - "ExperimentResponse(data: {} experiments, fetched_at: {})", - self.data.len(), - self.fetched_at + "ConfigData(fetched_at: {}, config.contexts: {}, config.overrides: {}, config.default_configs: {}, config.dimensions: {})", + self.fetched_at, + self.config.contexts.len(), + self.config.overrides.len(), + self.config.default_configs.len(), + self.config.dimensions.len() ) } } -pub struct ExperimentGroupResponse { - pub data: ExperimentGroups, +pub struct ExperimentResponse { + pub experiments: FetchResponse, + pub experiment_groups: FetchResponse, pub fetched_at: DateTime, } -impl ExperimentGroupResponse { - pub fn new(experiment_groups: ExperimentGroups) -> Self { - Self { - data: experiment_groups, - fetched_at: Utc::now(), - } - } -} - -impl Display for ExperimentGroupResponse { +impl Display for ExperimentResponse { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, - "ExperimentGroupResponse(data: {} experiment groups, fetched_at: {})", - self.data.len(), + "ExperimentResponse(data: {} experiments, {} experiment groups, fetched_at: {})", + self.experiments.data().map(|e| e.len()).unwrap_or_default(), + self.experiment_groups.data().map(|e| e.len()).unwrap_or_default(), self.fetched_at ) } @@ -121,11 +110,41 @@ pub struct ExperimentData { } impl ExperimentData { - pub fn new(experiments: Experiments, experiment_groups: ExperimentGroups) -> Self { - Self { - experiments, - experiment_groups, - fetched_at: Utc::now(), + pub fn update_with(mut self, new_value: ExperimentResponse) -> Self { + if let Some(exps) = new_value.experiments.into_data() { + self.experiments = exps + } + + if let Some(grps) = new_value.experiment_groups.into_data() { + self.experiment_groups = grps + } + + self.fetched_at = new_value.fetched_at; + + self + } +} + +impl TryFrom for ExperimentData { + type Error = String; + + fn try_from(value: ExperimentResponse) -> std::result::Result { + match ( + value.experiments.into_data(), + value.experiment_groups.into_data(), + ) { + (Some(experiments), Some(experiment_groups)) => Ok(Self { + experiments, + experiment_groups, + fetched_at: value.fetched_at, + }), + (None, None) => Err("ExperimentResponse contains no data".to_string()), + (None, Some(_)) => { + Err("ExperimentResponse missing experiments data".to_string()) + } + (Some(_), None) => { + Err("ExperimentResponse missing experiment groups data".to_string()) + } } } } @@ -154,10 +173,7 @@ pub trait SuperpositionDataSource: Send + Sync { async fn fetch_active_experiments( &self, last_fetched_at: Option>, - ) -> Result<( - FetchResponse, - FetchResponse, - )>; + ) -> Result; /// Fetch active experiments whose conditions are candidates for the given context /// and key prefixes. @@ -166,10 +182,7 @@ pub trait SuperpositionDataSource: Send + Sync { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result<( - FetchResponse, - FetchResponse, - )>; + ) -> Result; /// Fetch active experiments that match the given context and key prefixes. async fn fetch_matching_active_experiments( @@ -177,10 +190,7 @@ pub trait SuperpositionDataSource: Send + Sync { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result<( - FetchResponse, - FetchResponse, - )>; + ) -> Result; /// Whether this data source supports experiments. fn supports_experiments(&self) -> bool; diff --git a/crates/superposition_provider/src/data_source/file.rs b/crates/superposition_provider/src/data_source/file.rs index 1c18c3051..bcc5b62c7 100644 --- a/crates/superposition_provider/src/data_source/file.rs +++ b/crates/superposition_provider/src/data_source/file.rs @@ -12,9 +12,7 @@ use tokio::sync::broadcast; use crate::data_source::FetchResponse; use crate::types::{Result, SuperpositionError, WatchStream}; -use super::{ - ConfigData, ExperimentGroupResponse, ExperimentResponse, SuperpositionDataSource, -}; +use super::{ConfigData, ExperimentResponse, SuperpositionDataSource}; pub struct FileDataSource { file_path: PathBuf, @@ -77,10 +75,7 @@ impl SuperpositionDataSource for FileDataSource { async fn fetch_active_experiments( &self, _last_fetched_at: Option>, - ) -> Result<( - FetchResponse, - FetchResponse, - )> { + ) -> Result { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), )) @@ -91,10 +86,7 @@ impl SuperpositionDataSource for FileDataSource { _context: Option>, _prefix_filter: Option>, _last_fetched_at: Option>, - ) -> Result<( - FetchResponse, - FetchResponse, - )> { + ) -> Result { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), )) @@ -105,10 +97,7 @@ impl SuperpositionDataSource for FileDataSource { _context: Option>, _prefix_filter: Option>, _last_fetched_at: Option>, - ) -> Result<( - FetchResponse, - FetchResponse, - )> { + ) -> Result { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), )) diff --git a/crates/superposition_provider/src/data_source/http.rs b/crates/superposition_provider/src/data_source/http.rs index 1a0cf99c3..818b5fe15 100644 --- a/crates/superposition_provider/src/data_source/http.rs +++ b/crates/superposition_provider/src/data_source/http.rs @@ -1,16 +1,18 @@ -use std::collections::HashSet; - use async_trait::async_trait; +use chrono::{DateTime, Utc}; use log::info; use serde_json::{Map, Value}; -use superposition_sdk::types::ExperimentStatusType; +use superposition_sdk::error::SdkError; +use superposition_sdk::types::{DimensionMatchStrategy, ExperimentStatusType}; use superposition_sdk::{Client, Config as SdkConfig}; -use superposition_types::logic::{apply, partial_apply}; -use super::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::conversions; +use crate::data_source::{ExperimentResponse, FetchResponse}; use crate::types::{Result, SuperpositionError, SuperpositionOptions}; use crate::utils::ConversionUtils; +use super::{ConfigData, SuperpositionDataSource}; + pub struct HttpDataSource { options: SuperpositionOptions, } @@ -30,180 +32,217 @@ impl HttpDataSource { Client::from_conf(sdk_config) } - async fn fetch_experiments_and_groups(&self) -> Result { + async fn fetch_experiments_with_filters( + &self, + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + filter: Option, + ) -> Result { let client = self.create_client(); - let (experiments_result, groups_result) = tokio::join!( - async { - client - .list_experiment() - .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .all(true) - .status(ExperimentStatusType::Created) - .status(ExperimentStatusType::Inprogress) - .send() - .await - .map_err(|e| { - SuperpositionError::NetworkError(format!( - "Failed to list experiments: {}", - e - )) - }) - }, - async { - client - .list_experiment_groups() - .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .all(true) - .send() - .await - .map_err(|e| { - SuperpositionError::NetworkError(format!( - "Failed to list experiment groups: {}", - e - )) - }) - } - ); - - let experiments_response = experiments_result?; - let groups_response = groups_result?; - - let experiments = - ConversionUtils::convert_experiments_response(&experiments_response)?; - let experiment_groups = - ConversionUtils::convert_experiment_groups_response(&groups_response)?; - - info!( - "Successfully fetched {} experiments and {} experiment groups", - experiments.len(), - experiment_groups.len() - ); + let mut experiment_builder = client + .list_experiment() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .all(true) + .status(ExperimentStatusType::Created) + .status(ExperimentStatusType::Inprogress); - Ok(ExperimentData::new(experiments, experiment_groups)) - } + let mut experiment_group_builder = client + .list_experiment_groups() + .workspace_id(&self.options.workspace_id) + .org_id(&self.options.org_id) + .all(true); + + if let Some(fetched_at) = last_fetched_at + .and_then(|t| t.timestamp_nanos_opt()) + .and_then(|t| aws_smithy_types::DateTime::from_nanos(t.into()).ok()) + { + experiment_builder = experiment_builder.if_modified_since(fetched_at); + experiment_group_builder = + experiment_group_builder.if_modified_since(fetched_at); + } - /// Filter experiments by context using a matcher function (apply or partial_apply), - /// and optionally by prefix. - fn filter_experiments( - data: &ExperimentData, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - matcher: fn(&Map, &Map) -> bool, - ) -> ExperimentData { - let mut filtered_experiments = data.experiments.clone(); - - // Filter by context using the provided matcher - if let Some(ctx) = context { - if !ctx.is_empty() { - filtered_experiments.retain(|exp| matcher(&exp.context, ctx)); + if let Some(context) = context { + if !context.is_empty() { + let context = conversions::map_to_hashmap(context); + experiment_builder = + experiment_builder.set_context(Some(context.clone())); + experiment_group_builder = + experiment_group_builder.set_context(Some(context)); } } - // Filter by prefix: keep experiments where any variant has an override key - // starting with any of the prefixes if let Some(prefixes) = prefix_filter { if !prefixes.is_empty() { - filtered_experiments.retain(|exp| { - exp.variants.iter().any(|variant| { - let overrides = variant.overrides.clone().into_inner(); - overrides.keys().any(|key| { - prefixes.iter().any(|prefix| key.starts_with(prefix)) - }) - }) - }); + experiment_builder = experiment_builder.set_prefix(Some(prefixes)); } } - // Keep all groups (they reference experiments by ID) - ExperimentData::new(filtered_experiments, data.experiment_groups.clone()) + if let Some(filter) = filter { + if filter { + experiment_builder = experiment_builder + .dimension_match_strategy(DimensionMatchStrategy::Subset); + experiment_group_builder = experiment_group_builder + .dimension_match_strategy(DimensionMatchStrategy::Subset); + } else { + experiment_builder = experiment_builder + .dimension_match_strategy(DimensionMatchStrategy::Exact); + experiment_group_builder = experiment_group_builder + .dimension_match_strategy(DimensionMatchStrategy::Exact); + } + } + + let start_time = Utc::now(); + let (experiments_result, groups_result) = + tokio::join!(async { experiment_builder.send().await }, async { + experiment_group_builder.send().await + }); + + let experiments_response = match experiments_result { + Ok(res) => ConversionUtils::convert_experiments_response(res) + .map(FetchResponse::Data), + Err(SdkError::ResponseError(r)) if r.raw().status().as_u16() == 304 => { + Ok(FetchResponse::NotModified) + } + Err(e) => Err(SuperpositionError::NetworkError(format!( + "Failed to list experiments: {}", + e + ))), + }?; + let groups_response = match groups_result { + Ok(res) => ConversionUtils::convert_experiment_groups_response(res) + .map(FetchResponse::Data), + Err(SdkError::ResponseError(r)) if r.raw().status().as_u16() == 304 => { + Ok(FetchResponse::NotModified) + } + Err(e) => Err(SuperpositionError::NetworkError(format!( + "Failed to list experiment groups: {}", + e + ))), + }?; + + let resp = ExperimentResponse { + experiments: experiments_response, + experiment_groups: groups_response, + fetched_at: start_time, + }; + + info!("Successfully fetched {}", resp); + + Ok(resp) } -} -#[async_trait] -impl SuperpositionDataSource for HttpDataSource { - async fn fetch_config(&self) -> Result { + async fn fetch_config_with_filters( + &self, + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result> { let client = self.create_client(); info!("Fetching config from Superposition service using SDK"); - - let response = client + let mut builder = client .get_config() .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .send() - .await - .map_err(|e| { - SuperpositionError::NetworkError(format!( - "Failed to get config: {}", - e - )) - })?; - - let config = ConversionUtils::convert_get_config_response(&response)?; - - info!( - "Successfully fetched config with {} contexts, {} overrides, {} default configs", - config.contexts.len(), - config.overrides.len(), - config.default_configs.len() - ); - - Ok(ConfigData::new(config)) - } + .org_id(&self.options.org_id); - async fn fetch_filtered_config( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result { - let config_data = self.fetch_config().await?; - let mut config = config_data.config; - - // Filter by dimensions if context is provided and non-empty - if let Some(ctx) = context { - if !ctx.is_empty() { - config = config.filter_by_dimensions(ctx); + if let Some(fetched_at) = last_fetched_at + .and_then(|t| t.timestamp_nanos_opt()) + .and_then(|t| aws_smithy_types::DateTime::from_nanos(t.into()).ok()) + { + builder = builder.if_modified_since(fetched_at); + } + + if let Some(context) = context { + if !context.is_empty() { + let context = conversions::map_to_hashmap(context); + builder = builder.set_context(Some(context)); } } - // Filter by prefix if prefix_filter is provided and non-empty if let Some(prefixes) = prefix_filter { if !prefixes.is_empty() { - let prefix_set: HashSet = - HashSet::from_iter(prefixes.iter().cloned()); - config = config.filter_by_prefix(&prefix_set); + builder = builder.set_prefix(Some(prefixes)); } } - Ok(ConfigData::new(config)) + let config_result = builder.send().await; + + let resp = match config_result { + Ok(res) => ConversionUtils::convert_get_config_response(res) + .map(ConfigData::new) + .map(FetchResponse::Data), + Err(SdkError::ResponseError(r)) if r.raw().status().as_u16() == 304 => { + Ok(FetchResponse::NotModified) + } + Err(e) => Err(SuperpositionError::NetworkError(format!( + "Failed to fetch config: {}", + e + ))), + }; + + resp } +} - async fn fetch_active_experiments(&self) -> Result> { - let data = self.fetch_experiments_and_groups().await?; - Ok(Some(data)) +#[async_trait] +impl SuperpositionDataSource for HttpDataSource { + async fn fetch_config( + &self, + last_fetched_at: Option>, + ) -> Result> { + self.fetch_config_with_filters(None, None, last_fetched_at) + .await + } + + async fn fetch_filtered_config( + &self, + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result> { + self.fetch_config_with_filters(context, prefix_filter, last_fetched_at) + .await + } + + async fn fetch_active_experiments( + &self, + last_fetched_at: Option>, + ) -> Result { + self.fetch_experiments_with_filters(None, None, last_fetched_at, None) + .await } async fn fetch_candidate_active_experiments( &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result> { - let data = self.fetch_experiments_and_groups().await?; - let filtered = Self::filter_experiments(&data, context, prefix_filter, partial_apply); - Ok(Some(filtered)) + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result { + self.fetch_experiments_with_filters( + context, + prefix_filter, + last_fetched_at, + Some(false), + ) + .await } async fn fetch_matching_active_experiments( &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result> { - let data = self.fetch_experiments_and_groups().await?; - let filtered = Self::filter_experiments(&data, context, prefix_filter, apply); - Ok(Some(filtered)) + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result { + self.fetch_experiments_with_filters( + context, + prefix_filter, + last_fetched_at, + Some(true), + ) + .await } fn supports_experiments(&self) -> bool { diff --git a/crates/superposition_provider/src/local_provider.rs b/crates/superposition_provider/src/local_provider.rs index f62d641e1..384f9ec0b 100644 --- a/crates/superposition_provider/src/local_provider.rs +++ b/crates/superposition_provider/src/local_provider.rs @@ -1,71 +1,83 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::sync::Arc; use async_trait::async_trait; -use log::{debug, error, info, warn}; +use chrono::{DateTime, Utc}; +use derive_more::{Deref, DerefMut}; +use open_feature::provider::{ + FeatureProvider, ProviderMetadata, ProviderStatus, ResolutionDetails, +}; use open_feature::{ - provider::FeatureProvider, - provider::{ProviderMetadata, ProviderStatus, ResolutionDetails}, - EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, + EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, + StructValue, }; use serde_json::{Map, Value}; -use superposition_core::{eval_config, get_applicable_variants, MergeStrategy}; +use superposition_core::experiment::filter_experiments_by_context; +use superposition_core::{ + eval_config, get_applicable_variants, get_satisfied_experiments, MergeStrategy, +}; use superposition_types::DimensionInfo; use tokio::sync::RwLock; use tokio::task::JoinHandle; use tokio::time::{sleep, Duration}; -use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; +use crate::data_source::{ + ConfigData, ExperimentData, ExperimentResponse, FetchResponse, + SuperpositionDataSource, +}; use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; use crate::types::*; use crate::utils::ConversionUtils; -pub struct LocalResolutionProvider { +pub struct LocalResolutionProviderInner { primary: Arc, fallback: Option>, refresh_strategy: RefreshStrategy, - cached_config: Arc>>, - cached_experiments: Arc>>, + cached_config: RwLock>, + cached_experiments: RwLock>, polling_task: RwLock>>, metadata: ProviderMetadata, status: RwLock, } +#[derive(Deref, DerefMut, Clone)] +pub struct LocalResolutionProvider(Arc); + impl LocalResolutionProvider { pub fn new( primary: Box, fallback: Option>, refresh_strategy: RefreshStrategy, ) -> Self { - Self { + Self(Arc::new(LocalResolutionProviderInner { primary: Arc::from(primary), fallback: fallback.map(Arc::from), refresh_strategy, - cached_config: Arc::new(RwLock::new(None)), - cached_experiments: Arc::new(RwLock::new(None)), + cached_config: RwLock::new(None), + cached_experiments: RwLock::new(None), polling_task: RwLock::new(None), metadata: ProviderMetadata { name: "LocalResolutionProvider".to_string(), }, status: RwLock::new(ProviderStatus::NotReady), - } + })) } pub async fn init(&self) -> Result<()> { // Fetch initial config from primary, fall back if needed - let config_data = match self.primary.fetch_config().await { + let config_data = match self.primary.fetch_config(None).await { Ok(data) => { - info!("LocalResolutionProvider: fetched config from primary source"); + log::info!("LocalResolutionProvider: fetched config from primary source"); data } Err(e) => { - warn!( + log::warn!( "LocalResolutionProvider: primary config fetch failed: {}", e ); if let Some(fallback) = &self.fallback { - fallback.fetch_config().await.map_err(|fb_err| { - error!( + fallback.fetch_config(None).await.map_err(|fb_err| { + log::error!( "LocalResolutionProvider: fallback config fetch also failed: {}", fb_err ); @@ -85,22 +97,22 @@ impl LocalResolutionProvider { { let mut cached = self.cached_config.write().await; - *cached = Some(config_data); + *cached = config_data.into_data(); } // Fetch experiments best-effort: try primary, optionally fallback, but don't fail - let exp_data = match self.primary.fetch_active_experiments().await { - Ok(data) => data, + let exp_data = match self.primary.fetch_active_experiments(None).await { + Ok(exp_resp) => ExperimentData::try_from(exp_resp).ok(), Err(e) => { - warn!( + log::warn!( "LocalResolutionProvider: primary experiment fetch failed (best-effort): {}", e ); if let Some(fallback) = &self.fallback { - match fallback.fetch_active_experiments().await { - Ok(data) => data, + match fallback.fetch_active_experiments(None).await { + Ok(exp_resp) => ExperimentData::try_from(exp_resp).ok(), Err(fb_err) => { - warn!( + log::warn!( "LocalResolutionProvider: fallback experiment fetch also failed (best-effort): {}", fb_err ); @@ -116,13 +128,13 @@ impl LocalResolutionProvider { if let Some(data) = exp_data { let mut cached = self.cached_experiments.write().await; *cached = Some(data); - info!("LocalResolutionProvider: experiments cached"); + log::info!("LocalResolutionProvider: experiments cached"); } // Start refresh strategy match &self.refresh_strategy { RefreshStrategy::Polling(polling_strategy) => { - info!( + log::info!( "LocalResolutionProvider: starting polling with interval={}s", polling_strategy.interval ); @@ -131,7 +143,7 @@ impl LocalResolutionProvider { *polling_task = Some(task); } RefreshStrategy::OnDemand(on_demand_strategy) => { - info!( + log::info!( "LocalResolutionProvider: using OnDemand strategy with ttl={}s", on_demand_strategy.ttl ); @@ -140,7 +152,7 @@ impl LocalResolutionProvider { let debounce_ms = watch_strategy.debounce_ms.unwrap_or(500); match self.primary.watch() { Ok(Some(stream)) => { - info!( + log::info!( "LocalResolutionProvider: starting watch with debounce={}ms", debounce_ms ); @@ -149,15 +161,15 @@ impl LocalResolutionProvider { *polling_task = Some(task); } Ok(None) => { - warn!("Watch strategy selected but data source does not support watching"); + log::warn!("Watch strategy selected but data source does not support watching"); } Err(e) => { - warn!("Failed to start watch: {}", e); + log::warn!("Failed to start watch: {}", e); } } } RefreshStrategy::Manual => { - info!("LocalResolutionProvider: using Manual refresh strategy"); + log::info!("LocalResolutionProvider: using Manual refresh strategy"); } } @@ -184,11 +196,14 @@ impl LocalResolutionProvider { // Close data sources if let Err(e) = self.primary.close().await { - warn!("LocalResolutionProvider: error closing primary source: {}", e); + log::warn!( + "LocalResolutionProvider: error closing primary source: {}", + e + ); } if let Some(fallback) = &self.fallback { if let Err(e) = fallback.close().await { - warn!( + log::warn!( "LocalResolutionProvider: error closing fallback source: {}", e ); @@ -216,80 +231,80 @@ impl LocalResolutionProvider { async fn do_refresh(&self) -> Result<()> { // Fetch config from primary; keep last known good on failure - let config_result = self.primary.fetch_config().await; - match &config_result { - Ok(data) => { + let last_fetched_at = { + self.cached_config + .read() + .await + .as_ref() + .map(|data| data.fetched_at) + }; + + let config_result = self.primary.fetch_config(last_fetched_at).await; + let mut resp = match config_result { + Ok(FetchResponse::Data(data)) => { let mut cached = self.cached_config.write().await; - *cached = Some(data.clone()); - debug!("LocalResolutionProvider: config refreshed from primary"); + *cached = Some(data); + log::debug!("LocalResolutionProvider: config refreshed from primary"); + Ok(()) + } + Ok(FetchResponse::NotModified) => { + log::debug!("LocalResolutionProvider: config not modified"); + Ok(()) } Err(e) => { - warn!( + log::warn!( "LocalResolutionProvider: config refresh failed, keeping last known good: {}", e ); + Err(e) } - } + }; // Experiments refresh is best-effort, don't propagate errors if self.primary.supports_experiments() { - match self.primary.fetch_active_experiments().await { - Ok(Some(data)) => { + let exp_last_fetched_at = { + self.cached_experiments + .read() + .await + .as_ref() + .map(|d| d.fetched_at) + }; + match self + .primary + .fetch_active_experiments(exp_last_fetched_at) + .await + { + Ok(exp_resp) => { let mut cached = self.cached_experiments.write().await; - *cached = Some(data); - debug!("LocalResolutionProvider: experiments refreshed from primary"); - } - Ok(None) => { - debug!("LocalResolutionProvider: no experiments returned from primary"); + *cached = match cached.clone() { + Some(c) => Some(c.update_with(exp_resp)), + None => ExperimentData::try_from(exp_resp).ok(), + }; + log::debug!( + "LocalResolutionProvider: experiments refreshed from primary" + ); } Err(e) => { - warn!( + log::warn!( "LocalResolutionProvider: experiment refresh failed, keeping last known good: {}", e ); + if resp.is_ok() { + resp = Err(e); + } } } } - config_result.map(|_| ()) + resp } async fn start_polling(&self, interval: u64) -> JoinHandle<()> { - let primary = self.primary.clone(); - let cached_config = self.cached_config.clone(); - let cached_experiments = self.cached_experiments.clone(); - + let provider_clone = self.clone(); tokio::spawn(async move { loop { sleep(Duration::from_secs(interval)).await; - - // Refresh config - match primary.fetch_config().await { - Ok(data) => { - let mut cached = cached_config.write().await; - *cached = Some(data); - debug!("LocalResolutionProvider: config updated via polling"); - } - Err(e) => { - error!("LocalResolutionProvider: polling config error: {}", e); - } - } - - // Refresh experiments - match primary.fetch_active_experiments().await { - Ok(Some(data)) => { - let mut cached = cached_experiments.write().await; - *cached = Some(data); - debug!("LocalResolutionProvider: experiments updated via polling"); - } - Ok(None) => {} - Err(e) => { - error!( - "LocalResolutionProvider: polling experiments error: {}", - e - ); - } - } + let _ = provider_clone.do_refresh().await; } }) } @@ -299,53 +314,86 @@ impl LocalResolutionProvider { mut watch_stream: crate::types::WatchStream, debounce_ms: u64, ) -> JoinHandle<()> { - let primary = self.primary.clone(); - let cached_config = self.cached_config.clone(); - let cached_experiments = self.cached_experiments.clone(); + let provider_clone = self.clone(); tokio::spawn(async move { loop { match watch_stream.receiver.recv().await { - Some(()) => { + Ok(()) => { // Debounce: wait, then drain any queued events sleep(Duration::from_millis(debounce_ms)).await; while watch_stream.receiver.try_recv().is_ok() {} + let last_fetched_at = { + provider_clone + .cached_config + .read() + .await + .as_ref() + .map(|data| data.fetched_at) + }; + // Refresh config - match primary.fetch_config().await { - Ok(data) => { - let mut cached = cached_config.write().await; + match provider_clone.primary.fetch_config(last_fetched_at).await { + Ok(FetchResponse::Data(data)) => { + let mut cached = + provider_clone.cached_config.write().await; *cached = Some(data); - debug!("LocalResolutionProvider: config updated via watch"); + log::debug!( + "LocalResolutionProvider: config updated via watch" + ); + } + Ok(FetchResponse::NotModified) => { + log::debug!( + "LocalResolutionProvider: config not modified on watch refresh" + ); } Err(e) => { - error!( + log::error!( "LocalResolutionProvider: watch config refresh error: {}", e ); } } + let exp_last_fetched_at = { + provider_clone + .cached_experiments + .read() + .await + .as_ref() + .map(|d| d.fetched_at) + }; // Refresh experiments - match primary.fetch_active_experiments().await { - Ok(Some(data)) => { - let mut cached = cached_experiments.write().await; - *cached = Some(data); - debug!( - "LocalResolutionProvider: experiments updated via watch" + match provider_clone + .primary + .fetch_active_experiments(exp_last_fetched_at) + .await + { + Ok(exp_resp) => { + let mut cached = + provider_clone.cached_experiments.write().await; + *cached = match cached.clone() { + Some(c) => Some(c.update_with(exp_resp)), + None => ExperimentData::try_from(exp_resp).ok(), + }; + log::debug!( + "LocalResolutionProvider: experiments refreshed from primary on watch update" ); } - Ok(None) => {} Err(e) => { - error!( - "LocalResolutionProvider: watch experiments refresh error: {}", + log::warn!( + "LocalResolutionProvider: experiment refresh failed, keeping last known good on watch update: {}", e ); } } } - None => { - info!("LocalResolutionProvider: watch channel closed, stopping"); + Err(e) => { + log::error!( + "LocalResolutionProvider: watch channel error: {}", + e + ); break; } } @@ -371,12 +419,12 @@ impl LocalResolutionProvider { }; if should_refresh { - debug!("LocalResolutionProvider: TTL expired, refreshing on-demand"); + log::debug!("LocalResolutionProvider: TTL expired, refreshing on-demand"); if let Err(e) = self.do_refresh().await { if !use_stale_on_error { return Err(e); } - warn!( + log::warn!( "LocalResolutionProvider: on-demand refresh failed, using stale data: {}", e ); @@ -410,29 +458,19 @@ impl LocalResolutionProvider { { let cached_exp = self.cached_experiments.read().await; if let Some(exp_data) = cached_exp.as_ref() { - match get_applicable_variants( + let variant_ids = get_applicable_variants( &dimensions_info, exp_data.experiments.clone(), &exp_data.experiment_groups, &query_data, &targeting_key.clone().unwrap_or_default(), None, - ) { - Ok(variant_ids) => { - query_data.insert( - "variantIds".to_string(), - Value::Array( - variant_ids.into_iter().map(Value::String).collect(), - ), - ); - } - Err(e) => { - warn!( - "LocalResolutionProvider: failed to get applicable variants: {}", - e - ); - } - } + ); + + query_data.insert( + "variantIds".to_string(), + Value::Array(variant_ids.into_iter().map(Value::String).collect()), + ); } } @@ -492,32 +530,25 @@ impl FeatureExperimentMeta for LocalResolutionProvider { let dimensions_info = self.get_dimensions_info().await; let cached_exp = self.cached_experiments.read().await; - match cached_exp.as_ref() { - Some(exp_data) => { - get_applicable_variants( - &dimensions_info, - exp_data.experiments.clone(), - &exp_data.experiment_groups, - &query_data, - &targeting_key.unwrap_or_default(), - None, - ) - .map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to get applicable variants: {}", - e - )) - }) - } - None => Ok(vec![]), - } + let resp = match cached_exp.as_ref() { + Some(exp_data) => get_applicable_variants( + &dimensions_info, + exp_data.experiments.clone(), + &exp_data.experiment_groups, + &query_data, + &targeting_key.unwrap_or_default(), + None, + ), + None => vec![], + }; + Ok(resp) } } #[async_trait] impl FeatureProvider for LocalResolutionProvider { async fn initialize(&mut self, _context: &EvaluationContext) { - info!("Initializing LocalResolutionProvider..."); + log::info!("Initializing LocalResolutionProvider..."); { let mut status = self.status.write().await; *status = ProviderStatus::NotReady; @@ -531,7 +562,7 @@ impl FeatureProvider for LocalResolutionProvider { let mut status = self.status.write().await; *status = ProviderStatus::Ready; - info!("LocalResolutionProvider initialized successfully"); + log::info!("LocalResolutionProvider initialized successfully"); } async fn resolve_bool_value( @@ -554,7 +585,7 @@ impl FeatureProvider for LocalResolutionProvider { }), }, Err(e) => { - error!("Error evaluating boolean flag {}: {}", flag_key, e); + log::error!("Error evaluating boolean flag {}: {}", flag_key, e); Err(EvaluationError { code: EvaluationErrorCode::General(format!( "Error evaluating flag '{}': {}", @@ -586,7 +617,7 @@ impl FeatureProvider for LocalResolutionProvider { }), }, Err(e) => { - error!("Error evaluating String flag {}: {}", flag_key, e); + log::error!("Error evaluating String flag {}: {}", flag_key, e); Err(EvaluationError { code: EvaluationErrorCode::General(format!( "Error evaluating flag '{}': {}", @@ -618,7 +649,7 @@ impl FeatureProvider for LocalResolutionProvider { }), }, Err(e) => { - error!("Error evaluating integer flag {}: {}", flag_key, e); + log::error!("Error evaluating integer flag {}: {}", flag_key, e); Err(EvaluationError { code: EvaluationErrorCode::General(format!( "Error evaluating flag '{}': {}", @@ -650,7 +681,7 @@ impl FeatureProvider for LocalResolutionProvider { }), }, Err(e) => { - error!("Error evaluating float flag {}: {}", flag_key, e); + log::error!("Error evaluating float flag {}: {}", flag_key, e); Err(EvaluationError { code: EvaluationErrorCode::General(format!( "Error evaluating flag '{}': {}", @@ -669,26 +700,28 @@ impl FeatureProvider for LocalResolutionProvider { ) -> EvaluationResult> { match self.resolve_all_features(evaluation_context).await { Ok(config) => match config.get(flag_key) { - Some(value) => match ConversionUtils::serde_value_to_struct_value(value) { - Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), - Err(e) => { - error!("Error converting value to StructValue: {}", e); - Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!( - "Flag '{}' is not a struct: {}", - flag_key, e - )), - }) + Some(value) => { + match ConversionUtils::serde_value_to_struct_value(value) { + Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), + Err(e) => { + log::error!("Error converting value to StructValue: {}", e); + Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!( + "Flag '{}' is not a struct: {}", + flag_key, e + )), + }) + } } - }, + } None => Err(EvaluationError { code: EvaluationErrorCode::FlagNotFound, message: Some(format!("Flag '{}' not found", flag_key)), }), }, Err(e) => { - error!("Error evaluating Object flag {}: {}", flag_key, e); + log::error!("Error evaluating Object flag {}: {}", flag_key, e); Err(EvaluationError { code: EvaluationErrorCode::General(format!( "Error evaluating flag '{}': {}", @@ -716,3 +749,119 @@ impl FeatureProvider for LocalResolutionProvider { } } } + +#[async_trait] +impl SuperpositionDataSource for LocalResolutionProvider { + async fn fetch_config( + &self, + _: Option>, + ) -> Result> { + let cached = self.cached_config.read().await; + match cached.as_ref() { + Some(data) => Ok(FetchResponse::Data(data.clone())), + None => Err(SuperpositionError::ConfigError( + "No cached config available".into(), + )), + } + } + + async fn fetch_filtered_config( + &self, + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result> { + let resp = self.fetch_config(last_fetched_at).await?.map_data(|mut c| { + let prefix = prefix_filter.map(HashSet::from_iter); + c.config = c.config.filter(context.as_ref(), prefix.as_ref()); + + c + }); + + Ok(resp) + } + + async fn fetch_active_experiments( + &self, + _: Option>, + ) -> Result { + if !self.supports_experiments() { + return Err(SuperpositionError::ConfigError( + "Experiments not supported by this provider".into(), + )); + } + let cached = self.cached_experiments.read().await; + match cached.clone() { + Some(data) => Ok(ExperimentResponse { + experiments: FetchResponse::Data(data.experiments), + experiment_groups: FetchResponse::Data(data.experiment_groups), + fetched_at: data.fetched_at, + }), + None => Err(SuperpositionError::ConfigError( + "No cached experiments available".into(), + )), + } + } + + async fn fetch_candidate_active_experiments( + &self, + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result { + if !self.supports_experiments() { + return Err(SuperpositionError::ConfigError( + "Experiments not supported by this provider".into(), + )); + } + let mut experiments_response = + self.fetch_active_experiments(last_fetched_at).await?; + + // TODO: adding experiment group filtering + experiments_response.experiments = + experiments_response.experiments.map_data(|exp_resp| { + get_satisfied_experiments( + exp_resp, + &context.unwrap_or_default(), + prefix_filter, + ) + }); + + Ok(experiments_response) + } + + async fn fetch_matching_active_experiments( + &self, + context: Option>, + prefix_filter: Option>, + last_fetched_at: Option>, + ) -> Result { + if !self.supports_experiments() { + return Err(SuperpositionError::ConfigError( + "Experiments not supported by this provider".into(), + )); + } + let mut experiments_response = + self.fetch_active_experiments(last_fetched_at).await?; + + // TODO: adding experiment group filtering + experiments_response.experiments = + experiments_response.experiments.map_data(|exp_resp| { + filter_experiments_by_context( + exp_resp, + &context.unwrap_or_default(), + prefix_filter, + ) + }); + + Ok(experiments_response) + } + + fn supports_experiments(&self) -> bool { + self.primary.supports_experiments() + } + + async fn close(&self) -> Result<()> { + Ok(()) + } +} diff --git a/crates/superposition_provider/src/remote_provider.rs b/crates/superposition_provider/src/remote_provider.rs index 69d310562..acf7a1017 100644 --- a/crates/superposition_provider/src/remote_provider.rs +++ b/crates/superposition_provider/src/remote_provider.rs @@ -8,15 +8,16 @@ use log::{debug, error, info, warn}; use open_feature::{ provider::FeatureProvider, provider::{ProviderMetadata, ProviderStatus, ResolutionDetails}, - EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, + EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, + StructValue, }; use serde_json::{Map, Value}; use superposition_sdk::{Client, Config as SdkConfig}; use tokio::sync::RwLock; use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; -use crate::types::*; use crate::utils::ConversionUtils; +use crate::{conversions, types::*}; // --------------------------------------------------------------------------- // ResponseCache internals @@ -129,7 +130,10 @@ impl SuperpositionAPIProvider { } /// Create a new provider with response caching. - pub fn with_cache(options: SuperpositionOptions, cache_options: CacheOptions) -> Self { + pub fn with_cache( + options: SuperpositionOptions, + cache_options: CacheOptions, + ) -> Self { let max_entries = cache_options.size.unwrap_or(1000); let ttl = Duration::from_secs(cache_options.ttl.unwrap_or(300)); let cache = ResponseCache::new(max_entries, ttl); @@ -207,13 +211,7 @@ impl SuperpositionAPIProvider { })?; // 5. Convert response Document to Map - let config_doc = response.config(); - let config_value = ConversionUtils::document_to_value(config_doc).map_err(|e| { - SuperpositionError::SerializationError(format!( - "Failed to convert resolved config response: {}", - e - )) - })?; + let config_value = conversions::document_to_value(response.config); let full_result = match config_value { Value::Object(map) => map, @@ -244,7 +242,6 @@ impl SuperpositionAPIProvider { Ok(result) } - } // --------------------------------------------------------------------------- @@ -252,7 +249,10 @@ impl SuperpositionAPIProvider { // --------------------------------------------------------------------------- /// Filter a config map to only include keys that start with one of the given prefixes. -fn filter_by_prefix(config: &Map, prefixes: &[String]) -> Map { +fn filter_by_prefix( + config: &Map, + prefixes: &[String], +) -> Map { if prefixes.is_empty() { return config.clone(); } @@ -472,19 +472,21 @@ impl FeatureProvider for SuperpositionAPIProvider { ) -> EvaluationResult> { match self.resolve_all_features(evaluation_context).await { Ok(config) => match config.get(flag_key) { - Some(value) => match ConversionUtils::serde_value_to_struct_value(value) { - Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), - Err(e) => { - error!("Error converting value to StructValue: {}", e); - Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!( - "Flag '{}' is not a struct: {}", - flag_key, e - )), - }) + Some(value) => { + match ConversionUtils::serde_value_to_struct_value(value) { + Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), + Err(e) => { + error!("Error converting value to StructValue: {}", e); + Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!( + "Flag '{}' is not a struct: {}", + flag_key, e + )), + }) + } } - }, + } None => Err(EvaluationError { code: EvaluationErrorCode::FlagNotFound, message: Some(format!("Flag '{}' not found", flag_key)), From 8bdf40f6270edd457e70e658456278f1e2d0e5a4 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Mon, 23 Mar 2026 19:19:35 +0530 Subject: [PATCH 13/16] reabse fix --- .../Io/Superposition/Model/GetConfigInput.hs | 4 + .../Model/ListExperimentGroupsInput.hs | 74 +---- .../Model/ListExperimentInput.hs | 76 +---- .../Model/ListExperimentOutput.hs | 61 ++-- .../client/SuperpositionAsyncClientImpl.java | 5 + .../client/SuperpositionClientImpl.java | 5 + .../superposition/model/GetConfigInput.java | 5 +- .../model/ListExperimentGroupsInput.java | 93 ++---- .../model/ListExperimentInput.java | 117 +------ .../model/ListExperimentOutput.java | 82 +++-- .../sdk/src/commands/ListExperimentCommand.ts | 13 +- .../commands/ListExperimentGroupsCommand.ts | 6 +- clients/javascript/sdk/src/models/models_0.ts | 20 +- .../sdk/src/protocols/Aws_restJson1.ts | 4 + .../sdk/superposition_sdk/_private/schemas.py | 79 +---- .../python/sdk/superposition_sdk/config.py | 4 + .../sdk/superposition_sdk/deserialize.py | 8 - .../python/sdk/superposition_sdk/models.py | 54 +--- .../python/sdk/superposition_sdk/serialize.py | 15 +- .../superposition_sdk/src/client/customize.rs | 1 + .../src/client/list_experiment.rs | 11 +- .../src/client/list_experiment_groups.rs | 6 +- .../list_experiment/_list_experiment_input.rs | 41 --- .../_list_experiment_output.rs | 58 +--- .../src/operation/list_experiment/builders.rs | 9 - .../_list_experiment_groups_input.rs | 36 +-- .../list_experiment_groups/builders.rs | 8 +- .../src/protocol_serde/shape_get_config.rs | 8 - .../protocol_serde/shape_list_experiment.rs | 19 +- .../shape_list_experiment_groups.rs | 8 - .../shape_list_experiment_output.rs | 8 - crates/superposition_sdk/src/serde_util.rs | 4 + crates/superposition_sdk/src/types.rs | 24 +- .../superposition_sdk/src/types/builders.rs | 10 +- docs/docs/api/Superposition.openapi.json | 25 +- docs/docs/api/get-config-json.api.mdx | 4 - docs/docs/api/get-config-toml.api.mdx | 4 - docs/docs/api/get-config.api.mdx | 18 +- docs/docs/api/list-experiment-groups.api.mdx | 26 +- docs/docs/api/list-experiment.api.mdx | 33 +- smithy/patches/python.patch | 305 ++++++++++-------- 41 files changed, 421 insertions(+), 970 deletions(-) diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs index e976709cd..2e36f9113 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs @@ -146,6 +146,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -171,6 +172,9 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 45a3cd01 (reabse fix) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs index 229c9419e..f987ba415 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs @@ -15,16 +15,14 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - setDimensionMatchStrategy, -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) setDimensionMatchStrategy, ->>>>>>> 82479b8f (fix: more fixes) setContext, ======= <<<<<<< HEAD @@ -54,14 +52,7 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( <<<<<<< HEAD <<<<<<< HEAD group_type, -<<<<<<< HEAD -<<<<<<< HEAD dimension_match_strategy, -======= ->>>>>>> 6e8749e1 (Test) -======= - dimension_match_strategy, ->>>>>>> 82479b8f (fix: more fixes) context ======= <<<<<<< HEAD @@ -113,14 +104,7 @@ data ListExperimentGroupsInput = ListExperimentGroupsInput { <<<<<<< HEAD <<<<<<< HEAD group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), -<<<<<<< HEAD -<<<<<<< HEAD - dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, -======= ->>>>>>> 6e8749e1 (Test) -======= dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, ->>>>>>> 82479b8f (fix: more fixes) context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ======= <<<<<<< HEAD @@ -158,14 +142,7 @@ instance Data.Aeson.ToJSON ListExperimentGroupsInput where <<<<<<< HEAD <<<<<<< HEAD "group_type" Data.Aeson..= group_type a, -<<<<<<< HEAD -<<<<<<< HEAD "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, -======= ->>>>>>> 6e8749e1 (Test) -======= - "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, ->>>>>>> 82479b8f (fix: more fixes) "context" Data.Aeson..= context a ======= <<<<<<< HEAD @@ -204,16 +181,14 @@ instance Data.Aeson.FromJSON ListExperimentGroupsInput where <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") ->>>>>>> 82479b8f (fix: more fixes) Control.Applicative.<*> (v Data.Aeson..:? "context") ======= <<<<<<< HEAD @@ -245,14 +220,7 @@ data ListExperimentGroupsInputBuilderState = ListExperimentGroupsInputBuilderSta <<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), -<<<<<<< HEAD -<<<<<<< HEAD - dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, -======= ->>>>>>> 6e8749e1 (Test) -======= dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, ->>>>>>> 82479b8f (fix: more fixes) contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ======= <<<<<<< HEAD @@ -288,14 +256,7 @@ defaultBuilderState = ListExperimentGroupsInputBuilderState { <<<<<<< HEAD <<<<<<< HEAD group_typeBuilderState = Data.Maybe.Nothing, -<<<<<<< HEAD -<<<<<<< HEAD dimension_match_strategyBuilderState = Data.Maybe.Nothing, -======= ->>>>>>> 6e8749e1 (Test) -======= - dimension_match_strategyBuilderState = Data.Maybe.Nothing, ->>>>>>> 82479b8f (fix: more fixes) contextBuilderState = Data.Maybe.Nothing ======= <<<<<<< HEAD @@ -367,6 +328,7 @@ setGroupType value = <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -379,15 +341,12 @@ setGroupType value = ======= >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> ListExperimentGroupsInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> ListExperimentGroupsInputBuilder () setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) @@ -418,16 +377,14 @@ build builder = do <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) ->>>>>>> 82479b8f (fix: more fixes) context' <- Data.Either.Right (contextBuilderState st) ======= <<<<<<< HEAD @@ -455,14 +412,7 @@ build builder = do <<<<<<< HEAD <<<<<<< HEAD group_type = group_type', -<<<<<<< HEAD -<<<<<<< HEAD dimension_match_strategy = dimension_match_strategy', -======= ->>>>>>> 6e8749e1 (Test) -======= - dimension_match_strategy = dimension_match_strategy', ->>>>>>> 82479b8f (fix: more fixes) context = context' ======= <<<<<<< HEAD @@ -498,6 +448,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -508,6 +459,8 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) Io.Superposition.Utility.serQuery "sort_on" (sort_on self) Io.Superposition.Utility.serQuery "name" (name self) @@ -516,6 +469,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) @@ -539,6 +493,8 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs index 752a0d0cd..c259813cc 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs @@ -16,14 +16,7 @@ module Io.Superposition.Model.ListExperimentInput ( setSortBy, setGlobalExperimentsOnly, setDimensionMatchStrategy, -<<<<<<< HEAD -<<<<<<< HEAD - setPrefix, -======= ->>>>>>> 6e8749e1 (Test) -======= setPrefix, ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) setContext, build, ListExperimentInputBuilder, @@ -45,14 +38,7 @@ module Io.Superposition.Model.ListExperimentInput ( sort_by, global_experiments_only, dimension_match_strategy, -<<<<<<< HEAD -<<<<<<< HEAD prefix, -======= ->>>>>>> 6e8749e1 (Test) -======= - prefix, ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context ) where import qualified Control.Applicative @@ -93,14 +79,7 @@ data ListExperimentInput = ListExperimentInput { sort_by :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, global_experiments_only :: Data.Maybe.Maybe Bool, dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, -<<<<<<< HEAD -<<<<<<< HEAD - prefix :: Data.Maybe.Maybe ([] Data.Text.Text), -======= ->>>>>>> 6e8749e1 (Test) -======= prefix :: Data.Maybe.Maybe ([] Data.Text.Text), ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) } deriving ( GHC.Show.Show, @@ -127,14 +106,7 @@ instance Data.Aeson.ToJSON ListExperimentInput where "sort_by" Data.Aeson..= sort_by a, "global_experiments_only" Data.Aeson..= global_experiments_only a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, -<<<<<<< HEAD -<<<<<<< HEAD - "prefix" Data.Aeson..= prefix a, -======= ->>>>>>> 6e8749e1 (Test) -======= "prefix" Data.Aeson..= prefix a, ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) "context" Data.Aeson..= context a ] @@ -160,14 +132,7 @@ instance Data.Aeson.FromJSON ListExperimentInput where Control.Applicative.<*> (v Data.Aeson..:? "sort_by") Control.Applicative.<*> (v Data.Aeson..:? "global_experiments_only") Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") -<<<<<<< HEAD -<<<<<<< HEAD - Control.Applicative.<*> (v Data.Aeson..:? "prefix") -======= ->>>>>>> 6e8749e1 (Test) -======= Control.Applicative.<*> (v Data.Aeson..:? "prefix") ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) Control.Applicative.<*> (v Data.Aeson..:? "context") @@ -191,14 +156,7 @@ data ListExperimentInputBuilderState = ListExperimentInputBuilderState { sort_byBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, global_experiments_onlyBuilderState :: Data.Maybe.Maybe Bool, dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, -<<<<<<< HEAD -<<<<<<< HEAD prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), -======= ->>>>>>> 6e8749e1 (Test) -======= - prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) } deriving ( GHC.Generics.Generic @@ -223,14 +181,7 @@ defaultBuilderState = ListExperimentInputBuilderState { sort_byBuilderState = Data.Maybe.Nothing, global_experiments_onlyBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing, -<<<<<<< HEAD -<<<<<<< HEAD - prefixBuilderState = Data.Maybe.Nothing, -======= ->>>>>>> 6e8749e1 (Test) -======= prefixBuilderState = Data.Maybe.Nothing, ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) contextBuilderState = Data.Maybe.Nothing } @@ -304,19 +255,10 @@ setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMa setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) setPrefix :: Data.Maybe.Maybe ([] Data.Text.Text) -> ListExperimentInputBuilder () setPrefix value = Control.Monad.State.Strict.modify (\s -> (s { prefixBuilderState = value })) -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> ListExperimentInputBuilder () setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) @@ -341,14 +283,7 @@ build builder = do sort_by' <- Data.Either.Right (sort_byBuilderState st) global_experiments_only' <- Data.Either.Right (global_experiments_onlyBuilderState st) dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) -<<<<<<< HEAD -<<<<<<< HEAD - prefix' <- Data.Either.Right (prefixBuilderState st) -======= ->>>>>>> 6e8749e1 (Test) -======= prefix' <- Data.Either.Right (prefixBuilderState st) ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context' <- Data.Either.Right (contextBuilderState st) Data.Either.Right (ListExperimentInput { count = count', @@ -368,14 +303,7 @@ build builder = do sort_by = sort_by', global_experiments_only = global_experiments_only', dimension_match_strategy = dimension_match_strategy', -<<<<<<< HEAD -<<<<<<< HEAD - prefix = prefix', -======= ->>>>>>> 6e8749e1 (Test) -======= prefix = prefix', ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context = context' }) @@ -405,6 +333,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ======= @@ -430,6 +359,9 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) +>>>>>>> 45a3cd01 (reabse fix) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs index 5c5c27552..eb4812a99 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs @@ -5,6 +5,7 @@ module Io.Superposition.Model.ListExperimentOutput ( <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD setLastModified, ======= @@ -30,6 +31,9 @@ module Io.Superposition.Model.ListExperimentOutput ( setLastModified, >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + setLastModified, +>>>>>>> 45a3cd01 (reabse fix) build, ListExperimentOutputBuilder, ListExperimentOutput, @@ -38,9 +42,8 @@ module Io.Superposition.Model.ListExperimentOutput ( <<<<<<< HEAD <<<<<<< HEAD data', -<<<<<<< HEAD -<<<<<<< HEAD last_modified +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -64,6 +67,8 @@ module Io.Superposition.Model.ListExperimentOutput ( last_modified >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -87,9 +92,8 @@ data ListExperimentOutput = ListExperimentOutput { <<<<<<< HEAD <<<<<<< HEAD data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, -<<<<<<< HEAD -<<<<<<< HEAD last_modified :: Data.Time.UTCTime +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -113,6 +117,8 @@ data ListExperimentOutput = ListExperimentOutput { last_modified :: Data.Time.UTCTime >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -126,9 +132,8 @@ instance Data.Aeson.ToJSON ListExperimentOutput where <<<<<<< HEAD <<<<<<< HEAD "data" Data.Aeson..= data' a, -<<<<<<< HEAD -<<<<<<< HEAD "last_modified" Data.Aeson..= last_modified a +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -152,6 +157,8 @@ instance Data.Aeson.ToJSON ListExperimentOutput where "last_modified" Data.Aeson..= last_modified a >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) ] @@ -165,6 +172,7 @@ instance Data.Aeson.FromJSON ListExperimentOutput where <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Control.Applicative.<*> (v Data.Aeson..: "last_modified") ======= @@ -190,6 +198,9 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Control.Applicative.<*> (v Data.Aeson..: "last_modified") >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + Control.Applicative.<*> (v Data.Aeson..: "last_modified") +>>>>>>> 45a3cd01 (reabse fix) @@ -200,9 +211,8 @@ data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { <<<<<<< HEAD <<<<<<< HEAD data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), -<<<<<<< HEAD -<<<<<<< HEAD last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -226,6 +236,8 @@ data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) } deriving ( GHC.Generics.Generic ) @@ -237,9 +249,8 @@ defaultBuilderState = ListExperimentOutputBuilderState { <<<<<<< HEAD <<<<<<< HEAD data'BuilderState = Data.Maybe.Nothing, -<<<<<<< HEAD -<<<<<<< HEAD last_modifiedBuilderState = Data.Maybe.Nothing +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -263,6 +274,8 @@ defaultBuilderState = ListExperimentOutputBuilderState { last_modifiedBuilderState = Data.Maybe.Nothing >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) } type ListExperimentOutputBuilder = Control.Monad.State.Strict.State ListExperimentOutputBuilderState @@ -283,6 +296,7 @@ setData' value = <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -293,19 +307,11 @@ setData' value = >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) -setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () -setLastModified value = - Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) -======= -setLastModifiedAt :: Data.Time.UTCTime -> ListExperimentOutputBuilder () -setLastModifiedAt value = - Control.Monad.State.Strict.modify (\s -> (s { last_modified_atBuilderState = Data.Maybe.Just value })) ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () setLastModified value = Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) ->>>>>>> 82479b8f (fix: more fixes) <<<<<<< HEAD <<<<<<< HEAD @@ -324,24 +330,20 @@ build builder = do <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) -======= - last_modified_at' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified_at is a required property.") Data.Either.Right (last_modified_atBuilderState st) ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) ->>>>>>> 82479b8f (fix: more fixes) Data.Either.Right (ListExperimentOutput { total_pages = total_pages', total_items = total_items', data' = data'', -<<<<<<< HEAD -<<<<<<< HEAD last_modified = last_modified' +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -373,6 +375,8 @@ build builder = do last_modified = last_modified' >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) }) @@ -398,12 +402,11 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where total_pages = var2, total_items = var3, data' = var1, -<<<<<<< HEAD -<<<<<<< HEAD last_modified = var0 <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) @@ -420,5 +423,7 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where last_modified = var0 >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index 17e490279..f586be065 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -276,6 +276,7 @@ final class SuperpositionAsyncClientImpl extends Client implements Superposition <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -308,6 +309,10 @@ >>>>>>> de718464 (fix: more fixes) >>>>>>> c1293812 (Test) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +======= + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) +>>>>>>> 45a3cd01 (reabse fix) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index 2797652a9..f518d5d4a 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -276,6 +276,7 @@ final class SuperpositionClientImpl extends Client implements SuperpositionClien <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) @@ -308,6 +309,10 @@ >>>>>>> de718464 (fix: more fixes) >>>>>>> c1293812 (Test) .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) +======= + .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) + .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) +>>>>>>> 45a3cd01 (reabse fix) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java index dace1d25a..4e7d468c1 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java @@ -40,9 +40,8 @@ public final class GetConfigInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, -<<<<<<< HEAD -<<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -65,6 +64,8 @@ >>>>>>> c1293812 (Test) new HttpHeaderTrait("if-modified-since")) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java index d09080ae8..06fe80114 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java @@ -42,9 +42,8 @@ public final class ListExperimentGroupsInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, -<<<<<<< HEAD -<<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -67,6 +66,8 @@ >>>>>>> c1293812 (Test) new HttpHeaderTrait("if-modified-since")) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) .putMember("name", PreludeSchemas.STRING, new HttpQueryTrait("name")) .putMember("created_by", PreludeSchemas.STRING, @@ -83,18 +84,15 @@ >>>>>>> de718464 (fix: more fixes) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, - new HttpQueryTrait("dimension_match_strategy")) -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) ->>>>>>> 82479b8f (fix: more fixes) .putMember("context", SharedSchemas.CONTEXT_MAP) ======= <<<<<<< HEAD @@ -127,16 +125,14 @@ >>>>>>> de718464 (fix: more fixes) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); ->>>>>>> 82479b8f (fix: more fixes) private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); ======= <<<<<<< HEAD @@ -166,16 +162,14 @@ >>>>>>> de718464 (fix: more fixes) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - private final transient DimensionMatchStrategy dimensionMatchStrategy; -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) private final transient DimensionMatchStrategy dimensionMatchStrategy; ->>>>>>> 82479b8f (fix: more fixes) private final transient Map context; ======= <<<<<<< HEAD @@ -206,16 +200,14 @@ private ListExperimentGroupsInput(Builder builder) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - this.dimensionMatchStrategy = builder.dimensionMatchStrategy; -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) this.dimensionMatchStrategy = builder.dimensionMatchStrategy; ->>>>>>> 82479b8f (fix: more fixes) this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); ======= <<<<<<< HEAD @@ -321,6 +313,7 @@ public boolean hasGroupType() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -333,15 +326,12 @@ >>>>>>> c1293812 (Test) ======= >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) public Map context() { if (context == null) { return Collections.emptyMap(); @@ -388,14 +378,7 @@ public boolean equals(Object other) { <<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.groupType, that.groupType) -<<<<<<< HEAD -<<<<<<< HEAD - && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) -======= ->>>>>>> 6e8749e1 (Test) -======= && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) ->>>>>>> 82479b8f (fix: more fixes) && Objects.equals(this.context, that.context); ======= <<<<<<< HEAD @@ -418,6 +401,7 @@ public int hashCode() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ======= @@ -444,6 +428,9 @@ >>>>>>> c1293812 (Test) return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); +>>>>>>> 45a3cd01 (reabse fix) } @Override @@ -489,6 +476,7 @@ public void serializeMembers(ShapeSerializer serializer) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -499,16 +487,11 @@ public void serializeMembers(ShapeSerializer serializer) { >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - if (dimensionMatchStrategy != null) { - serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); - } -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } ->>>>>>> 82479b8f (fix: more fixes) if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } @@ -551,13 +534,12 @@ public T getMemberValue(Schema member) { case 9 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, sortOn); case 10 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); case 11 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); -<<<<<<< HEAD -<<<<<<< HEAD case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) @@ -575,6 +557,8 @@ >>>>>>> c1293812 (Test) case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -604,16 +588,14 @@ public Builder toBuilder() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - builder.dimensionMatchStrategy(this.dimensionMatchStrategy); -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) builder.dimensionMatchStrategy(this.dimensionMatchStrategy); ->>>>>>> 82479b8f (fix: more fixes) builder.context(this.context); ======= <<<<<<< HEAD @@ -657,16 +639,14 @@ public static final class Builder implements ShapeBuilder>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - private DimensionMatchStrategy dimensionMatchStrategy; -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) private DimensionMatchStrategy dimensionMatchStrategy; ->>>>>>> 82479b8f (fix: more fixes) private Map context; ======= <<<<<<< HEAD @@ -820,10 +800,6 @@ public Builder groupType(List groupType) { /** * @return this builder. */ -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 82479b8f (fix: more fixes) public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrategy) { this.dimensionMatchStrategy = dimensionMatchStrategy; return this; @@ -832,11 +808,6 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat /** * @return this builder. */ -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) public Builder context(Map context) { this.context = context; return this; @@ -885,13 +856,12 @@ public void setMemberValue(Schema member, Object value) { case 9 -> sortOn((ExperimentGroupSortOn) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, value)); case 10 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); case 11 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); -<<<<<<< HEAD -<<<<<<< HEAD case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) @@ -909,6 +879,8 @@ >>>>>>> c1293812 (Test) case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -971,13 +943,12 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 9 -> builder.sortOn(ExperimentGroupSortOn.builder().deserializeMember(de, member).build()); case 10 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); case 11 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); -<<<<<<< HEAD -<<<<<<< HEAD case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 8fc501b7 (fix: more fixes) >>>>>>> 91d47048 (fix: more fixes) @@ -995,6 +966,8 @@ >>>>>>> c1293812 (Test) case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java index 790b77485..44835c6b9 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java @@ -42,9 +42,8 @@ public final class ListExperimentInput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, -<<<<<<< HEAD -<<<<<<< HEAD new HttpHeaderTrait("if-modified-since")) +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -67,6 +66,8 @@ >>>>>>> c1293812 (Test) new HttpHeaderTrait("if-modified-since")) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) .putMember("status", SharedSchemas.EXPERIMENT_STATUS_TYPE_LIST, new HttpQueryTrait("status")) .putMember("from_date", SharedSchemas.DATE_TIME, @@ -89,16 +90,8 @@ >>>>>>> de718464 (fix: more fixes) new HttpQueryTrait("global_experiments_only")) .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) -<<<<<<< HEAD -<<<<<<< HEAD .putMember("prefix", SharedSchemas.STRING_LIST, new HttpQueryTrait("prefix")) -======= ->>>>>>> 6e8749e1 (Test) -======= - .putMember("prefix", SharedSchemas.STRING_LIST, - new HttpQueryTrait("prefix")) ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); @@ -119,14 +112,7 @@ >>>>>>> de718464 (fix: more fixes) private static final Schema $SCHEMA_SORT_BY = $SCHEMA.member("sort_by"); private static final Schema $SCHEMA_GLOBAL_EXPERIMENTS_ONLY = $SCHEMA.member("global_experiments_only"); private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); -<<<<<<< HEAD -<<<<<<< HEAD - private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); -======= ->>>>>>> 6e8749e1 (Test) -======= private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); private final transient Integer count; @@ -146,14 +132,7 @@ >>>>>>> de718464 (fix: more fixes) private final transient SortBy sortBy; private final transient Boolean globalExperimentsOnly; private final transient DimensionMatchStrategy dimensionMatchStrategy; -<<<<<<< HEAD -<<<<<<< HEAD - private final transient List prefix; -======= ->>>>>>> 6e8749e1 (Test) -======= private final transient List prefix; ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) private final transient Map context; private ListExperimentInput(Builder builder) { @@ -174,14 +153,7 @@ private ListExperimentInput(Builder builder) { this.sortBy = builder.sortBy; this.globalExperimentsOnly = builder.globalExperimentsOnly; this.dimensionMatchStrategy = builder.dimensionMatchStrategy; -<<<<<<< HEAD -<<<<<<< HEAD - this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); -======= ->>>>>>> 6e8749e1 (Test) -======= this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); } @@ -295,10 +267,6 @@ public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public List prefix() { if (prefix == null) { return Collections.emptyList(); @@ -310,11 +278,6 @@ public boolean hasPrefix() { return prefix != null; } -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public Map context() { if (context == null) { return Collections.emptyMap(); @@ -357,28 +320,13 @@ public boolean equals(Object other) { && Objects.equals(this.sortBy, that.sortBy) && Objects.equals(this.globalExperimentsOnly, that.globalExperimentsOnly) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) -<<<<<<< HEAD -<<<<<<< HEAD - && Objects.equals(this.prefix, that.prefix) -======= ->>>>>>> 6e8749e1 (Test) -======= && Objects.equals(this.prefix, that.prefix) ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) && Objects.equals(this.context, that.context); } @Override public int hashCode() { -<<<<<<< HEAD -<<<<<<< HEAD - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, prefix, context); -======= - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, context); ->>>>>>> 6e8749e1 (Test) -======= return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, status, fromDate, toDate, experimentName, experimentIds, experimentGroupIds, createdBy, sortOn, sortBy, globalExperimentsOnly, dimensionMatchStrategy, prefix, context); ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) } @Override @@ -435,18 +383,9 @@ public void serializeMembers(ShapeSerializer serializer) { if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } -<<<<<<< HEAD -<<<<<<< HEAD - if (prefix != null) { - serializer.writeList($SCHEMA_PREFIX, prefix, prefix.size(), SharedSerde.StringListSerializer.INSTANCE); - } -======= ->>>>>>> 6e8749e1 (Test) -======= if (prefix != null) { serializer.writeList($SCHEMA_PREFIX, prefix, prefix.size(), SharedSerde.StringListSerializer.INSTANCE); } ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } @@ -473,17 +412,8 @@ public T getMemberValue(Schema member) { case 14 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); case 15 -> (T) SchemaUtils.validateSameMember($SCHEMA_GLOBAL_EXPERIMENTS_ONLY, member, globalExperimentsOnly); case 16 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); -<<<<<<< HEAD -<<<<<<< HEAD - case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); - case 18 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); -======= - case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); ->>>>>>> 6e8749e1 (Test) -======= case 17 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); case 18 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -514,14 +444,7 @@ public Builder toBuilder() { builder.sortBy(this.sortBy); builder.globalExperimentsOnly(this.globalExperimentsOnly); builder.dimensionMatchStrategy(this.dimensionMatchStrategy); -<<<<<<< HEAD -<<<<<<< HEAD - builder.prefix(this.prefix); -======= ->>>>>>> 6e8749e1 (Test) -======= builder.prefix(this.prefix); ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) builder.context(this.context); return builder; } @@ -555,14 +478,7 @@ public static final class Builder implements ShapeBuilder { private SortBy sortBy; private Boolean globalExperimentsOnly; private DimensionMatchStrategy dimensionMatchStrategy; -<<<<<<< HEAD -<<<<<<< HEAD - private List prefix; -======= ->>>>>>> 6e8749e1 (Test) -======= private List prefix; ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) private Map context; private Builder() {} @@ -725,10 +641,6 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat /** * @return this builder. */ -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public Builder prefix(List prefix) { this.prefix = prefix; return this; @@ -737,11 +649,6 @@ public Builder prefix(List prefix) { /** * @return this builder. */ -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) public Builder context(Map context) { this.context = context; return this; @@ -774,17 +681,8 @@ public void setMemberValue(Schema member, Object value) { case 14 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); case 15 -> globalExperimentsOnly((boolean) SchemaUtils.validateSameMember($SCHEMA_GLOBAL_EXPERIMENTS_ONLY, member, value)); case 16 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); -<<<<<<< HEAD -<<<<<<< HEAD case 17 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); case 18 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); -======= - case 17 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); ->>>>>>> 6e8749e1 (Test) -======= - case 17 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); - case 18 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -838,17 +736,8 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 14 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); case 15 -> builder.globalExperimentsOnly(de.readBoolean(member)); case 16 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); -<<<<<<< HEAD -<<<<<<< HEAD - case 17 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); - case 18 -> builder.context(SharedSerde.deserializeContextMap(member, de)); -======= - case 17 -> builder.context(SharedSerde.deserializeContextMap(member, de)); ->>>>>>> 6e8749e1 (Test) -======= case 17 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); case 18 -> builder.context(SharedSerde.deserializeContextMap(member, de)); ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java index f79e166fc..1e1dc6d11 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java @@ -34,17 +34,14 @@ public final class ListExperimentOutput implements SerializableStruct { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - .putMember("last_modified", SharedSchemas.DATE_TIME, -======= - .putMember("last_modified_at", SharedSchemas.DATE_TIME, ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) .putMember("last_modified", SharedSchemas.DATE_TIME, ->>>>>>> 82479b8f (fix: more fixes) new HttpHeaderTrait("last-modified"), new RequiredTrait()) ======= @@ -68,6 +65,7 @@ >>>>>>> de718464 (fix: more fixes) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ======= @@ -93,6 +91,9 @@ >>>>>>> c1293812 (Test) private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); +>>>>>>> 45a3cd01 (reabse fix) private final transient int totalPages; private final transient int totalItems; @@ -100,6 +101,7 @@ >>>>>>> de718464 (fix: more fixes) <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private final transient Instant lastModified; ======= @@ -125,6 +127,9 @@ >>>>>>> c1293812 (Test) private final transient Instant lastModified; >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + private final transient Instant lastModified; +>>>>>>> 45a3cd01 (reabse fix) private ListExperimentOutput(Builder builder) { this.totalPages = builder.totalPages; @@ -133,6 +138,7 @@ private ListExperimentOutput(Builder builder) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD this.lastModified = builder.lastModified; ======= @@ -158,6 +164,9 @@ >>>>>>> c1293812 (Test) this.lastModified = builder.lastModified; >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + this.lastModified = builder.lastModified; +>>>>>>> 45a3cd01 (reabse fix) } public int totalPages() { @@ -180,6 +189,7 @@ public boolean hasData() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -190,16 +200,10 @@ public boolean hasData() { >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - public Instant lastModified() { - return lastModified; -======= - public Instant lastModifiedAt() { - return lastModifiedAt; ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) public Instant lastModified() { return lastModified; ->>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD @@ -228,9 +232,8 @@ public boolean equals(Object other) { <<<<<<< HEAD <<<<<<< HEAD && Objects.equals(this.data, that.data) -<<<<<<< HEAD -<<<<<<< HEAD && Objects.equals(this.lastModified, that.lastModified); +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -254,6 +257,8 @@ >>>>>>> c1293812 (Test) && Objects.equals(this.lastModified, that.lastModified); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) } @Override @@ -261,6 +266,7 @@ public int hashCode() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD return Objects.hash(totalPages, totalItems, data, lastModified); ======= @@ -287,6 +293,9 @@ >>>>>>> c1293812 (Test) return Objects.hash(totalPages, totalItems, data, lastModified); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + return Objects.hash(totalPages, totalItems, data, lastModified); +>>>>>>> 45a3cd01 (reabse fix) } @Override @@ -302,6 +311,7 @@ public void serializeMembers(ShapeSerializer serializer) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ======= @@ -327,6 +337,9 @@ >>>>>>> c1293812 (Test) serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); +>>>>>>> 45a3cd01 (reabse fix) } @Override @@ -339,6 +352,7 @@ public T getMemberValue(Schema member) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ======= @@ -364,6 +378,9 @@ >>>>>>> c1293812 (Test) case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); +>>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -383,6 +400,7 @@ public Builder toBuilder() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD builder.lastModified(this.lastModified); ======= @@ -408,6 +426,9 @@ >>>>>>> c1293812 (Test) builder.lastModified(this.lastModified); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + builder.lastModified(this.lastModified); +>>>>>>> 45a3cd01 (reabse fix) return builder; } @@ -429,6 +450,7 @@ public static final class Builder implements ShapeBuilder <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD private Instant lastModified; ======= @@ -454,6 +476,9 @@ >>>>>>> c1293812 (Test) private Instant lastModified; >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + private Instant lastModified; +>>>>>>> 45a3cd01 (reabse fix) private Builder() {} @@ -504,21 +529,9 @@ public Builder data(List data) { *

Required * @return this builder. */ -<<<<<<< HEAD -<<<<<<< HEAD - public Builder lastModified(Instant lastModified) { - this.lastModified = Objects.requireNonNull(lastModified, "lastModified cannot be null"); - tracker.setMember($SCHEMA_LAST_MODIFIED); -======= - public Builder lastModifiedAt(Instant lastModifiedAt) { - this.lastModifiedAt = Objects.requireNonNull(lastModifiedAt, "lastModifiedAt cannot be null"); - tracker.setMember($SCHEMA_LAST_MODIFIED_AT); ->>>>>>> 6e8749e1 (Test) -======= public Builder lastModified(Instant lastModified) { this.lastModified = Objects.requireNonNull(lastModified, "lastModified cannot be null"); tracker.setMember($SCHEMA_LAST_MODIFIED); ->>>>>>> 82479b8f (fix: more fixes) return this; } @@ -545,6 +558,7 @@ public void setMemberValue(Schema member, Object value) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ======= @@ -570,6 +584,9 @@ >>>>>>> c1293812 (Test) case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); +>>>>>>> 45a3cd01 (reabse fix) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -592,20 +609,15 @@ public ShapeBuilder errorCorrection() { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { - lastModified(Instant.EPOCH); -======= - if (!tracker.checkMember($SCHEMA_LAST_MODIFIED_AT)) { - lastModifiedAt(Instant.EPOCH); ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { lastModified(Instant.EPOCH); ->>>>>>> 82479b8f (fix: more fixes) } ======= <<<<<<< HEAD @@ -647,6 +659,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD case 3 -> builder.lastModified(de.readTimestamp(member)); ======= @@ -672,6 +685,9 @@ >>>>>>> c1293812 (Test) case 3 -> builder.lastModified(de.readTimestamp(member)); >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + case 3 -> builder.lastModified(de.readTimestamp(member)); +>>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts index 0a20ec962..5fd549d1b 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts @@ -68,18 +68,9 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * sort_by: "desc" || "asc", * global_experiments_only: true || false, * dimension_match_strategy: "exact" || "subset", -<<<<<<< HEAD -<<<<<<< HEAD * prefix: [ * "STRING_VALUE", * ], -======= ->>>>>>> 6e8749e1 (Test) -======= - * prefix: [ - * "STRING_VALUE", - * ], ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, @@ -130,6 +121,7 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD * // last_modified: new Date("TIMESTAMP"), // required ======= @@ -155,6 +147,9 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // last_modified: new Date("TIMESTAMP"), // required >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + * // last_modified: new Date("TIMESTAMP"), // required +>>>>>>> 45a3cd01 (reabse fix) * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts index f29bee33a..ef6deb97b 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts @@ -61,6 +61,7 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -71,12 +72,9 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - * dimension_match_strategy: "exact" || "subset", -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) * dimension_match_strategy: "exact" || "subset", ->>>>>>> 82479b8f (fix: more fixes) * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index d40514bb3..b8b6746b6 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -2028,21 +2028,12 @@ export interface ListExperimentGroupsInput { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 82479b8f (fix: more fixes) * Strategy to follow while filter items based on the context * @public */ dimension_match_strategy?: DimensionMatchStrategy | undefined; /** -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) * Map representing the context. * Keys correspond to the names of the dimensions. * @public @@ -2172,14 +2163,7 @@ export interface ListExperimentInput { */ dimension_match_strategy?: DimensionMatchStrategy | undefined; -<<<<<<< HEAD -<<<<<<< HEAD prefix?: (string)[] | undefined; -======= ->>>>>>> 6e8749e1 (Test) -======= - prefix?: (string)[] | undefined; ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /** * Map representing the context. * Keys correspond to the names of the dimensions. @@ -2198,6 +2182,7 @@ export interface ListExperimentOutput { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD last_modified: Date | undefined; ======= @@ -2223,6 +2208,9 @@ export interface ListExperimentOutput { last_modified: Date | undefined; >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + last_modified: Date | undefined; +>>>>>>> 45a3cd01 (reabse fix) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index 396af267f..a02194523 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -4120,6 +4120,7 @@ export const de_ListExperimentCommand = async( <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ======= @@ -4145,6 +4146,9 @@ export const de_ListExperimentCommand = async( [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], +>>>>>>> 45a3cd01 (reabse fix) }); const data: Record = __expectNonNull((__expectObject(await parseBody(output.body, context))), "body"); const doc = take(data, { diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index 809c0a978..cc8d59099 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -1729,15 +1729,7 @@ "target": DATE_TIME, "index": 4, "traits": [ -<<<<<<< HEAD -<<<<<<< HEAD - Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), -======= - Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), ->>>>>>> 6e8749e1 (Test) -======= Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), ->>>>>>> 82479b8f (fix: more fixes) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -10057,15 +10049,7 @@ "target": DATE_TIME, "index": 5, "traits": [ -<<<<<<< HEAD -<<<<<<< HEAD - Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), -======= - Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), ->>>>>>> 6e8749e1 (Test) -======= Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), ->>>>>>> 82479b8f (fix: more fixes) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -10137,6 +10121,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, @@ -10150,11 +10135,8 @@ >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - "dimension_match_strategy": { - "target": DIMENSION_MATCH_STRATEGY, - "index": 12, -======= ======= +>>>>>>> 45a3cd01 (reabse fix) "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 12, @@ -10165,34 +10147,6 @@ ], }, ->>>>>>> 82479b8f (fix: more fixes) - "context": { - "target": CONTEXT_MAP, - "index": 13, - "traits": [ - Trait.new(id=ShapeID("smithy.api#notProperty")), - - ], - }, - - } -) - -EXPERIMENT_GROUP_RESPONSE = Schema.collection( - id=ShapeID("io.superposition#ExperimentGroupResponse"), - - members={ - "id": { - "target": STRING, - "index": 0, ->>>>>>> 6e8749e1 (Test) - "traits": [ - Trait.new(id=ShapeID("smithy.api#notProperty")), - Trait.new(id=ShapeID("smithy.api#httpQuery"), value="dimension_match_strategy"), - - ], - }, - "context": { "target": CONTEXT_MAP, "index": 13, @@ -11074,15 +11028,7 @@ "target": DATE_TIME, "index": 5, "traits": [ -<<<<<<< HEAD -<<<<<<< HEAD - Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), -======= - Trait.new(id=ShapeID("smithy.api#httpHeader"), value="If-Modified-Since"), ->>>>>>> 6e8749e1 (Test) -======= Trait.new(id=ShapeID("smithy.api#httpHeader"), value="if-modified-since"), ->>>>>>> 82479b8f (fix: more fixes) Trait.new(id=ShapeID("smithy.api#notProperty")), ], @@ -11204,10 +11150,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) "prefix": { "target": STRING_LIST, "index": 17, @@ -11218,21 +11160,11 @@ ], }, -<<<<<<< HEAD "context": { "target": CONTEXT_MAP, "index": 18, "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), -======= -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) - "context": { - "target": CONTEXT_MAP, - "index": 18, - "traits": [ - Trait.new(id=ShapeID("smithy.api#notProperty")), ->>>>>>> 6e8749e1 (Test) ], }, @@ -11279,6 +11211,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -11289,13 +11222,9 @@ >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - "last_modified": { -======= - "last_modified_at": { ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) "last_modified": { ->>>>>>> 82479b8f (fix: more fixes) "target": DATE_TIME, "index": 3, "traits": [ diff --git a/clients/python/sdk/superposition_sdk/config.py b/clients/python/sdk/superposition_sdk/config.py index c27e2aafd..366f268ed 100644 --- a/clients/python/sdk/superposition_sdk/config.py +++ b/clients/python/sdk/superposition_sdk/config.py @@ -192,6 +192,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] ======= _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] @@ -205,6 +206,9 @@ _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] >>>>>>> 6e8749e1 (Test) >>>>>>> c1293812 (Test) +======= +_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] +>>>>>>> 45a3cd01 (reabse fix) @dataclass(init=False) class Config: """Configuration for Superposition.""" diff --git a/clients/python/sdk/superposition_sdk/deserialize.py b/clients/python/sdk/superposition_sdk/deserialize.py index e2843601c..cb1f810be 100644 --- a/clients/python/sdk/superposition_sdk/deserialize.py +++ b/clients/python/sdk/superposition_sdk/deserialize.py @@ -1551,15 +1551,7 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf _key_lowercase = key.lower() match _key_lowercase: case "last-modified": -<<<<<<< HEAD -<<<<<<< HEAD - kwargs["last_modified"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) -======= - kwargs["last_modified_at"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) ->>>>>>> 6e8749e1 (Test) -======= kwargs["last_modified"] = ensure_utc(datetime.fromisoformat(expect_type(str, value))) ->>>>>>> 82479b8f (fix: more fixes) case _: pass diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index d8790dd7a..6a432ecb7 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -10194,6 +10194,7 @@ class ListExperimentGroupsInput: <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -10204,16 +10205,11 @@ class ListExperimentGroupsInput: >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - :param dimension_match_strategy: - Strategy to follow while filter items based on the context - -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) :param dimension_match_strategy: Strategy to follow while filter items based on the context ->>>>>>> 82479b8f (fix: more fixes) :param context: Map representing the context. Keys correspond to the names of the dimensions. @@ -10242,16 +10238,14 @@ class ListExperimentGroupsInput: <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - dimension_match_strategy: str | None = None -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) dimension_match_strategy: str | None = None ->>>>>>> 82479b8f (fix: more fixes) context: dict[str, Document] | None = None ======= <<<<<<< HEAD @@ -10327,18 +10321,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 12: -<<<<<<< HEAD -<<<<<<< HEAD kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) case 13: -======= ->>>>>>> 6e8749e1 (Test) -======= - kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) - - case 13: ->>>>>>> 82479b8f (fix: more fixes) kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["context"]) <<<<<<< HEAD @@ -11097,14 +11082,7 @@ class ListExperimentInput: sort_by: str | None = None global_experiments_only: bool | None = None dimension_match_strategy: str | None = None -<<<<<<< HEAD -<<<<<<< HEAD - prefix: list[str] | None = None -======= ->>>>>>> 6e8749e1 (Test) -======= prefix: list[str] | None = None ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context: dict[str, Document] | None = None def serialize(self, serializer: ShapeSerializer): @@ -11176,18 +11154,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_INPUT.members["dimension_match_strategy"]) case 17: -<<<<<<< HEAD -<<<<<<< HEAD - kwargs["prefix"] = _deserialize_string_list(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["prefix"]) - - case 18: -======= ->>>>>>> 6e8749e1 (Test) -======= kwargs["prefix"] = _deserialize_string_list(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["prefix"]) case 18: ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_INPUT.members["context"]) case _: @@ -11209,17 +11178,14 @@ class ListExperimentOutput: <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - last_modified: datetime -======= - last_modified_at: datetime ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) last_modified: datetime ->>>>>>> 82479b8f (fix: more fixes) ======= <<<<<<< HEAD @@ -11262,15 +11228,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: <<<<<<< HEAD <<<<<<< HEAD case 3: -<<<<<<< HEAD -<<<<<<< HEAD - kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) -======= - kwargs["last_modified_at"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified_at"]) ->>>>>>> 6e8749e1 (Test) -======= kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) ->>>>>>> 82479b8f (fix: more fixes) ======= <<<<<<< HEAD diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index bfd5839b4..a2f9a43e9 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1058,9 +1058,8 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: -<<<<<<< HEAD -<<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -1083,6 +1082,8 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) return _HTTPRequest( destination=_URI( host="", @@ -2065,9 +2066,8 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: -<<<<<<< HEAD -<<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -2090,6 +2090,8 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) return _HTTPRequest( destination=_URI( host="", @@ -2153,9 +2155,8 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co <<<<<<< HEAD <<<<<<< HEAD if input.if_modified_since is not None: -<<<<<<< HEAD -<<<<<<< HEAD headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -2178,6 +2179,8 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) return _HTTPRequest( destination=_URI( host="", diff --git a/crates/superposition_sdk/src/client/customize.rs b/crates/superposition_sdk/src/client/customize.rs index 7727b6f50..122e8d910 100644 --- a/crates/superposition_sdk/src/client/customize.rs +++ b/crates/superposition_sdk/src/client/customize.rs @@ -81,6 +81,7 @@ + /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. diff --git a/crates/superposition_sdk/src/client/list_experiment.rs b/crates/superposition_sdk/src/client/list_experiment.rs index fa7717e88..ac0a28a87 100644 --- a/crates/superposition_sdk/src/client/list_experiment.rs +++ b/crates/superposition_sdk/src/client/list_experiment.rs @@ -20,14 +20,7 @@ impl super::Client { /// - [`sort_by(SortBy)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::sort_by) / [`set_sort_by(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_sort_by):
required: **false**
Sort order enumeration for list operations.
/// - [`global_experiments_only(bool)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::global_experiments_only) / [`set_global_experiments_only(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_global_experiments_only):
required: **false**
(undocumented)
/// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
-<<<<<<< HEAD -<<<<<<< HEAD /// - [`prefix(impl Into)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_prefix):
required: **false**
(undocumented)
-======= ->>>>>>> 6e8749e1 (Test) -======= - /// - [`prefix(impl Into)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_prefix):
required: **false**
(undocumented)
->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// - [`context(impl Into, Document)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment::builders::ListExperimentFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
/// - On success, responds with [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput) with field(s): /// - [`total_pages(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_pages): (undocumented) @@ -36,6 +29,7 @@ impl super::Client { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ======= @@ -61,6 +55,9 @@ impl super::Client { /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) +>>>>>>> 45a3cd01 (reabse fix) /// - On failure, responds with [`SdkError`](crate::operation::list_experiment::ListExperimentError) pub fn list_experiment(&self) -> crate::operation::list_experiment::builders::ListExperimentFluentBuilder { crate::operation::list_experiment::builders::ListExperimentFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/list_experiment_groups.rs b/crates/superposition_sdk/src/client/list_experiment_groups.rs index e68474d73..01afba9b9 100644 --- a/crates/superposition_sdk/src/client/list_experiment_groups.rs +++ b/crates/superposition_sdk/src/client/list_experiment_groups.rs @@ -19,16 +19,14 @@ impl super::Client { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
-======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
->>>>>>> 82479b8f (fix: more fixes) /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
======= <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs index 5bbe47ae0..720260d8e 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_input.rs @@ -37,16 +37,8 @@ pub struct ListExperimentInput { pub global_experiments_only: ::std::option::Option, /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, -<<<<<<< HEAD -<<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, -======= ->>>>>>> 6e8749e1 (Test) -======= - #[allow(missing_docs)] // documentation missing in model - pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, } @@ -131,10 +123,6 @@ impl ListExperimentInput { pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model /// /// If no value was sent for this field, a default will be set. If you want to determine if no value was sent, use `.prefix.is_none()`. @@ -142,11 +130,6 @@ impl ListExperimentInput { self.prefix.as_deref() .unwrap_or_default() } -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Map representing the context. Keys correspond to the names of the dimensions. pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() @@ -180,14 +163,7 @@ pub struct ListExperimentInputBuilder { pub(crate) sort_by: ::std::option::Option, pub(crate) global_experiments_only: ::std::option::Option, pub(crate) dimension_match_strategy: ::std::option::Option, -<<<<<<< HEAD -<<<<<<< HEAD - pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, -======= ->>>>>>> 6e8749e1 (Test) -======= pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, } impl ListExperimentInputBuilder { @@ -434,10 +410,6 @@ impl ListExperimentInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Appends an item to `prefix`. /// /// To override the contents of this collection use [`set_prefix`](Self::set_prefix). @@ -456,11 +428,6 @@ impl ListExperimentInputBuilder { pub fn get_prefix(&self) -> &::std::option::Option<::std::vec::Vec::<::std::string::String>> { &self.prefix } -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). @@ -518,16 +485,8 @@ impl ListExperimentInputBuilder { , dimension_match_strategy: self.dimension_match_strategy , -<<<<<<< HEAD -<<<<<<< HEAD - prefix: self.prefix - , -======= ->>>>>>> 6e8749e1 (Test) -======= prefix: self.prefix , ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) context: self.context , } diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs index 5b8467e57..492880b2e 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs @@ -12,9 +12,8 @@ pub struct ListExperimentOutput { <<<<<<< HEAD <<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model -<<<<<<< HEAD -<<<<<<< HEAD pub last_modified: ::aws_smithy_types::DateTime, +<<<<<<< HEAD ======= <<<<<<< HEAD <<<<<<< HEAD @@ -37,6 +36,8 @@ pub struct ListExperimentOutput { pub last_modified: ::aws_smithy_types::DateTime, >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) } impl ListExperimentOutput { #[allow(missing_docs)] // documentation missing in model @@ -60,18 +61,8 @@ impl ListExperimentOutput { ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model -<<<<<<< HEAD -<<<<<<< HEAD pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { &self.last_modified -======= - pub fn last_modified_at(&self) -> &::aws_smithy_types::DateTime { - &self.last_modified_at ->>>>>>> 6e8749e1 (Test) -======= - pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { - &self.last_modified ->>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD @@ -98,6 +89,7 @@ pub struct ListExperimentOutputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ======= @@ -123,6 +115,9 @@ pub struct ListExperimentOutputBuilder { pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, +>>>>>>> 45a3cd01 (reabse fix) } impl ListExperimentOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -181,26 +176,8 @@ impl ListExperimentOutputBuilder { >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model /// This field is required. -<<<<<<< HEAD -<<<<<<< HEAD - pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { - self.last_modified = ::std::option::Option::Some(input); - self - } - #[allow(missing_docs)] // documentation missing in model - pub fn set_last_modified(mut self, input: ::std::option::Option<::aws_smithy_types::DateTime>) -> Self { - self.last_modified = input; self - } - #[allow(missing_docs)] // documentation missing in model - pub fn get_last_modified(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { - &self.last_modified -======= - pub fn last_modified_at(mut self, input: ::aws_smithy_types::DateTime) -> Self { - self.last_modified_at = ::std::option::Option::Some(input); -======= pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { self.last_modified = ::std::option::Option::Some(input); ->>>>>>> 82479b8f (fix: more fixes) self } #[allow(missing_docs)] // documentation missing in model @@ -208,14 +185,8 @@ impl ListExperimentOutputBuilder { self.last_modified = input; self } #[allow(missing_docs)] // documentation missing in model -<<<<<<< HEAD - pub fn get_last_modified_at(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { - &self.last_modified_at ->>>>>>> 6e8749e1 (Test) -======= pub fn get_last_modified(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { &self.last_modified ->>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD @@ -232,6 +203,7 @@ impl ListExperimentOutputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ======= @@ -257,6 +229,9 @@ impl ListExperimentOutputBuilder { /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= + /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) +>>>>>>> 45a3cd01 (reabse fix) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::list_experiment::ListExperimentOutput { @@ -279,6 +254,7 @@ impl ListExperimentOutputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -289,19 +265,11 @@ impl ListExperimentOutputBuilder { >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - last_modified: self.last_modified - .ok_or_else(|| - ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") -======= - last_modified_at: self.last_modified_at - .ok_or_else(|| - ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified_at", "last_modified_at was not specified but it is required when building ListExperimentOutput") ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) last_modified: self.last_modified .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") ->>>>>>> 82479b8f (fix: more fixes) )? , <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment/builders.rs b/crates/superposition_sdk/src/operation/list_experiment/builders.rs index a308d88f0..68e8b7d3e 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/builders.rs @@ -355,10 +355,6 @@ impl ListExperimentFluentBuilder { self.inner.get_dimension_match_strategy() } /// -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Appends an item to `prefix`. /// /// To override the contents of this collection use [`set_prefix`](Self::set_prefix). @@ -378,11 +374,6 @@ impl ListExperimentFluentBuilder { self.inner.get_prefix() } /// -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs index 1517e73fe..70cc7f4da 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs @@ -31,6 +31,7 @@ pub struct ListExperimentGroupsInput { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -41,14 +42,10 @@ pub struct ListExperimentGroupsInput { >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - /// Strategy to follow while filter items based on the context - pub dimension_match_strategy: ::std::option::Option, -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, ->>>>>>> 82479b8f (fix: more fixes) /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, <<<<<<< HEAD @@ -115,6 +112,7 @@ impl ListExperimentGroupsInput { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -127,15 +125,12 @@ impl ListExperimentGroupsInput { ======= >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) /// Map representing the context. Keys correspond to the names of the dimensions. pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() @@ -175,16 +170,14 @@ pub struct ListExperimentGroupsInputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - pub(crate) dimension_match_strategy: ::std::option::Option, -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) pub(crate) dimension_match_strategy: ::std::option::Option, ->>>>>>> 82479b8f (fix: more fixes) pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, ======= <<<<<<< HEAD @@ -367,6 +360,7 @@ impl ListExperimentGroupsInputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -379,6 +373,8 @@ impl ListExperimentGroupsInputBuilder { ======= >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -392,11 +388,6 @@ impl ListExperimentGroupsInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) /// Adds a key-value pair to `context`. /// /// To override the contents of this collection use [`set_context`](Self::set_context). @@ -455,6 +446,7 @@ impl ListExperimentGroupsInputBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -465,14 +457,10 @@ impl ListExperimentGroupsInputBuilder { >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - dimension_match_strategy: self.dimension_match_strategy - , -======= ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) dimension_match_strategy: self.dimension_match_strategy , ->>>>>>> 82479b8f (fix: more fixes) context: self.context , <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs index 0006f65e2..97f3decdd 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs @@ -273,6 +273,7 @@ impl ListExperimentGroupsFluentBuilder { <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -285,6 +286,8 @@ impl ListExperimentGroupsFluentBuilder { ======= >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -299,11 +302,6 @@ impl ListExperimentGroupsFluentBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { self.inner.get_dimension_match_strategy() } -<<<<<<< HEAD -======= ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) /// /// Adds a key-value pair to `context`. /// diff --git a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs index a828f9429..174f473e4 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs @@ -95,15 +95,7 @@ pub fn ser_get_config_headers( err )) })?; -<<<<<<< HEAD -<<<<<<< HEAD - builder = builder.header("if-modified-since", header_value); -======= - builder = builder.header("If-Modified-Since", header_value); ->>>>>>> 6e8749e1 (Test) -======= builder = builder.header("if-modified-since", header_value); ->>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs index 0d440c863..073bfa30d 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs @@ -41,6 +41,7 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -51,19 +52,11 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - output = output.set_last_modified( - crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) - .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? -======= - output = output.set_last_modified_at( - crate::protocol_serde::shape_list_experiment_output::de_last_modified_at_header(_response_headers) - .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified_at from header `last-modified"))? ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) output = output.set_last_modified( crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? ->>>>>>> 82479b8f (fix: more fixes) ); <<<<<<< HEAD <<<<<<< HEAD @@ -122,15 +115,7 @@ pub fn ser_list_experiment_headers( err )) })?; -<<<<<<< HEAD -<<<<<<< HEAD - builder = builder.header("if-modified-since", header_value); -======= - builder = builder.header("If-Modified-Since", header_value); ->>>>>>> 6e8749e1 (Test) -======= builder = builder.header("if-modified-since", header_value); ->>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs index cd15527af..99e7ab0b6 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs @@ -91,15 +91,7 @@ pub fn ser_list_experiment_groups_headers( err )) })?; -<<<<<<< HEAD -<<<<<<< HEAD - builder = builder.header("if-modified-since", header_value); -======= - builder = builder.header("If-Modified-Since", header_value); ->>>>>>> 6e8749e1 (Test) -======= builder = builder.header("if-modified-since", header_value); ->>>>>>> 82479b8f (fix: more fixes) } <<<<<<< HEAD <<<<<<< HEAD diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs index 24a38b1ff..96239da1e 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_output.rs @@ -1,13 +1,5 @@ // Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT. -<<<<<<< HEAD -<<<<<<< HEAD pub(crate) fn de_last_modified_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { -======= -pub(crate) fn de_last_modified_at_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { ->>>>>>> 6e8749e1 (Test) -======= -pub(crate) fn de_last_modified_header(header_map: &::aws_smithy_runtime_api::http::Headers) -> ::std::result::Result<::std::option::Option<::aws_smithy_types::DateTime>, ::aws_smithy_http::header::ParseError> { ->>>>>>> 82479b8f (fix: more fixes) let headers = header_map.get_all("last-modified"); let var_1: Vec<::aws_smithy_types::DateTime> = ::aws_smithy_http::header::many_dates(headers, ::aws_smithy_types::date_time::Format::DateTimeWithOffset)? ; diff --git a/crates/superposition_sdk/src/serde_util.rs b/crates/superposition_sdk/src/serde_util.rs index 22ad1c00a..9a9090bb8 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -595,6 +595,7 @@ if builder.data.is_none() { builder.data = Some(Default::default()) } <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ======= <<<<<<< HEAD @@ -619,6 +620,9 @@ if builder.last_modified_at.is_none() { builder.last_modified_at = Some(::aws_sm if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } +>>>>>>> 45a3cd01 (reabse fix) builder } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index d98cbc9cf..f4bd03e3c 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -20,12 +20,15 @@ pub use crate::types::_bucket::Bucket; <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 0c17747c (feat: Add experiment_config endpoint) ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_experiment_response::ExperimentResponse; pub use crate::types::_variant::Variant; @@ -48,12 +51,6 @@ pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> 6e8749e1 (Test) -======= -pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; - ->>>>>>> 82479b8f (fix: more fixes) pub use crate::types::_experiment_group_sort_on::ExperimentGroupSortOn; pub use crate::types::_version::Version; @@ -71,6 +68,7 @@ pub use crate::types::_type_templates_response::TypeTemplatesResponse; <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD pub use crate::types::_experiment_sort_on::ExperimentSortOn; <<<<<<< HEAD @@ -102,22 +100,10 @@ pub use crate::types::_experiment_type::ExperimentType; >>>>>>> 0c17747c (feat: Add experiment_config endpoint) ======= >>>>>>> c1293812 (Test) -pub use crate::types::_experiment_sort_on::ExperimentSortOn; - ======= -pub use crate::types::_variant::Variant; - -pub use crate::types::_variant_type::VariantType; - -pub use crate::types::_experiment_response::ExperimentResponse; - -pub use crate::types::_experiment_status_type::ExperimentStatusType; - -pub use crate::types::_experiment_type::ExperimentType; - +>>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_experiment_sort_on::ExperimentSortOn; ->>>>>>> 6e8749e1 (Test) pub use crate::types::_variant_update_request::VariantUpdateRequest; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) diff --git a/crates/superposition_sdk/src/types/builders.rs b/crates/superposition_sdk/src/types/builders.rs index 8b6a593c7..5037cf7ef 100644 --- a/crates/superposition_sdk/src/types/builders.rs +++ b/crates/superposition_sdk/src/types/builders.rs @@ -6,6 +6,7 @@ pub use crate::types::_variable_response::VariableResponseBuilder; pub use crate::types::_experiment_group_response::ExperimentGroupResponseBuilder; <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD pub use crate::types::_bucket::BucketBuilder; @@ -16,16 +17,14 @@ pub use crate::types::_variant::VariantBuilder; >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= >>>>>>> c1293812 (Test) +======= +>>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_bucket::BucketBuilder; pub use crate::types::_experiment_response::ExperimentResponseBuilder; pub use crate::types::_variant::VariantBuilder; -======= ->>>>>>> 6e8749e1 (Test) - -pub use crate::types::_bucket::BucketBuilder; pub use crate::types::_webhook_response::WebhookResponseBuilder; @@ -36,6 +35,7 @@ pub use crate::types::_type_templates_response::TypeTemplatesResponseBuilder; <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= @@ -50,6 +50,8 @@ pub use crate::types::_experiment_response::ExperimentResponseBuilder; ======= >>>>>>> 6e8749e1 (Test) >>>>>>> c1293812 (Test) +======= +>>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_variant_update_request::VariantUpdateRequestBuilder; pub use crate::types::_organisation_response::OrganisationResponseBuilder; diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 8402c2e4f..6c118e874 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -174,6 +174,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -184,13 +185,9 @@ >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) - "name": "if-modified-since", -======= - "name": "If-Modified-Since", ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) "name": "if-modified-since", ->>>>>>> 82479b8f (fix: more fixes) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { @@ -2184,6 +2181,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= <<<<<<< HEAD ======= @@ -2196,6 +2194,8 @@ ======= >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +>>>>>>> 45a3cd01 (reabse fix) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -2205,12 +2205,6 @@ }, { "name": "if-modified-since", -<<<<<<< HEAD -======= - "name": "If-Modified-Since", ->>>>>>> 6e8749e1 (Test) -======= ->>>>>>> 82479b8f (fix: more fixes) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { @@ -2869,6 +2863,7 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ======= @@ -2879,6 +2874,8 @@ ======= >>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) >>>>>>> 964966cd (feat: Add prefix filter in list exp) +======= +>>>>>>> 45a3cd01 (reabse fix) "name": "prefix", "in": "query", "style": "form", @@ -2899,12 +2896,6 @@ ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "if-modified-since", -======= - "name": "If-Modified-Since", ->>>>>>> 6e8749e1 (Test) -======= - "name": "if-modified-since", ->>>>>>> 82479b8f (fix: more fixes) "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", "schema": { diff --git a/docs/docs/api/get-config-json.api.mdx b/docs/docs/api/get-config-json.api.mdx index 5f536abc3..37473835f 100644 --- a/docs/docs/api/get-config-json.api.mdx +++ b/docs/docs/api/get-config-json.api.mdx @@ -48,11 +48,7 @@ Retrieves the full config in JSON format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config-toml.api.mdx b/docs/docs/api/get-config-toml.api.mdx index 313ffc979..b552e1ba8 100644 --- a/docs/docs/api/get-config-toml.api.mdx +++ b/docs/docs/api/get-config-toml.api.mdx @@ -48,11 +48,7 @@ Retrieves the full config in TOML format, including default configs with schemas >>>>>> 8fc501b7 (fix: more fixes) > diff --git a/docs/docs/api/get-config.api.mdx b/docs/docs/api/get-config.api.mdx index 4ae34e0b9..21c269faa 100644 --- a/docs/docs/api/get-config.api.mdx +++ b/docs/docs/api/get-config.api.mdx @@ -9,6 +9,7 @@ hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD api: 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 ======= <<<<<<< HEAD @@ -34,6 +35,9 @@ api: eJztWEtv2zgQ/iuETruAnWbbzaW3NA3SYBs4cFzsIWsYtDSy2EiklqQSG4b/+86QEi3ZUpo+Fui api: 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 >>>>>>> 82479b8f (fix: more fixes) >>>>>>> de718464 (fix: more fixes) +======= +api: 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 +>>>>>>> 45a3cd01 (reabse fix) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null @@ -76,15 +80,7 @@ Retrieves config data with context evaluation, including applicable contexts, ov >>>>>> 0366c46c (Test) -======= - parameters={[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"version","in":"query","schema":{"type":"string"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} ->>>>>>> 8fc501b7 (fix: more fixes) > @@ -96,13 +92,7 @@ Retrieves config data with context evaluation, including applicable contexts, ov >>>>>> 0366c46c (Test) > diff --git a/docs/docs/api/list-experiment-groups.api.mdx b/docs/docs/api/list-experiment-groups.api.mdx index f7859c2bc..2f4e9e9c3 100644 --- a/docs/docs/api/list-experiment-groups.api.mdx +++ b/docs/docs/api/list-experiment-groups.api.mdx @@ -9,17 +9,14 @@ hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) -api: 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 -======= -api: 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 ->>>>>>> 6e8749e1 (Test) ======= +>>>>>>> 45a3cd01 (reabse fix) api: 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 ->>>>>>> 82479b8f (fix: more fixes) sidebar_class_name: "post api-method" ======= <<<<<<< HEAD @@ -75,38 +72,19 @@ Lists experiment groups, with support for filtering and pagination. >>>>>> 0366c46c (Test) -======= - parameters={[{"name":"count","in":"query","description":"Number of items to be returned in each page.","schema":{"type":"number","description":"Number of items to be returned in each page."}},{"name":"page","in":"query","description":"Page number to retrieve, starting from 1.","schema":{"type":"number","description":"Page number to retrieve, starting from 1."}},{"name":"all","in":"query","description":"If true, returns all requested items, ignoring pagination parameters page and count.","schema":{"type":"boolean","description":"If true, returns all requested items, ignoring pagination parameters page and count."}},{"name":"name","in":"query","description":"Filter by experiment group name (exact match or substring, depending on backend implementation).","schema":{"type":"string","description":"Filter by experiment group name (exact match or substring, depending on backend implementation)."}},{"name":"created_by","in":"query","description":"Filter by the user who created the experiment group.","schema":{"type":"string","description":"Filter by the user who created the experiment group."}},{"name":"last_modified_by","in":"query","description":"Filter by the user who last modified the experiment group.","schema":{"type":"string","description":"Filter by the user who last modified the experiment group."}},{"name":"sort_on","in":"query","description":"Field to sort the results by.","schema":{"type":"string","enum":["name","created_at","last_modified_at"],"title":"ExperimentGroupSortOn"}},{"name":"sort_by","in":"query","description":"Sort order (ascending or descending).","schema":{"type":"string","description":"Sort order enumeration for list operations.","enum":["desc","asc"],"title":"SortBy"}},{"name":"group_type","in":"query","description":"Filter by the type of group (USER_CREATED or SYSTEM_GENERATED).","style":"form","schema":{"type":"array","items":{"type":"string","enum":["USER_CREATED","SYSTEM_GENERATED"],"title":"GroupType"},"description":"Filter by the type of group (USER_CREATED or SYSTEM_GENERATED)."},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} ->>>>>>> 8fc501b7 (fix: more fixes) > >>>>>> 0366c46c (Test) > >>>>>> 0366c46c (Test) > diff --git a/docs/docs/api/list-experiment.api.mdx b/docs/docs/api/list-experiment.api.mdx index 8a3fa8643..6afa4ad11 100644 --- a/docs/docs/api/list-experiment.api.mdx +++ b/docs/docs/api/list-experiment.api.mdx @@ -10,22 +10,16 @@ hide_table_of_contents: true <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> c1293812 (Test) ======= >>>>>>> de718464 (fix: more fixes) ======= >>>>>>> 964966cd (feat: Add prefix filter in list exp) -api: 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 -======= -api: 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 ->>>>>>> 6e8749e1 (Test) -======= -api: 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 ->>>>>>> 82479b8f (fix: more fixes) ======= +>>>>>>> 45a3cd01 (reabse fix) api: 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 ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) sidebar_class_name: "post api-method" ======= <<<<<<< HEAD @@ -81,42 +75,19 @@ Retrieves a paginated list of experiments with support for filtering by status, >>>>>> 0366c46c (Test) -======= - parameters={[{"name":"count","in":"query","description":"Number of items to be returned in each page.","schema":{"type":"number","description":"Number of items to be returned in each page."}},{"name":"page","in":"query","description":"Page number to retrieve, starting from 1.","schema":{"type":"number","description":"Page number to retrieve, starting from 1."}},{"name":"all","in":"query","description":"If true, returns all requested items, ignoring pagination parameters page and count.","schema":{"type":"boolean","description":"If true, returns all requested items, ignoring pagination parameters page and count."}},{"name":"status","in":"query","style":"form","schema":{"type":"array","items":{"type":"string","enum":["CREATED","CONCLUDED","INPROGRESS","DISCARDED","PAUSED"],"title":"ExperimentStatusType"}},"explode":true},{"name":"from_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"experiment_name","in":"query","schema":{"type":"string"}},{"name":"experiment_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"experiment_group_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"created_by","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"sort_on","in":"query","schema":{"type":"string","enum":["last_modified_at","created_at"],"title":"ExperimentSortOn"}},{"name":"sort_by","in":"query","description":"Sort order enumeration for list operations.","schema":{"type":"string","description":"Sort order enumeration for list operations.","enum":["desc","asc"],"title":"SortBy"}},{"name":"global_experiments_only","in":"query","schema":{"type":"boolean"}},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} ->>>>>>> 8fc501b7 (fix: more fixes) -======= - parameters={[{"name":"count","in":"query","description":"Number of items to be returned in each page.","schema":{"type":"number","description":"Number of items to be returned in each page."}},{"name":"page","in":"query","description":"Page number to retrieve, starting from 1.","schema":{"type":"number","description":"Page number to retrieve, starting from 1."}},{"name":"all","in":"query","description":"If true, returns all requested items, ignoring pagination parameters page and count.","schema":{"type":"boolean","description":"If true, returns all requested items, ignoring pagination parameters page and count."}},{"name":"status","in":"query","style":"form","schema":{"type":"array","items":{"type":"string","enum":["CREATED","CONCLUDED","INPROGRESS","DISCARDED","PAUSED"],"title":"ExperimentStatusType"}},"explode":true},{"name":"from_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to_date","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"experiment_name","in":"query","schema":{"type":"string"}},{"name":"experiment_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"experiment_group_ids","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"created_by","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"sort_on","in":"query","schema":{"type":"string","enum":["last_modified_at","created_at"],"title":"ExperimentSortOn"}},{"name":"sort_by","in":"query","description":"Sort order enumeration for list operations.","schema":{"type":"string","description":"Sort order enumeration for list operations.","enum":["desc","asc"],"title":"SortBy"}},{"name":"global_experiments_only","in":"query","schema":{"type":"boolean"}},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} ->>>>>>> 870f5d17 (feat: Add prefix filter in list exp) > >>>>>> 0366c46c (Test) > >>>>>> 0366c46c (Test) > diff --git a/smithy/patches/python.patch b/smithy/patches/python.patch index d85e795a2..8f51f3d08 100644 --- a/smithy/patches/python.patch +++ b/smithy/patches/python.patch @@ -24,10 +24,10 @@ index 7c295b28..b7a7bd7e 100644 reportPrivateUsage = false diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py -index 6434d0c3..38e37e90 100644 +index 3db5673f..9297cce5 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py -@@ -652,7 +652,7 @@ ADD_MEMBERS_TO_GROUP = APIOperation( +@@ -681,7 +681,7 @@ ADD_MEMBERS_TO_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -36,7 +36,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -854,7 +854,7 @@ APPLICABLE_VARIANTS = APIOperation( +@@ -883,7 +883,7 @@ APPLICABLE_VARIANTS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -45,7 +45,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -1128,7 +1128,7 @@ LIST_AUDIT_LOGS = APIOperation( +@@ -1157,7 +1157,7 @@ LIST_AUDIT_LOGS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -54,7 +54,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -1887,7 +1887,7 @@ BULK_OPERATION = APIOperation( +@@ -1916,7 +1916,7 @@ BULK_OPERATION = APIOperation( ShapeID("io.superposition#ResourceNotFound"): ResourceNotFound, }), effective_auth_schemes = [ @@ -63,7 +63,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2146,7 +2146,7 @@ CONCLUDE_EXPERIMENT = APIOperation( +@@ -2205,7 +2205,7 @@ CONCLUDE_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -72,7 +72,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2658,7 +2658,7 @@ GET_CONFIG = APIOperation( +@@ -2722,7 +2722,7 @@ GET_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -81,7 +81,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2749,7 +2749,7 @@ GET_CONFIG_FAST = APIOperation( +@@ -2819,7 +2819,7 @@ GET_CONFIG_JSON = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -90,7 +90,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -2886,7 +2886,7 @@ GET_RESOLVED_CONFIG = APIOperation( +@@ -2916,7 +2916,7 @@ GET_CONFIG_TOML = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -99,7 +99,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3023,7 +3023,7 @@ GET_RESOLVED_CONFIG_WITH_IDENTIFIER = APIOperation( +@@ -3053,7 +3053,7 @@ GET_RESOLVED_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -108,16 +108,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3138,7 +3138,7 @@ GET_VERSION = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -3318,7 +3318,7 @@ LIST_VERSIONS = APIOperation( +@@ -3190,7 +3190,7 @@ GET_RESOLVED_CONFIG_WITH_IDENTIFIER = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -126,7 +117,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3482,7 +3482,7 @@ CREATE_CONTEXT = APIOperation( +@@ -3305,7 +3305,7 @@ GET_VERSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -135,8 +126,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3566,7 +3566,7 @@ DELETE_CONTEXT = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -3485,7 +3485,7 @@ LIST_VERSIONS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -144,7 +135,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3726,7 +3726,7 @@ GET_CONTEXT = APIOperation( +@@ -3649,7 +3649,7 @@ CREATE_CONTEXT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -153,7 +144,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -3886,7 +3886,7 @@ GET_CONTEXT_FROM_CONDITION = APIOperation( +@@ -3733,7 +3733,7 @@ DELETE_CONTEXT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -162,8 +153,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4074,7 +4074,7 @@ LIST_CONTEXTS = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -3893,7 +3893,7 @@ GET_CONTEXT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -171,7 +162,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4238,7 +4238,7 @@ MOVE_CONTEXT = APIOperation( +@@ -4053,7 +4053,7 @@ GET_CONTEXT_FROM_CONDITION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -180,8 +171,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4402,7 +4402,7 @@ UPDATE_OVERRIDE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -4241,7 +4241,7 @@ LIST_CONTEXTS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -189,8 +180,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4489,7 +4489,7 @@ VALIDATE_CONTEXT = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -4405,7 +4405,7 @@ MOVE_CONTEXT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -198,8 +189,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4653,7 +4653,7 @@ WEIGHT_RECOMPUTE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -4569,7 +4569,7 @@ UPDATE_OVERRIDE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -207,7 +198,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -4886,7 +4886,7 @@ CREATE_DEFAULT_CONFIG = APIOperation( +@@ -4656,7 +4656,7 @@ VALIDATE_CONTEXT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -216,7 +207,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5114,7 +5114,7 @@ CREATE_DIMENSION = APIOperation( +@@ -4820,7 +4820,7 @@ WEIGHT_RECOMPUTE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -225,7 +216,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5381,7 +5381,7 @@ CREATE_EXPERIMENT = APIOperation( +@@ -5053,7 +5053,7 @@ CREATE_DEFAULT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -234,7 +225,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5600,7 +5600,7 @@ CREATE_EXPERIMENT_GROUP = APIOperation( +@@ -5281,7 +5281,7 @@ CREATE_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -243,7 +234,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5808,7 +5808,7 @@ CREATE_FUNCTION = APIOperation( +@@ -5548,7 +5548,7 @@ CREATE_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -252,7 +243,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -5995,7 +5995,7 @@ CREATE_ORGANISATION = APIOperation( +@@ -5767,7 +5767,7 @@ CREATE_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -261,7 +252,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6156,7 +6156,7 @@ CREATE_TYPE_TEMPLATES = APIOperation( +@@ -5978,7 +5978,7 @@ CREATE_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -270,7 +261,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6303,7 +6303,7 @@ CREATE_VARIABLE = APIOperation( +@@ -6165,7 +6165,7 @@ CREATE_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -279,7 +270,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6573,7 +6573,7 @@ CREATE_WEBHOOK = APIOperation( +@@ -6317,7 +6317,7 @@ CREATE_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -288,7 +279,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6836,7 +6836,7 @@ CREATE_WORKSPACE = APIOperation( +@@ -6478,7 +6478,7 @@ CREATE_TYPE_TEMPLATES = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -297,8 +288,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -6916,7 +6916,7 @@ DELETE_DEFAULT_CONFIG = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -6625,7 +6625,7 @@ CREATE_VARIABLE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -306,8 +297,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7070,7 +7070,7 @@ GET_DEFAULT_CONFIG = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -6895,7 +6895,7 @@ CREATE_WEBHOOK = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -315,7 +306,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7307,7 +7307,7 @@ LIST_DEFAULT_CONFIGS = APIOperation( +@@ -7145,7 +7145,7 @@ CREATE_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -324,7 +315,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7514,7 +7514,7 @@ UPDATE_DEFAULT_CONFIG = APIOperation( +@@ -7225,7 +7225,7 @@ DELETE_DEFAULT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -333,7 +324,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7594,7 +7594,7 @@ DELETE_DIMENSION = APIOperation( +@@ -7379,7 +7379,7 @@ GET_DEFAULT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -342,8 +333,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7764,7 +7764,7 @@ DELETE_EXPERIMENT_GROUP = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -7616,7 +7616,7 @@ LIST_DEFAULT_CONFIGS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -351,7 +342,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7844,7 +7844,7 @@ DELETE_FUNCTION = APIOperation( +@@ -7823,7 +7823,7 @@ UPDATE_DEFAULT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -360,7 +351,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -7977,7 +7977,7 @@ DELETE_TYPE_TEMPLATES = APIOperation( +@@ -7903,7 +7903,7 @@ DELETE_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -369,7 +360,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8103,7 +8103,7 @@ DELETE_VARIABLE = APIOperation( +@@ -8073,7 +8073,7 @@ DELETE_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -378,7 +369,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8183,7 +8183,7 @@ DELETE_WEBHOOK = APIOperation( +@@ -8153,7 +8153,7 @@ DELETE_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -387,7 +378,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8355,7 +8355,7 @@ GET_DIMENSION = APIOperation( +@@ -8278,7 +8278,7 @@ DELETE_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -396,8 +387,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8606,7 +8606,7 @@ LIST_DIMENSIONS = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -8411,7 +8411,7 @@ DELETE_TYPE_TEMPLATES = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -405,7 +396,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -8831,7 +8831,7 @@ UPDATE_DIMENSION = APIOperation( +@@ -8537,7 +8537,7 @@ DELETE_VARIABLE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -414,7 +405,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9047,7 +9047,7 @@ DISCARD_EXPERIMENT = APIOperation( +@@ -8617,7 +8617,7 @@ DELETE_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -423,7 +414,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9217,7 +9217,7 @@ GET_EXPERIMENT_GROUP = APIOperation( +@@ -8789,7 +8789,7 @@ GET_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -432,7 +423,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9550,7 +9550,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( +@@ -9040,7 +9040,7 @@ LIST_DIMENSIONS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -441,16 +432,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9742,7 +9742,7 @@ REMOVE_MEMBERS_FROM_GROUP = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -9944,7 +9944,7 @@ UPDATE_EXPERIMENT_GROUP = APIOperation( +@@ -9265,7 +9265,7 @@ UPDATE_DIMENSION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -459,7 +441,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10329,7 +10329,7 @@ GET_EXPERIMENT = APIOperation( +@@ -9481,7 +9481,7 @@ DISCARD_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -468,7 +450,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10517,7 +10517,7 @@ LIST_EXPERIMENT = APIOperation( +@@ -9909,7 +9909,7 @@ GET_EXPERIMENT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -477,7 +459,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10733,7 +10733,7 @@ PAUSE_EXPERIMENT = APIOperation( +@@ -10079,7 +10079,7 @@ GET_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -486,8 +468,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10956,7 +10956,7 @@ RAMP_EXPERIMENT = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -10309,7 +10309,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -495,7 +477,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11172,7 +11172,7 @@ RESUME_EXPERIMENT = APIOperation( +@@ -10501,7 +10501,7 @@ REMOVE_MEMBERS_FROM_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -504,7 +486,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11483,7 +11483,7 @@ UPDATE_OVERRIDES_EXPERIMENT = APIOperation( +@@ -10703,7 +10703,7 @@ UPDATE_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -513,7 +495,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11650,7 +11650,7 @@ GET_FUNCTION = APIOperation( +@@ -10914,7 +10914,7 @@ GET_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -522,7 +504,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11918,7 +11918,7 @@ LIST_FUNCTION = APIOperation( +@@ -11129,7 +11129,7 @@ LIST_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -531,7 +513,12 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12090,7 +12090,7 @@ PUBLISH = APIOperation( +<<<<<<< HEAD +<<<<<<< HEAD +@@ -12578,7 +12578,7 @@ PUBLISH = APIOperation( +======= +@@ -11345,7 +11345,7 @@ PAUSE_EXPERIMENT = APIOperation( +>>>>>>> 45a3cd01 (reabse fix) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -540,7 +527,11 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12394,7 +12394,7 @@ TEST = APIOperation( +<<<<<<< HEAD +@@ -12900,7 +12900,7 @@ TEST = APIOperation( +======= +@@ -11568,7 +11568,7 @@ RAMP_EXPERIMENT = APIOperation( +>>>>>>> 45a3cd01 (reabse fix) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -549,7 +540,11 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12587,7 +12587,7 @@ UPDATE_FUNCTION = APIOperation( +<<<<<<< HEAD +@@ -13093,7 +13093,7 @@ UPDATE_FUNCTION = APIOperation( +======= +@@ -11784,7 +11784,7 @@ RESUME_EXPERIMENT = APIOperation( +>>>>>>> 45a3cd01 (reabse fix) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -558,7 +553,11 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12734,7 +12734,7 @@ GET_ORGANISATION = APIOperation( +<<<<<<< HEAD +@@ -13240,7 +13240,7 @@ GET_ORGANISATION = APIOperation( +======= +@@ -12095,7 +12095,7 @@ UPDATE_OVERRIDES_EXPERIMENT = APIOperation( +>>>>>>> 45a3cd01 (reabse fix) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -567,7 +566,11 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12867,7 +12867,7 @@ GET_TYPE_TEMPLATE = APIOperation( +<<<<<<< HEAD +@@ -13365,7 +13365,7 @@ GET_SECRET = APIOperation( +======= +@@ -12262,7 +12262,7 @@ GET_FUNCTION = APIOperation( +>>>>>>> 45a3cd01 (reabse fix) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -576,16 +579,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13079,7 +13079,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -13205,7 +13205,7 @@ GET_VARIABLE = APIOperation( +<<<<<<< HEAD +@@ -13498,7 +13498,7 @@ GET_TYPE_TEMPLATE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -594,8 +589,15 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13383,7 +13383,7 @@ GET_WEBHOOK = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -13710,7 +13710,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( +<<<<<<< HEAD +======= +@@ -14218,7 +14218,7 @@ LIST_VARIABLES = APIOperation( +>>>>>>> c1293812 (Test) +======= +@@ -12530,7 +12530,7 @@ LIST_FUNCTION = APIOperation( +>>>>>>> 45a3cd01 (reabse fix) + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -603,7 +605,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13561,7 +13561,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( +@@ -12702,7 +12702,7 @@ PUBLISH = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -612,7 +614,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13746,7 +13746,7 @@ GET_WORKSPACE = APIOperation( +@@ -13024,7 +13024,7 @@ TEST = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -621,8 +623,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13972,7 +13972,7 @@ LIST_ORGANISATION = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -13217,7 +13217,7 @@ UPDATE_FUNCTION = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -630,8 +632,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -12578,7 +12578,7 @@ PUBLISH = APIOperation( +@@ -13364,7 +13364,7 @@ GET_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -640,7 +641,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12900,7 +12900,7 @@ TEST = APIOperation( +@@ -13489,7 +13489,7 @@ GET_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -649,7 +650,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13093,7 +13093,7 @@ UPDATE_FUNCTION = APIOperation( +@@ -13622,7 +13622,7 @@ GET_TYPE_TEMPLATE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -658,8 +659,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13240,7 +13240,7 @@ GET_ORGANISATION = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -13834,7 +13834,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -667,7 +668,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13365,7 +13365,7 @@ GET_SECRET = APIOperation( +@@ -13960,7 +13960,7 @@ GET_VARIABLE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -676,7 +677,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13498,7 +13498,7 @@ GET_TYPE_TEMPLATE = APIOperation( +@@ -14138,7 +14138,7 @@ GET_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -685,12 +686,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13710,7 +13710,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( -<<<<<<< HEAD -======= -@@ -14218,7 +14218,7 @@ LIST_VARIABLES = APIOperation( ->>>>>>> c1293812 (Test) - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -14316,7 +14316,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -698,8 +695,8 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14475,7 +14475,7 @@ LIST_WEBHOOK = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -14495,7 +14495,7 @@ GET_WORKSPACE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -707,7 +704,7 @@ index 6434d0c3..38e37e90 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14739,7 +14739,7 @@ LIST_WORKSPACE = APIOperation( +@@ -14721,7 +14721,7 @@ LIST_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -717,6 +714,7 @@ index 6434d0c3..38e37e90 100644 ] ) <<<<<<< HEAD +<<<<<<< HEAD @@ -15087,7 +15087,7 @@ LIST_VARIABLES = APIOperation( ======= >>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @@ -961,6 +959,9 @@ index 294231fb..9d836018 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -7025,7 +7025,7 @@ CREATE_WORKSPACE = APIOperation( +======= +@@ -14965,7 +14965,7 @@ LIST_SECRETS = APIOperation( +>>>>>>> 45a3cd01 (reabse fix) ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -969,8 +970,8 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14018,7 +14018,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -15211,7 +15211,7 @@ LIST_VARIABLES = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -978,8 +979,8 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14197,7 +14197,7 @@ GET_WORKSPACE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -15468,7 +15468,7 @@ LIST_WEBHOOK = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -987,7 +988,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -15428,7 +15428,7 @@ LIST_WORKSPACE = APIOperation( +@@ -15726,7 +15726,7 @@ LIST_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -996,7 +997,16 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16734,7 +16734,7 @@ UPDATE_WORKSPACE = APIOperation( +@@ -15803,7 +15803,7 @@ ROTATE_MASTER_ENCRYPTION_KEY = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -15982,7 +15982,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1005,12 +1015,8 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py -index 2eb77129..ea06e2c3 100644 ---- a/clients/python/sdk/superposition_sdk/models.py -+++ b/clients/python/sdk/superposition_sdk/models.py -@@ -15263,7 +15263,7 @@ LIST_WEBHOOK = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -16169,7 +16169,7 @@ UPDATE_ORGANISATION = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -1018,7 +1024,7 @@ index 2eb77129..ea06e2c3 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -15614,7 +15614,7 @@ ROTATE_MASTER_KEY = APIOperation( +@@ -16254,7 +16254,7 @@ ROTATE_WORKSPACE_ENCRYPTION_KEY = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1027,7 +1033,7 @@ index 2eb77129..ea06e2c3 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16824,7 +16824,7 @@ UPDATE_WEBHOOK = APIOperation( +@@ -16405,7 +16405,7 @@ UPDATE_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1036,7 +1042,7 @@ index 2eb77129..ea06e2c3 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -17070,7 +17070,7 @@ UPDATE_WORKSPACE = APIOperation( +@@ -16564,7 +16564,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1045,13 +1051,26 @@ index 2eb77129..ea06e2c3 100644 ShapeID("smithy.api#httpBearerAuth") ] ) - -diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py -index 9ff09776..abff3d68 100644 ---- a/clients/python/sdk/superposition_sdk/models.py -+++ b/clients/python/sdk/superposition_sdk/models.py -@@ -10316,7 +10316,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, +@@ -16709,7 +16709,7 @@ UPDATE_VARIABLE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -16948,7 +16948,7 @@ UPDATE_WEBHOOK = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, + }), + effective_auth_schemes = [ +- ShapeID("smithy.api#httpBasicAuth") ++ ShapeID("smithy.api#httpBasicAuth"), + ShapeID("smithy.api#httpBearerAuth") + ] + ) +@@ -17194,7 +17194,7 @@ UPDATE_WORKSPACE = APIOperation( + ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") From 35abd775e7e58356a3e32a7ca45c24bfee8c7173 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Tue, 24 Mar 2026 17:37:11 +0530 Subject: [PATCH 14/16] feat: more changes --- crates/superposition_core/src/experiment.rs | 12 + .../examples/local_file_example.rs | 4 +- crates/superposition_provider/src/client.rs | 4 +- .../superposition_provider/src/conversions.rs | 62 ++++ .../superposition_provider/src/data_source.rs | 75 ++--- .../src/data_source/file.rs | 8 +- .../src/data_source/http.rs | 68 +---- .../src/local_provider.rs | 285 ++++++------------ crates/superposition_provider/src/provider.rs | 25 +- .../src/remote_provider.rs | 216 ++----------- crates/superposition_provider/src/traits.rs | 201 +++++++++++- crates/superposition_provider/src/utils.rs | 96 ++---- 12 files changed, 442 insertions(+), 614 deletions(-) diff --git a/crates/superposition_core/src/experiment.rs b/crates/superposition_core/src/experiment.rs index 3e6e7f7ed..924b55d6b 100644 --- a/crates/superposition_core/src/experiment.rs +++ b/crates/superposition_core/src/experiment.rs @@ -68,6 +68,12 @@ pub struct FfiExperimentGroup { pub buckets: Buckets, } +impl Experimental for FfiExperimentGroup { + fn get_condition(&self) -> &Condition { + &self.context + } +} + impl From for FfiExperimentGroup { fn from(experiment_group: ExperimentGroup) -> Self { Self { @@ -97,6 +103,12 @@ pub type Experiments = Vec; pub type ExperimentGroups = Vec; +#[derive(Debug, Clone)] +pub struct ExperimentConfig { + pub experiments: Experiments, + pub experiment_groups: ExperimentGroups, +} + pub fn get_applicable_variants( dimensions_info: &HashMap, experiments: Experiments, diff --git a/crates/superposition_provider/examples/local_file_example.rs b/crates/superposition_provider/examples/local_file_example.rs index 29e51bf1d..6b02292da 100644 --- a/crates/superposition_provider/examples/local_file_example.rs +++ b/crates/superposition_provider/examples/local_file_example.rs @@ -21,13 +21,13 @@ async fn main() { ..Default::default() }), ); - provider.init().await.unwrap(); + provider.init(EvaluationContext::default()).await.unwrap(); let context = EvaluationContext::default() .with_custom_field("os", "linux") .with_custom_field("city", "Boston"); - let config = provider.resolve_all_features(&context).await.unwrap(); + let config = provider.resolve_all_features(context).await.unwrap(); println!("Config: {:?}", config); provider.close().await.unwrap(); diff --git a/crates/superposition_provider/src/client.rs b/crates/superposition_provider/src/client.rs index 3c33dcb6b..560de9e63 100644 --- a/crates/superposition_provider/src/client.rs +++ b/crates/superposition_provider/src/client.rs @@ -518,7 +518,7 @@ impl ExperimentationConfig { )) })?; - let experiments = ConversionUtils::convert_experiments_response(response)?; + let experiments = ConversionUtils::convert_experiments_response(response.data)?; info!( "Successfully fetched and converted {} experiments", @@ -559,7 +559,7 @@ impl ExperimentationConfig { })?; let experiment_groups = - ConversionUtils::convert_experiment_groups_response(response)?; + ConversionUtils::convert_experiment_groups_response(response.data)?; info!( "Successfully fetched and converted {} experiment groups", diff --git a/crates/superposition_provider/src/conversions.rs b/crates/superposition_provider/src/conversions.rs index 73412eb6e..3e672d6b6 100644 --- a/crates/superposition_provider/src/conversions.rs +++ b/crates/superposition_provider/src/conversions.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use aws_smithy_types::Document; +use open_feature::{EvaluationContext, EvaluationContextFieldValue}; use serde_json::{Map, Value}; pub fn value_to_document(value: Value) -> Document { @@ -74,3 +75,64 @@ pub fn document_to_value(doc: Document) -> Value { Document::Null => Value::Null, } } + +pub fn evaluation_context_to_value(value: EvaluationContextFieldValue) -> Value { + match value { + EvaluationContextFieldValue::Bool(b) => Value::Bool(b), + EvaluationContextFieldValue::Int(i) => Value::Number(serde_json::Number::from(i)), + EvaluationContextFieldValue::Float(f) => Value::Number( + serde_json::Number::from_f64(f) + .unwrap_or_else(|| serde_json::Number::from(0)), + ), + EvaluationContextFieldValue::String(s) => Value::String(s), + EvaluationContextFieldValue::DateTime(dt) => Value::String(dt.to_string()), + EvaluationContextFieldValue::Struct(s) => { + // Convert struct to serde_json::Value + let struct_map = s + .downcast_ref::>() + .map(|m| { + m.iter() + .map(|(k, v)| (k.clone(), evaluation_context_to_value(v.clone()))) + .collect() + }) + .unwrap_or_default(); + Value::Object(struct_map) + } + } +} + +/// Convert an EvaluationContext into a (Map, Option) tuple +/// containing the custom fields as serde values and the targeting key. +/// This is used by both local and remote providers. +pub fn evaluation_context_to_query( + ctx: EvaluationContext, +) -> (Map, Option) { + let context = ctx + .custom_fields + .into_iter() + .map(|(k, v)| (k, evaluation_context_to_value(v))) + .collect(); + + (context, ctx.targeting_key) +} + +/// Convert evaluation context to dimension data format expected by superposition_types +pub fn evaluation_context_to_map(context: EvaluationContext) -> Map { + let mut dimension_data = Map::new(); + + // Add targeting key if present + if let Some(targeting_key) = context.targeting_key { + dimension_data.insert("targeting_key".to_string(), Value::String(targeting_key)); + } + + // Add all other fields from the context + for (key, value) in context.custom_fields { + dimension_data.insert(key, evaluation_context_to_value(value)); + } + + log::debug!( + "Converted evaluation context to dimension data with {} keys", + dimension_data.len() + ); + dimension_data +} diff --git a/crates/superposition_provider/src/data_source.rs b/crates/superposition_provider/src/data_source.rs index 2e5f5cc93..b282e9bf9 100644 --- a/crates/superposition_provider/src/data_source.rs +++ b/crates/superposition_provider/src/data_source.rs @@ -6,8 +6,7 @@ use std::fmt::Display; use async_trait::async_trait; use chrono::{DateTime, Utc}; use serde_json::{Map, Value}; -use superposition_core::experiment::ExperimentGroups; -use superposition_core::Experiments; +use superposition_core::experiment::ExperimentConfig; use superposition_types::Config; use crate::types::Result; @@ -83,69 +82,31 @@ impl Display for ConfigData { } } -pub struct ExperimentResponse { - pub experiments: FetchResponse, - pub experiment_groups: FetchResponse, - pub fetched_at: DateTime, -} - -impl Display for ExperimentResponse { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "ExperimentResponse(data: {} experiments, {} experiment groups, fetched_at: {})", - self.experiments.data().map(|e| e.len()).unwrap_or_default(), - self.experiment_groups.data().map(|e| e.len()).unwrap_or_default(), - self.fetched_at - ) - } -} - /// Holds active experiments and experiment groups along with the time they were fetched. #[derive(Debug, Clone)] pub struct ExperimentData { - pub experiments: Experiments, - pub experiment_groups: ExperimentGroups, + pub data: ExperimentConfig, pub fetched_at: DateTime, } impl ExperimentData { - pub fn update_with(mut self, new_value: ExperimentResponse) -> Self { - if let Some(exps) = new_value.experiments.into_data() { - self.experiments = exps - } - - if let Some(grps) = new_value.experiment_groups.into_data() { - self.experiment_groups = grps + pub fn new(config: ExperimentConfig) -> Self { + Self { + data: config, + fetched_at: Utc::now(), } - - self.fetched_at = new_value.fetched_at; - - self } } -impl TryFrom for ExperimentData { - type Error = String; - - fn try_from(value: ExperimentResponse) -> std::result::Result { - match ( - value.experiments.into_data(), - value.experiment_groups.into_data(), - ) { - (Some(experiments), Some(experiment_groups)) => Ok(Self { - experiments, - experiment_groups, - fetched_at: value.fetched_at, - }), - (None, None) => Err("ExperimentResponse contains no data".to_string()), - (None, Some(_)) => { - Err("ExperimentResponse missing experiments data".to_string()) - } - (Some(_), None) => { - Err("ExperimentResponse missing experiment groups data".to_string()) - } - } +impl Display for ExperimentData { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "ExperimentData(data: {} experiments, {} experiment groups, fetched_at: {})", + self.data.experiments.len(), + self.data.experiment_groups.len(), + self.fetched_at + ) } } @@ -173,7 +134,7 @@ pub trait SuperpositionDataSource: Send + Sync { async fn fetch_active_experiments( &self, last_fetched_at: Option>, - ) -> Result; + ) -> Result>; /// Fetch active experiments whose conditions are candidates for the given context /// and key prefixes. @@ -182,7 +143,7 @@ pub trait SuperpositionDataSource: Send + Sync { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result; + ) -> Result>; /// Fetch active experiments that match the given context and key prefixes. async fn fetch_matching_active_experiments( @@ -190,7 +151,7 @@ pub trait SuperpositionDataSource: Send + Sync { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result; + ) -> Result>; /// Whether this data source supports experiments. fn supports_experiments(&self) -> bool; diff --git a/crates/superposition_provider/src/data_source/file.rs b/crates/superposition_provider/src/data_source/file.rs index bcc5b62c7..2a9bcf484 100644 --- a/crates/superposition_provider/src/data_source/file.rs +++ b/crates/superposition_provider/src/data_source/file.rs @@ -12,7 +12,7 @@ use tokio::sync::broadcast; use crate::data_source::FetchResponse; use crate::types::{Result, SuperpositionError, WatchStream}; -use super::{ConfigData, ExperimentResponse, SuperpositionDataSource}; +use super::{ConfigData, ExperimentData, SuperpositionDataSource}; pub struct FileDataSource { file_path: PathBuf, @@ -75,7 +75,7 @@ impl SuperpositionDataSource for FileDataSource { async fn fetch_active_experiments( &self, _last_fetched_at: Option>, - ) -> Result { + ) -> Result> { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), )) @@ -86,7 +86,7 @@ impl SuperpositionDataSource for FileDataSource { _context: Option>, _prefix_filter: Option>, _last_fetched_at: Option>, - ) -> Result { + ) -> Result> { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), )) @@ -97,7 +97,7 @@ impl SuperpositionDataSource for FileDataSource { _context: Option>, _prefix_filter: Option>, _last_fetched_at: Option>, - ) -> Result { + ) -> Result> { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), )) diff --git a/crates/superposition_provider/src/data_source/http.rs b/crates/superposition_provider/src/data_source/http.rs index 818b5fe15..f84a2ce28 100644 --- a/crates/superposition_provider/src/data_source/http.rs +++ b/crates/superposition_provider/src/data_source/http.rs @@ -3,15 +3,14 @@ use chrono::{DateTime, Utc}; use log::info; use serde_json::{Map, Value}; use superposition_sdk::error::SdkError; -use superposition_sdk::types::{DimensionMatchStrategy, ExperimentStatusType}; +use superposition_sdk::types::DimensionMatchStrategy; use superposition_sdk::{Client, Config as SdkConfig}; use crate::conversions; -use crate::data_source::{ExperimentResponse, FetchResponse}; use crate::types::{Result, SuperpositionError, SuperpositionOptions}; use crate::utils::ConversionUtils; -use super::{ConfigData, SuperpositionDataSource}; +use super::{ConfigData, ExperimentData, FetchResponse, SuperpositionDataSource}; pub struct HttpDataSource { options: SuperpositionOptions, @@ -38,39 +37,25 @@ impl HttpDataSource { prefix_filter: Option>, last_fetched_at: Option>, filter: Option, - ) -> Result { + ) -> Result> { let client = self.create_client(); let mut experiment_builder = client - .list_experiment() + .get_experiment_config() .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .all(true) - .status(ExperimentStatusType::Created) - .status(ExperimentStatusType::Inprogress); - - let mut experiment_group_builder = client - .list_experiment_groups() - .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .all(true); + .org_id(&self.options.org_id); if let Some(fetched_at) = last_fetched_at .and_then(|t| t.timestamp_nanos_opt()) .and_then(|t| aws_smithy_types::DateTime::from_nanos(t.into()).ok()) { experiment_builder = experiment_builder.if_modified_since(fetched_at); - experiment_group_builder = - experiment_group_builder.if_modified_since(fetched_at); } if let Some(context) = context { if !context.is_empty() { let context = conversions::map_to_hashmap(context); - experiment_builder = - experiment_builder.set_context(Some(context.clone())); - experiment_group_builder = - experiment_group_builder.set_context(Some(context)); + experiment_builder = experiment_builder.set_context(Some(context)); } } @@ -84,24 +69,18 @@ impl HttpDataSource { if filter { experiment_builder = experiment_builder .dimension_match_strategy(DimensionMatchStrategy::Subset); - experiment_group_builder = experiment_group_builder - .dimension_match_strategy(DimensionMatchStrategy::Subset); } else { experiment_builder = experiment_builder .dimension_match_strategy(DimensionMatchStrategy::Exact); - experiment_group_builder = experiment_group_builder - .dimension_match_strategy(DimensionMatchStrategy::Exact); } } - let start_time = Utc::now(); - let (experiments_result, groups_result) = - tokio::join!(async { experiment_builder.send().await }, async { - experiment_group_builder.send().await - }); + info!("Fetching experiments from Superposition service using SDK"); + let experiments_result = experiment_builder.send().await; let experiments_response = match experiments_result { - Ok(res) => ConversionUtils::convert_experiments_response(res) + Ok(res) => ConversionUtils::convert_experiment_config_response(res) + .map(ExperimentData::new) .map(FetchResponse::Data), Err(SdkError::ResponseError(r)) if r.raw().status().as_u16() == 304 => { Ok(FetchResponse::NotModified) @@ -111,27 +90,10 @@ impl HttpDataSource { e ))), }?; - let groups_response = match groups_result { - Ok(res) => ConversionUtils::convert_experiment_groups_response(res) - .map(FetchResponse::Data), - Err(SdkError::ResponseError(r)) if r.raw().status().as_u16() == 304 => { - Ok(FetchResponse::NotModified) - } - Err(e) => Err(SuperpositionError::NetworkError(format!( - "Failed to list experiment groups: {}", - e - ))), - }?; - - let resp = ExperimentResponse { - experiments: experiments_response, - experiment_groups: groups_response, - fetched_at: start_time, - }; - info!("Successfully fetched {}", resp); + info!("Successfully fetched {}", experiments_response); - Ok(resp) + Ok(experiments_response) } async fn fetch_config_with_filters( @@ -210,7 +172,7 @@ impl SuperpositionDataSource for HttpDataSource { async fn fetch_active_experiments( &self, last_fetched_at: Option>, - ) -> Result { + ) -> Result> { self.fetch_experiments_with_filters(None, None, last_fetched_at, None) .await } @@ -220,7 +182,7 @@ impl SuperpositionDataSource for HttpDataSource { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result { + ) -> Result> { self.fetch_experiments_with_filters( context, prefix_filter, @@ -235,7 +197,7 @@ impl SuperpositionDataSource for HttpDataSource { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result { + ) -> Result> { self.fetch_experiments_with_filters( context, prefix_filter, diff --git a/crates/superposition_provider/src/local_provider.rs b/crates/superposition_provider/src/local_provider.rs index 384f9ec0b..02e156f9e 100644 --- a/crates/superposition_provider/src/local_provider.rs +++ b/crates/superposition_provider/src/local_provider.rs @@ -7,27 +7,23 @@ use derive_more::{Deref, DerefMut}; use open_feature::provider::{ FeatureProvider, ProviderMetadata, ProviderStatus, ResolutionDetails, }; -use open_feature::{ - EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, - StructValue, -}; +use open_feature::{EvaluationContext, EvaluationResult, StructValue}; use serde_json::{Map, Value}; -use superposition_core::experiment::filter_experiments_by_context; +use superposition_core::experiment::{filter_experiments_by_context, FfiExperimentGroup}; use superposition_core::{ eval_config, get_applicable_variants, get_satisfied_experiments, MergeStrategy, }; +use superposition_types::experimental::Experimental; use superposition_types::DimensionInfo; use tokio::sync::RwLock; use tokio::task::JoinHandle; use tokio::time::{sleep, Duration}; use crate::data_source::{ - ConfigData, ExperimentData, ExperimentResponse, FetchResponse, - SuperpositionDataSource, + ConfigData, ExperimentData, FetchResponse, SuperpositionDataSource, }; use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; -use crate::types::*; -use crate::utils::ConversionUtils; +use crate::{conversions, types::*}; pub struct LocalResolutionProviderInner { primary: Arc, @@ -38,6 +34,7 @@ pub struct LocalResolutionProviderInner { polling_task: RwLock>>, metadata: ProviderMetadata, status: RwLock, + global_context: RwLock, } #[derive(Deref, DerefMut, Clone)] @@ -60,10 +57,11 @@ impl LocalResolutionProvider { name: "LocalResolutionProvider".to_string(), }, status: RwLock::new(ProviderStatus::NotReady), + global_context: RwLock::new(EvaluationContext::default()), })) } - pub async fn init(&self) -> Result<()> { + pub async fn init(&self, context: EvaluationContext) -> Result<()> { // Fetch initial config from primary, fall back if needed let config_data = match self.primary.fetch_config(None).await { Ok(data) => { @@ -102,7 +100,7 @@ impl LocalResolutionProvider { // Fetch experiments best-effort: try primary, optionally fallback, but don't fail let exp_data = match self.primary.fetch_active_experiments(None).await { - Ok(exp_resp) => ExperimentData::try_from(exp_resp).ok(), + Ok(exp_resp) => exp_resp.into_data(), Err(e) => { log::warn!( "LocalResolutionProvider: primary experiment fetch failed (best-effort): {}", @@ -110,7 +108,7 @@ impl LocalResolutionProvider { ); if let Some(fallback) = &self.fallback { match fallback.fetch_active_experiments(None).await { - Ok(exp_resp) => ExperimentData::try_from(exp_resp).ok(), + Ok(exp_resp) => exp_resp.into_data(), Err(fb_err) => { log::warn!( "LocalResolutionProvider: fallback experiment fetch also failed (best-effort): {}", @@ -128,7 +126,6 @@ impl LocalResolutionProvider { if let Some(data) = exp_data { let mut cached = self.cached_experiments.write().await; *cached = Some(data); - log::info!("LocalResolutionProvider: experiments cached"); } // Start refresh strategy @@ -178,6 +175,11 @@ impl LocalResolutionProvider { *status = ProviderStatus::Ready; } + { + let mut global_context = self.global_context.write().await; + *global_context = context; + } + Ok(()) } @@ -276,10 +278,9 @@ impl LocalResolutionProvider { { Ok(exp_resp) => { let mut cached = self.cached_experiments.write().await; - *cached = match cached.clone() { - Some(c) => Some(c.update_with(exp_resp)), - None => ExperimentData::try_from(exp_resp).ok(), - }; + if let Some(data) = exp_resp.into_data() { + *cached = Some(data); + } log::debug!( "LocalResolutionProvider: experiments refreshed from primary" ); @@ -373,10 +374,9 @@ impl LocalResolutionProvider { Ok(exp_resp) => { let mut cached = provider_clone.cached_experiments.write().await; - *cached = match cached.clone() { - Some(c) => Some(c.update_with(exp_resp)), - None => ExperimentData::try_from(exp_resp).ok(), - }; + if let Some(data) = exp_resp.into_data() { + *cached = Some(data); + } log::debug!( "LocalResolutionProvider: experiments refreshed from primary on watch update" ); @@ -404,7 +404,7 @@ impl LocalResolutionProvider { async fn ensure_fresh_data(&self) -> Result<()> { if let RefreshStrategy::OnDemand(on_demand) = &self.refresh_strategy { let ttl = on_demand.ttl; - let use_stale_on_error = on_demand.use_stale_on_error.unwrap_or(false); + let use_stale_on_error = on_demand.use_stale_on_error.unwrap_or_default(); let should_refresh = { let cached = self.cached_config.read().await; @@ -444,13 +444,16 @@ impl LocalResolutionProvider { async fn eval_with_context( &self, - context: &EvaluationContext, + mut context: EvaluationContext, prefix_filter: Option<&[String]>, ) -> Result> { self.ensure_fresh_data().await?; + let global_context = self.global_context.read().await; + context.merge_missing(&global_context); + let (mut query_data, targeting_key) = - ConversionUtils::evaluation_context_to_query(context); + conversions::evaluation_context_to_query(context); let dimensions_info = self.get_dimensions_info().await; @@ -460,8 +463,8 @@ impl LocalResolutionProvider { if let Some(exp_data) = cached_exp.as_ref() { let variant_ids = get_applicable_variants( &dimensions_info, - exp_data.experiments.clone(), - &exp_data.experiment_groups, + exp_data.data.experiments.clone(), + &exp_data.data.experiment_groups, &query_data, &targeting_key.clone().unwrap_or_default(), None, @@ -503,14 +506,14 @@ impl LocalResolutionProvider { impl AllFeatureProvider for LocalResolutionProvider { async fn resolve_all_features( &self, - context: &EvaluationContext, + context: EvaluationContext, ) -> Result> { self.eval_with_context(context, None).await } async fn resolve_all_features_with_filter( &self, - context: &EvaluationContext, + context: EvaluationContext, prefix_filter: Option<&[String]>, ) -> Result> { self.eval_with_context(context, prefix_filter).await @@ -521,20 +524,23 @@ impl AllFeatureProvider for LocalResolutionProvider { impl FeatureExperimentMeta for LocalResolutionProvider { async fn get_applicable_variants( &self, - context: &EvaluationContext, + mut context: EvaluationContext, ) -> Result> { self.ensure_fresh_data().await?; + let global_context = self.global_context.read().await; + context.merge_missing(&global_context); + let (query_data, targeting_key) = - ConversionUtils::evaluation_context_to_query(context); + conversions::evaluation_context_to_query(context); let dimensions_info = self.get_dimensions_info().await; let cached_exp = self.cached_experiments.read().await; let resp = match cached_exp.as_ref() { Some(exp_data) => get_applicable_variants( &dimensions_info, - exp_data.experiments.clone(), - &exp_data.experiment_groups, + exp_data.data.experiments.clone(), + &exp_data.data.experiment_groups, &query_data, &targeting_key.unwrap_or_default(), None, @@ -547,21 +553,18 @@ impl FeatureExperimentMeta for LocalResolutionProvider { #[async_trait] impl FeatureProvider for LocalResolutionProvider { - async fn initialize(&mut self, _context: &EvaluationContext) { + async fn initialize(&mut self, context: &EvaluationContext) { log::info!("Initializing LocalResolutionProvider..."); { let mut status = self.status.write().await; *status = ProviderStatus::NotReady; } - if (self.init().await).is_err() { + if (self.init(context.clone()).await).is_err() { let mut status = self.status.write().await; *status = ProviderStatus::Error; return; } - let mut status = self.status.write().await; - *status = ProviderStatus::Ready; - log::info!("LocalResolutionProvider initialized successfully"); } @@ -570,31 +573,8 @@ impl FeatureProvider for LocalResolutionProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_bool() { - Some(bool_val) => Ok(ResolutionDetails::new(bool_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a boolean", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating boolean flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_bool(flag_key, evaluation_context.clone()) + .await } async fn resolve_string_value( @@ -602,31 +582,8 @@ impl FeatureProvider for LocalResolutionProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_str() { - Some(str_val) => Ok(ResolutionDetails::new(str_val.to_owned())), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a string", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating String flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_string(flag_key, evaluation_context.clone()) + .await } async fn resolve_int_value( @@ -634,31 +591,7 @@ impl FeatureProvider for LocalResolutionProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_i64() { - Some(int_val) => Ok(ResolutionDetails::new(int_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not an integer", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating integer flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_int(flag_key, evaluation_context.clone()).await } async fn resolve_float_value( @@ -666,31 +599,8 @@ impl FeatureProvider for LocalResolutionProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_f64() { - Some(float_val) => Ok(ResolutionDetails::new(float_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a float", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating float flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_float(flag_key, evaluation_context.clone()) + .await } async fn resolve_struct_value( @@ -698,39 +608,8 @@ impl FeatureProvider for LocalResolutionProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => { - match ConversionUtils::serde_value_to_struct_value(value) { - Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), - Err(e) => { - log::error!("Error converting value to StructValue: {}", e); - Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!( - "Flag '{}' is not a struct: {}", - flag_key, e - )), - }) - } - } - } - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating Object flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_struct(flag_key, evaluation_context.clone()) + .await } fn metadata(&self) -> &ProviderMetadata { @@ -784,7 +663,7 @@ impl SuperpositionDataSource for LocalResolutionProvider { async fn fetch_active_experiments( &self, _: Option>, - ) -> Result { + ) -> Result> { if !self.supports_experiments() { return Err(SuperpositionError::ConfigError( "Experiments not supported by this provider".into(), @@ -792,11 +671,7 @@ impl SuperpositionDataSource for LocalResolutionProvider { } let cached = self.cached_experiments.read().await; match cached.clone() { - Some(data) => Ok(ExperimentResponse { - experiments: FetchResponse::Data(data.experiments), - experiment_groups: FetchResponse::Data(data.experiment_groups), - fetched_at: data.fetched_at, - }), + Some(data) => Ok(FetchResponse::Data(data)), None => Err(SuperpositionError::ConfigError( "No cached experiments available".into(), )), @@ -808,26 +683,31 @@ impl SuperpositionDataSource for LocalResolutionProvider { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result { + ) -> Result> { if !self.supports_experiments() { return Err(SuperpositionError::ConfigError( "Experiments not supported by this provider".into(), )); } - let mut experiments_response = - self.fetch_active_experiments(last_fetched_at).await?; - - // TODO: adding experiment group filtering - experiments_response.experiments = - experiments_response.experiments.map_data(|exp_resp| { - get_satisfied_experiments( - exp_resp, - &context.unwrap_or_default(), + + let resp = self + .fetch_active_experiments(last_fetched_at) + .await? + .map_data(|mut exp_data| { + let context = context.unwrap_or_default(); + exp_data.data.experiments = get_satisfied_experiments( + exp_data.data.experiments, + &context, prefix_filter, - ) + ); + exp_data.data.experiment_groups = FfiExperimentGroup::get_satisfied( + exp_data.data.experiment_groups, + &context, + ); + exp_data }); - Ok(experiments_response) + Ok(resp) } async fn fetch_matching_active_experiments( @@ -835,26 +715,31 @@ impl SuperpositionDataSource for LocalResolutionProvider { context: Option>, prefix_filter: Option>, last_fetched_at: Option>, - ) -> Result { + ) -> Result> { if !self.supports_experiments() { return Err(SuperpositionError::ConfigError( "Experiments not supported by this provider".into(), )); } - let mut experiments_response = - self.fetch_active_experiments(last_fetched_at).await?; - - // TODO: adding experiment group filtering - experiments_response.experiments = - experiments_response.experiments.map_data(|exp_resp| { - filter_experiments_by_context( - exp_resp, - &context.unwrap_or_default(), + + let resp = self + .fetch_active_experiments(last_fetched_at) + .await? + .map_data(|mut exp_data| { + let context = context.unwrap_or_default(); + exp_data.data.experiments = filter_experiments_by_context( + exp_data.data.experiments, + &context, prefix_filter, - ) + ); + exp_data.data.experiment_groups = FfiExperimentGroup::filter_by_eval( + exp_data.data.experiment_groups, + &context, + ); + exp_data }); - Ok(experiments_response) + Ok(resp) } fn supports_experiments(&self) -> bool { diff --git a/crates/superposition_provider/src/provider.rs b/crates/superposition_provider/src/provider.rs index 7fe4be3c0..a63be4a52 100644 --- a/crates/superposition_provider/src/provider.rs +++ b/crates/superposition_provider/src/provider.rs @@ -15,9 +15,12 @@ use serde_json::{Map, Value}; use superposition_types::{Config, DimensionInfo}; use tokio::sync::RwLock; -use crate::client::{CacConfig, ExperimentationConfig}; use crate::types::*; use crate::utils::ConversionUtils; +use crate::{ + client::{CacConfig, ExperimentationConfig}, + conversions, +}; #[derive(Debug, Clone)] pub struct SuperpositionProvider { @@ -65,24 +68,6 @@ impl SuperpositionProvider { } } - fn get_context_from_evaluation_context( - &self, - evaluation_context: &EvaluationContext, - ) -> (serde_json::Map, Option) { - let context = evaluation_context - .custom_fields - .iter() - .map(|(k, v)| { - ( - k.clone(), - ConversionUtils::convert_evaluation_context_value_to_serde_value(v), - ) - }) - .collect(); - - (context, evaluation_context.targeting_key.clone()) - } - async fn get_dimensions_info(&self) -> HashMap { match &self.cac_config { Some(cac_config) => cac_config @@ -138,7 +123,7 @@ impl SuperpositionProvider { ) -> Result> { // Get cached config from CAC let (mut context, targeting_key) = - self.get_context_from_evaluation_context(evaluation_context); + conversions::evaluation_context_to_query(evaluation_context.clone()); let dimensions_info = self.get_dimensions_info().await; let variant_ids = if let Some(exp_config) = &self.exp_config { diff --git a/crates/superposition_provider/src/remote_provider.rs b/crates/superposition_provider/src/remote_provider.rs index acf7a1017..6fb699992 100644 --- a/crates/superposition_provider/src/remote_provider.rs +++ b/crates/superposition_provider/src/remote_provider.rs @@ -4,19 +4,16 @@ use std::time::{Duration, Instant}; use async_trait::async_trait; use aws_smithy_types::Document; -use log::{debug, error, info, warn}; use open_feature::{ provider::FeatureProvider, provider::{ProviderMetadata, ProviderStatus, ResolutionDetails}, - EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, - StructValue, + EvaluationContext, EvaluationResult, StructValue, }; use serde_json::{Map, Value}; use superposition_sdk::{Client, Config as SdkConfig}; use tokio::sync::RwLock; use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; -use crate::utils::ConversionUtils; use crate::{conversions, types::*}; // --------------------------------------------------------------------------- @@ -91,12 +88,11 @@ impl ResponseCache { } // Include sorted custom_fields for deterministic keys - let mut field_keys: Vec<&String> = context.custom_fields.keys().collect(); + let mut field_keys: Vec<_> = context.custom_fields.keys().cloned().collect(); field_keys.sort(); for k in field_keys { - if let Some(v) = context.custom_fields.get(k) { - let serde_val = - ConversionUtils::convert_evaluation_context_value_to_serde_value(v); + if let Some(v) = context.custom_fields.get(&k) { + let serde_val = conversions::evaluation_context_to_value(v.clone()); parts.push(format!("{}={}", k, serde_val)); } } @@ -112,6 +108,7 @@ impl ResponseCache { pub struct SuperpositionAPIProvider { options: SuperpositionOptions, cache: Option>>, + global_context: RwLock, metadata: ProviderMetadata, status: RwLock, } @@ -122,6 +119,7 @@ impl SuperpositionAPIProvider { Self { options, cache: None, + global_context: RwLock::new(EvaluationContext::default()), metadata: ProviderMetadata { name: "SuperpositionAPIProvider".to_string(), }, @@ -141,6 +139,7 @@ impl SuperpositionAPIProvider { Self { options, cache: Some(Arc::new(RwLock::new(cache))), + global_context: RwLock::new(EvaluationContext::default()), metadata: ProviderMetadata { name: "SuperpositionAPIProvider".to_string(), }, @@ -160,15 +159,15 @@ impl SuperpositionAPIProvider { async fn resolve_remote( &self, - context: &EvaluationContext, + mut context: EvaluationContext, prefix_filter: Option<&[String]>, ) -> Result> { + let cache_key = ResponseCache::cache_key(&context); // 1. Check cache for the full (unfiltered) result if let Some(ref cache_arc) = self.cache { - let cache_key = ResponseCache::cache_key(context); let cache = cache_arc.read().await; if let Some(cached_value) = cache.get(&cache_key) { - debug!("SuperpositionAPIProvider: cache hit for key"); + log::debug!("SuperpositionAPIProvider: cache hit for key"); let result = if let Some(prefixes) = prefix_filter { filter_by_prefix(cached_value, prefixes) } else { @@ -181,9 +180,12 @@ impl SuperpositionAPIProvider { // 2. Create SDK client let client = self.create_client(); + let global_context = self.global_context.read().await; + context.merge_missing(&global_context); + // 3. Extract context and targeting_key let (query_data, _targeting_key) = - ConversionUtils::evaluation_context_to_query(context); + conversions::evaluation_context_to_query(context); // 4. Build and send the get_resolved_config request // Always fetch WITHOUT prefix filter so we can cache the full result @@ -194,8 +196,8 @@ impl SuperpositionAPIProvider { // Set context dimensions from evaluation context let sdk_context: HashMap = query_data - .iter() - .map(|(k, v)| (k.clone(), serde_value_to_document(v))) + .into_iter() + .map(|(k, v)| (k, conversions::value_to_document(v))) .collect(); builder = builder.set_context(Some(sdk_context)); @@ -216,7 +218,7 @@ impl SuperpositionAPIProvider { let full_result = match config_value { Value::Object(map) => map, other => { - warn!( + log::warn!( "SuperpositionAPIProvider: resolved config is not an object, wrapping: {:?}", other ); @@ -228,7 +230,6 @@ impl SuperpositionAPIProvider { // Cache the full (unfiltered) result if let Some(ref cache_arc) = self.cache { - let cache_key = ResponseCache::cache_key(context); let mut cache = cache_arc.write().await; cache.put(cache_key, full_result.clone()); } @@ -263,36 +264,6 @@ fn filter_by_prefix( .collect() } -/// Convert a serde_json::Value to an aws_smithy_types::Document. -fn serde_value_to_document(value: &Value) -> Document { - match value { - Value::Null => Document::Null, - Value::Bool(b) => Document::Bool(*b), - Value::Number(n) => { - if let Some(u) = n.as_u64() { - Document::Number(aws_smithy_types::Number::PosInt(u)) - } else if let Some(i) = n.as_i64() { - Document::Number(aws_smithy_types::Number::NegInt(i)) - } else if let Some(f) = n.as_f64() { - Document::Number(aws_smithy_types::Number::Float(f)) - } else { - Document::Null - } - } - Value::String(s) => Document::String(s.clone()), - Value::Array(arr) => { - Document::Array(arr.iter().map(serde_value_to_document).collect()) - } - Value::Object(obj) => { - let map: HashMap = obj - .iter() - .map(|(k, v)| (k.clone(), serde_value_to_document(v))) - .collect(); - Document::Object(map) - } - } -} - // --------------------------------------------------------------------------- // Trait implementations // --------------------------------------------------------------------------- @@ -301,25 +272,26 @@ fn serde_value_to_document(value: &Value) -> Document { impl AllFeatureProvider for SuperpositionAPIProvider { async fn resolve_all_features( &self, - context: &EvaluationContext, + context: EvaluationContext, ) -> Result> { self.resolve_remote(context, None).await } async fn resolve_all_features_with_filter( &self, - context: &EvaluationContext, + context: EvaluationContext, prefix_filter: Option<&[String]>, ) -> Result> { self.resolve_remote(context, prefix_filter).await } } +// TODO: Pending #[async_trait] impl FeatureExperimentMeta for SuperpositionAPIProvider { async fn get_applicable_variants( &self, - _context: &EvaluationContext, + _context: EvaluationContext, ) -> Result> { // Remote resolution handles experiments server-side Ok(vec![]) @@ -329,12 +301,12 @@ impl FeatureExperimentMeta for SuperpositionAPIProvider { #[async_trait] impl FeatureProvider for SuperpositionAPIProvider { async fn initialize(&mut self, _context: &EvaluationContext) { - info!("Initializing SuperpositionAPIProvider..."); + log::info!("Initializing SuperpositionAPIProvider..."); { let mut status = self.status.write().await; *status = ProviderStatus::Ready; } - info!("SuperpositionAPIProvider initialized successfully"); + log::info!("SuperpositionAPIProvider initialized successfully"); } async fn resolve_bool_value( @@ -342,31 +314,8 @@ impl FeatureProvider for SuperpositionAPIProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_bool() { - Some(bool_val) => Ok(ResolutionDetails::new(bool_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a boolean", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - error!("Error evaluating boolean flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_bool(flag_key, evaluation_context.clone()) + .await } async fn resolve_string_value( @@ -374,31 +323,8 @@ impl FeatureProvider for SuperpositionAPIProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_str() { - Some(str_val) => Ok(ResolutionDetails::new(str_val.to_owned())), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a string", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - error!("Error evaluating String flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_string(flag_key, evaluation_context.clone()) + .await } async fn resolve_int_value( @@ -406,31 +332,7 @@ impl FeatureProvider for SuperpositionAPIProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_i64() { - Some(int_val) => Ok(ResolutionDetails::new(int_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not an integer", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - error!("Error evaluating integer flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_int(flag_key, evaluation_context.clone()).await } async fn resolve_float_value( @@ -438,31 +340,8 @@ impl FeatureProvider for SuperpositionAPIProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_f64() { - Some(float_val) => Ok(ResolutionDetails::new(float_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a float", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - error!("Error evaluating float flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_float(flag_key, evaluation_context.clone()) + .await } async fn resolve_struct_value( @@ -470,39 +349,8 @@ impl FeatureProvider for SuperpositionAPIProvider { flag_key: &str, evaluation_context: &EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => { - match ConversionUtils::serde_value_to_struct_value(value) { - Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), - Err(e) => { - error!("Error converting value to StructValue: {}", e); - Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!( - "Flag '{}' is not a struct: {}", - flag_key, e - )), - }) - } - } - } - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - error!("Error evaluating Object flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_struct(flag_key, evaluation_context.clone()) + .await } fn metadata(&self) -> &ProviderMetadata { diff --git a/crates/superposition_provider/src/traits.rs b/crates/superposition_provider/src/traits.rs index 596379828..9455b7a82 100644 --- a/crates/superposition_provider/src/traits.rs +++ b/crates/superposition_provider/src/traits.rs @@ -1,8 +1,24 @@ use async_trait::async_trait; -use open_feature::EvaluationContext; +use open_feature::{ + provider::ResolutionDetails, EvaluationContext, EvaluationError, EvaluationErrorCode, + EvaluationResult, StructValue, +}; use serde_json::{Map, Value}; -use crate::types::Result; +use crate::{types::Result, utils::ConversionUtils}; + +/// Trait for experiment variant resolution. +/// +/// Implementors provide the ability to determine which experiment variants +/// are applicable for a given evaluation context. +#[async_trait] +pub trait FeatureExperimentMeta: Send + Sync { + /// Get the list of applicable experiment variant IDs for the given context. + async fn get_applicable_variants( + &self, + context: EvaluationContext, + ) -> Result>; +} /// Trait for bulk configuration resolution. /// @@ -13,27 +29,182 @@ pub trait AllFeatureProvider: Send + Sync { /// Resolve all features for the given evaluation context. async fn resolve_all_features( &self, - context: &EvaluationContext, + context: EvaluationContext, ) -> Result>; /// Resolve all features for the given evaluation context, optionally /// filtered to only include keys matching the provided prefixes. async fn resolve_all_features_with_filter( &self, - context: &EvaluationContext, + context: EvaluationContext, prefix_filter: Option<&[String]>, ) -> Result>; -} -/// Trait for experiment variant resolution. -/// -/// Implementors provide the ability to determine which experiment variants -/// are applicable for a given evaluation context. -#[async_trait] -pub trait FeatureExperimentMeta: Send + Sync { - /// Get the list of applicable experiment variant IDs for the given context. - async fn get_applicable_variants( + async fn resolve_bool( &self, - context: &EvaluationContext, - ) -> Result>; + flag_key: &str, + evaluation_context: EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_bool() { + Some(bool_val) => Ok(ResolutionDetails::new(bool_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a boolean", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + log::error!("Error evaluating boolean flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), + }) + } + } + } + + async fn resolve_string( + &self, + flag_key: &str, + evaluation_context: EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_str() { + Some(str_val) => Ok(ResolutionDetails::new(str_val.to_owned())), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a string", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + log::error!("Error evaluating String flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), + }) + } + } + } + + async fn resolve_int( + &self, + flag_key: &str, + evaluation_context: EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_i64() { + Some(int_val) => Ok(ResolutionDetails::new(int_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not an integer", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + log::error!("Error evaluating integer flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), + }) + } + } + } + + async fn resolve_float( + &self, + flag_key: &str, + evaluation_context: EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => match value.as_f64() { + Some(float_val) => Ok(ResolutionDetails::new(float_val)), + None => Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!("Flag '{}' is not a float", flag_key)), + }), + }, + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + log::error!("Error evaluating float flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), + }) + } + } + } + + async fn resolve_struct( + &self, + flag_key: &str, + evaluation_context: EvaluationContext, + ) -> EvaluationResult> { + match self.resolve_all_features(evaluation_context).await { + Ok(config) => match config.get(flag_key) { + Some(value) => { + match ConversionUtils::serde_value_to_struct_value(value) { + Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), + Err(e) => { + log::error!("Error converting value to StructValue: {}", e); + Err(EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!( + "Flag '{}' is not a struct: {}", + flag_key, e + )), + }) + } + } + } + None => Err(EvaluationError { + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), + }), + }, + Err(e) => { + log::error!("Error evaluating Object flag {}: {}", flag_key, e); + Err(EvaluationError { + code: EvaluationErrorCode::General(format!( + "Error evaluating flag '{}': {}", + flag_key, e + )), + message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), + }) + } + } + } } diff --git a/crates/superposition_provider/src/utils.rs b/crates/superposition_provider/src/utils.rs index 8d699a996..b8c4607a3 100644 --- a/crates/superposition_provider/src/utils.rs +++ b/crates/superposition_provider/src/utils.rs @@ -1,10 +1,11 @@ use std::collections::HashMap; use log::debug; -use serde_json::{json, Map, Value}; -use superposition_core::experiment::{ExperimentGroups, FfiExperimentGroup}; +use serde_json::{Map, Value}; +use superposition_core::experiment::{ + ExperimentConfig, ExperimentGroups, FfiExperimentGroup, +}; use superposition_core::{Experiments, FfiExperiment}; -use superposition_sdk::operation::list_experiment_groups::ListExperimentGroupsOutput; use superposition_sdk::types::{ ExperimentStatusType as SDKExperimentStatusType, GroupType as SdkGroupType, }; @@ -303,13 +304,13 @@ impl ConversionUtils { /// Convert list_experiment SDK response to structured experiment data pub fn convert_experiments_response( - response: superposition_sdk::operation::list_experiment::ListExperimentOutput, + response: Vec, ) -> Result { debug!("Converting experiments response"); let mut trimmed_exp_list: Experiments = Vec::new(); - for exp in response.data { + for exp in response { // Convert experiment context (condition) let condition_map = conversions::hashmap_to_map(exp.context); @@ -380,13 +381,13 @@ impl ConversionUtils { } pub fn convert_experiment_groups_response( - response: ListExperimentGroupsOutput, + response: Vec, ) -> Result { debug!("Converting experiment groups response"); let mut trimmed_group_list: ExperimentGroups = Vec::new(); - for exp_group in response.data { + for exp_group in response { // Convert experiment context (condition) let condition_map = conversions::hashmap_to_map(exp_group.context); @@ -435,78 +436,19 @@ impl ConversionUtils { Ok(trimmed_group_list) } - pub fn convert_evaluation_context_value_to_serde_value( - value: &open_feature::EvaluationContextFieldValue, - ) -> Value { - match value { - open_feature::EvaluationContextFieldValue::Bool(b) => Value::Bool(*b), - open_feature::EvaluationContextFieldValue::Int(i) => { - Value::Number(serde_json::Number::from(*i)) - } - open_feature::EvaluationContextFieldValue::Float(f) => json!(f), - open_feature::EvaluationContextFieldValue::String(s) => { - Value::String(s.clone()) - } - open_feature::EvaluationContextFieldValue::DateTime(dt) => { - Value::String(dt.to_string()) - } - open_feature::EvaluationContextFieldValue::Struct(s) => { - // Convert struct to serde_json::Value - let struct_map: Map = s - .as_ref() - .downcast_ref::>() - .cloned() - .unwrap_or_default(); - Value::Object(struct_map) - } - } - } - /// Convert evaluation context to dimension data format expected by superposition_types - pub fn context_to_dimension_data( - context: &open_feature::EvaluationContext, - ) -> Map { - let mut dimension_data = Map::new(); - - // Add targeting key if present - if let Some(targeting_key) = &context.targeting_key { - dimension_data.insert( - "targeting_key".to_string(), - Value::String(targeting_key.to_string()), - ); - } + pub fn convert_experiment_config_response( + response: superposition_sdk::operation::get_experiment_config::GetExperimentConfigOutput, + ) -> Result { + debug!("Converting experiment config response"); - // Add all other fields from the context - for (key, value) in &context.custom_fields { - let serde_value = - Self::convert_evaluation_context_value_to_serde_value(value); - dimension_data.insert(key.clone(), serde_value); - } + let experiments = Self::convert_experiments_response(response.experiments)?; + let experiment_groups = + Self::convert_experiment_groups_response(response.experiment_groups)?; - debug!( - "Converted evaluation context to dimension data with {} keys", - dimension_data.len() - ); - dimension_data - } - - /// Convert an EvaluationContext into a (Map, Option) tuple - /// containing the custom fields as serde values and the targeting key. - /// This is used by both local and remote providers. - pub fn evaluation_context_to_query( - ctx: &open_feature::EvaluationContext, - ) -> (Map, Option) { - let context = ctx - .custom_fields - .iter() - .map(|(k, v)| { - ( - k.clone(), - Self::convert_evaluation_context_value_to_serde_value(v), - ) - }) - .collect(); - - (context, ctx.targeting_key.clone()) + Ok(ExperimentConfig { + experiments, + experiment_groups, + }) } /// Convert Config back to the legacy format for compatibility with existing provider logic From 72bf6945b04a20cca2b1286c42d11cd5ad103182 Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Tue, 24 Mar 2026 20:11:10 +0530 Subject: [PATCH 15/16] chore: fix rebase issues --- .../Io/Superposition/Model/GetConfigInput.hs | 31 -- .../Model/GetExperimentConfigInput.hs | 98 ---- .../Model/ListExperimentGroupsInput.hs | 234 ---------- .../Model/ListExperimentInput.hs | 31 -- .../Model/ListExperimentOutput.hs | 304 ------------- .../client/SuperpositionAsyncClientImpl.java | 39 -- .../client/SuperpositionClientImpl.java | 39 -- .../superposition/model/GetConfigInput.java | 27 -- .../model/GetExperimentConfigInput.java | 108 ----- .../model/ListExperimentGroupsInput.java | 385 ---------------- .../model/ListExperimentInput.java | 27 -- .../model/ListExperimentOutput.java | 426 ------------------ .../commands/GetExperimentConfigCommand.ts | 7 - .../sdk/src/commands/ListExperimentCommand.ts | 31 -- .../commands/ListExperimentGroupsCommand.ts | 24 - clients/javascript/sdk/src/models/models_0.ts | 55 --- .../sdk/src/protocols/Aws_restJson1.ts | 38 -- .../sdk/superposition_sdk/_private/schemas.py | 127 ------ .../python/sdk/superposition_sdk/config.py | 19 - .../sdk/superposition_sdk/deserialize.py | 15 - .../python/sdk/superposition_sdk/models.py | 123 ----- .../python/sdk/superposition_sdk/serialize.py | 89 ---- crates/context_aware_config/src/helpers.rs | 64 +-- crates/experimentation_platform/Cargo.toml | 1 - .../src/api/experiment_config/handlers.rs | 6 +- .../src/api/experiment_groups/helpers.rs | 38 +- .../src/api/experiments/helpers.rs | 40 +- .../src/middlewares/auth_z/casbin/casbin.sql | 4 - crates/service_utils/src/redis.rs | 18 +- crates/superposition_core/src/ffi.rs | 3 +- .../examples/local_file_watch_example.rs | 7 +- .../examples/local_http_example.rs | 9 +- .../src/client/get_experiment_config.rs | 7 - .../src/client/list_experiment.rs | 31 -- .../src/client/list_experiment_groups.rs | 22 - .../_get_experiment_config_input.rs | 41 -- .../get_experiment_config/builders.rs | 9 - .../_list_experiment_output.rs | 143 ------ .../_list_experiment_groups_input.rs | 122 ----- .../list_experiment_groups/builders.rs | 26 -- .../src/protocol_serde/shape_get_config.rs | 15 - .../protocol_serde/shape_list_experiment.rs | 39 -- .../shape_list_experiment_groups.rs | 15 - crates/superposition_sdk/src/serde_util.rs | 31 -- crates/superposition_sdk/src/types.rs | 62 --- .../superposition_sdk/src/types/builders.rs | 35 -- docs/docs/api/Superposition.openapi.json | 91 ---- docs/docs/api/get-config.api.mdx | 32 -- .../get-experiment-config.ParamsDetails.json | 10 +- docs/docs/api/get-experiment-config.api.mdx | 8 - docs/docs/api/list-experiment-groups.api.mdx | 24 - docs/docs/api/list-experiment.api.mdx | 27 -- smithy/patches/python.patch | 364 ++------------- 53 files changed, 114 insertions(+), 3507 deletions(-) diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs index 2e36f9113..c15f5230e 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetConfigInput.hs @@ -143,38 +143,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetConfigInput where Io.Superposition.Utility.serQuery "prefix" (prefix self) Io.Superposition.Utility.serQuery "version" (version self) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) -======= -<<<<<<< HEAD -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) -======= - Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 45a3cd01 (reabse fix) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs b/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs index fcada2675..076065b1b 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/GetExperimentConfigInput.hs @@ -4,14 +4,7 @@ module Io.Superposition.Model.GetExperimentConfigInput ( setIfModifiedSince, setPrefix, setContext, -<<<<<<< HEAD -<<<<<<< HEAD setDimensionMatchStrategy, -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - setDimensionMatchStrategy, ->>>>>>> 0dd5da56 (fix: some fixes) build, GetExperimentConfigInputBuilder, GetExperimentConfigInput, @@ -19,17 +12,8 @@ module Io.Superposition.Model.GetExperimentConfigInput ( org_id, if_modified_since, prefix, -<<<<<<< HEAD -<<<<<<< HEAD - context, - dimension_match_strategy -======= - context ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= context, dimension_match_strategy ->>>>>>> 0dd5da56 (fix: some fixes) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -43,14 +27,7 @@ import qualified Data.Text import qualified Data.Time import qualified GHC.Generics import qualified GHC.Show -<<<<<<< HEAD -<<<<<<< HEAD import qualified Io.Superposition.Model.DimensionMatchStrategy -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= -import qualified Io.Superposition.Model.DimensionMatchStrategy ->>>>>>> 0dd5da56 (fix: some fixes) import qualified Io.Superposition.Utility import qualified Network.HTTP.Types.Method @@ -59,17 +36,8 @@ data GetExperimentConfigInput = GetExperimentConfigInput { org_id :: Data.Text.Text, if_modified_since :: Data.Maybe.Maybe Data.Time.UTCTime, prefix :: Data.Maybe.Maybe ([] Data.Text.Text), -<<<<<<< HEAD -<<<<<<< HEAD context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -======= - context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), - dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy ->>>>>>> 0dd5da56 (fix: some fixes) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -82,17 +50,8 @@ instance Data.Aeson.ToJSON GetExperimentConfigInput where "org_id" Data.Aeson..= org_id a, "if_modified_since" Data.Aeson..= if_modified_since a, "prefix" Data.Aeson..= prefix a, -<<<<<<< HEAD -<<<<<<< HEAD - "context" Data.Aeson..= context a, - "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a -======= - "context" Data.Aeson..= context a ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= "context" Data.Aeson..= context a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a ->>>>>>> 0dd5da56 (fix: some fixes) ] @@ -105,14 +64,7 @@ instance Data.Aeson.FromJSON GetExperimentConfigInput where Control.Applicative.<*> (v Data.Aeson..:? "if_modified_since") Control.Applicative.<*> (v Data.Aeson..:? "prefix") Control.Applicative.<*> (v Data.Aeson..:? "context") -<<<<<<< HEAD -<<<<<<< HEAD - Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") ->>>>>>> 0dd5da56 (fix: some fixes) @@ -122,17 +74,8 @@ data GetExperimentConfigInputBuilderState = GetExperimentConfigInputBuilderState org_idBuilderState :: Data.Maybe.Maybe Data.Text.Text, if_modified_sinceBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime, prefixBuilderState :: Data.Maybe.Maybe ([] Data.Text.Text), -<<<<<<< HEAD -<<<<<<< HEAD contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -======= - contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value), - dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy ->>>>>>> 0dd5da56 (fix: some fixes) } deriving ( GHC.Generics.Generic ) @@ -143,17 +86,8 @@ defaultBuilderState = GetExperimentConfigInputBuilderState { org_idBuilderState = Data.Maybe.Nothing, if_modified_sinceBuilderState = Data.Maybe.Nothing, prefixBuilderState = Data.Maybe.Nothing, -<<<<<<< HEAD -<<<<<<< HEAD - contextBuilderState = Data.Maybe.Nothing, - dimension_match_strategyBuilderState = Data.Maybe.Nothing -======= - contextBuilderState = Data.Maybe.Nothing ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= contextBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing ->>>>>>> 0dd5da56 (fix: some fixes) } type GetExperimentConfigInputBuilder = Control.Monad.State.Strict.State GetExperimentConfigInputBuilderState @@ -178,19 +112,10 @@ setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> GetExperimentConfigInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) build :: GetExperimentConfigInputBuilder () -> Data.Either.Either Data.Text.Text GetExperimentConfigInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -199,30 +124,14 @@ build builder = do if_modified_since' <- Data.Either.Right (if_modified_sinceBuilderState st) prefix' <- Data.Either.Right (prefixBuilderState st) context' <- Data.Either.Right (contextBuilderState st) -<<<<<<< HEAD -<<<<<<< HEAD dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) ->>>>>>> 0dd5da56 (fix: some fixes) Data.Either.Right (GetExperimentConfigInput { workspace_id = workspace_id', org_id = org_id', if_modified_since = if_modified_since', prefix = prefix', -<<<<<<< HEAD -<<<<<<< HEAD - context = context', - dimension_match_strategy = dimension_match_strategy' -======= - context = context' ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= context = context', dimension_match_strategy = dimension_match_strategy' ->>>>>>> 0dd5da56 (fix: some fixes) }) @@ -232,14 +141,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder GetExperimentConfigInput wh Io.Superposition.Utility.setPath [ "experiment-config" ] -<<<<<<< HEAD -<<<<<<< HEAD - Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) ->>>>>>> 0dd5da56 (fix: some fixes) Io.Superposition.Utility.serQuery "prefix" (prefix self) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs index f987ba415..ec2322a16 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentGroupsInput.hs @@ -11,30 +11,8 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( setSortOn, setSortBy, setGroupType, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) setDimensionMatchStrategy, setContext, -======= -<<<<<<< HEAD -======= - setDimensionMatchStrategy, - setContext, ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - setDimensionMatchStrategy, - setContext, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) build, ListExperimentGroupsInputBuilder, ListExperimentGroupsInput, @@ -49,25 +27,9 @@ module Io.Superposition.Model.ListExperimentGroupsInput ( last_modified_by, sort_on, sort_by, -<<<<<<< HEAD -<<<<<<< HEAD - group_type, - dimension_match_strategy, - context -======= -<<<<<<< HEAD - group_type -======= group_type, dimension_match_strategy, context ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - group_type, - dimension_match_strategy, - context ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -101,25 +63,9 @@ data ListExperimentGroupsInput = ListExperimentGroupsInput { last_modified_by :: Data.Maybe.Maybe Data.Text.Text, sort_on :: Data.Maybe.Maybe Io.Superposition.Model.ExperimentGroupSortOn.ExperimentGroupSortOn, sort_by :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, -<<<<<<< HEAD -<<<<<<< HEAD - group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), - dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, - context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -======= -<<<<<<< HEAD - group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) -======= - group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), - dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, - context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= group_type :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), dimension_match_strategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, context :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -139,25 +85,9 @@ instance Data.Aeson.ToJSON ListExperimentGroupsInput where "last_modified_by" Data.Aeson..= last_modified_by a, "sort_on" Data.Aeson..= sort_on a, "sort_by" Data.Aeson..= sort_by a, -<<<<<<< HEAD -<<<<<<< HEAD - "group_type" Data.Aeson..= group_type a, - "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, - "context" Data.Aeson..= context a -======= -<<<<<<< HEAD - "group_type" Data.Aeson..= group_type a -======= - "group_type" Data.Aeson..= group_type a, - "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, - "context" Data.Aeson..= context a ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= "group_type" Data.Aeson..= group_type a, "dimension_match_strategy" Data.Aeson..= dimension_match_strategy a, "context" Data.Aeson..= context a ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) ] @@ -177,30 +107,8 @@ instance Data.Aeson.FromJSON ListExperimentGroupsInput where Control.Applicative.<*> (v Data.Aeson..:? "sort_on") Control.Applicative.<*> (v Data.Aeson..:? "sort_by") Control.Applicative.<*> (v Data.Aeson..:? "group_type") -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") - Control.Applicative.<*> (v Data.Aeson..:? "context") -======= -<<<<<<< HEAD -======= Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") Control.Applicative.<*> (v Data.Aeson..:? "context") ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - Control.Applicative.<*> (v Data.Aeson..:? "dimension_match_strategy") - Control.Applicative.<*> (v Data.Aeson..:? "context") ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @@ -217,25 +125,9 @@ data ListExperimentGroupsInputBuilderState = ListExperimentGroupsInputBuilderSta last_modified_byBuilderState :: Data.Maybe.Maybe Data.Text.Text, sort_onBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.ExperimentGroupSortOn.ExperimentGroupSortOn, sort_byBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.SortBy.SortBy, -<<<<<<< HEAD -<<<<<<< HEAD - group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), - dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, - contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -======= -<<<<<<< HEAD - group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) -======= - group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), - dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, - contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= group_typeBuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType), dimension_match_strategyBuilderState :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy, contextBuilderState :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } deriving ( GHC.Generics.Generic ) @@ -253,25 +145,9 @@ defaultBuilderState = ListExperimentGroupsInputBuilderState { last_modified_byBuilderState = Data.Maybe.Nothing, sort_onBuilderState = Data.Maybe.Nothing, sort_byBuilderState = Data.Maybe.Nothing, -<<<<<<< HEAD -<<<<<<< HEAD - group_typeBuilderState = Data.Maybe.Nothing, - dimension_match_strategyBuilderState = Data.Maybe.Nothing, - contextBuilderState = Data.Maybe.Nothing -======= -<<<<<<< HEAD - group_typeBuilderState = Data.Maybe.Nothing -======= group_typeBuilderState = Data.Maybe.Nothing, dimension_match_strategyBuilderState = Data.Maybe.Nothing, contextBuilderState = Data.Maybe.Nothing ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - group_typeBuilderState = Data.Maybe.Nothing, - dimension_match_strategyBuilderState = Data.Maybe.Nothing, - contextBuilderState = Data.Maybe.Nothing ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } type ListExperimentGroupsInputBuilder = Control.Monad.State.Strict.State ListExperimentGroupsInputBuilderState @@ -324,25 +200,6 @@ setGroupType :: Data.Maybe.Maybe ([] Io.Superposition.Model.GroupType.GroupType) setGroupType value = Control.Monad.State.Strict.modify (\s -> (s { group_typeBuilderState = value })) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= -======= ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) setDimensionMatchStrategy :: Data.Maybe.Maybe Io.Superposition.Model.DimensionMatchStrategy.DimensionMatchStrategy -> ListExperimentGroupsInputBuilder () setDimensionMatchStrategy value = Control.Monad.State.Strict.modify (\s -> (s { dimension_match_strategyBuilderState = value })) @@ -351,13 +208,6 @@ setContext :: Data.Maybe.Maybe (Data.Map.Map Data.Text.Text Data.Aeson.Value) -> setContext value = Control.Monad.State.Strict.modify (\s -> (s { contextBuilderState = value })) -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) build :: ListExperimentGroupsInputBuilder () -> Data.Either.Either Data.Text.Text ListExperimentGroupsInput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState @@ -373,30 +223,8 @@ build builder = do sort_on' <- Data.Either.Right (sort_onBuilderState st) sort_by' <- Data.Either.Right (sort_byBuilderState st) group_type' <- Data.Either.Right (group_typeBuilderState st) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) - context' <- Data.Either.Right (contextBuilderState st) -======= -<<<<<<< HEAD -======= - dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) - context' <- Data.Either.Right (contextBuilderState st) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= dimension_match_strategy' <- Data.Either.Right (dimension_match_strategyBuilderState st) context' <- Data.Either.Right (contextBuilderState st) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Data.Either.Right (ListExperimentGroupsInput { count = count', page = page', @@ -409,25 +237,9 @@ build builder = do last_modified_by = last_modified_by', sort_on = sort_on', sort_by = sort_by', -<<<<<<< HEAD -<<<<<<< HEAD group_type = group_type', dimension_match_strategy = dimension_match_strategy', context = context' -======= -<<<<<<< HEAD - group_type = group_type' -======= - group_type = group_type', - dimension_match_strategy = dimension_match_strategy', - context = context' ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - group_type = group_type', - dimension_match_strategy = dimension_match_strategy', - context = context' ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }) @@ -444,57 +256,11 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentGroupsInput w Io.Superposition.Utility.serQuery "sort_by" (sort_by self) Io.Superposition.Utility.serQuery "group_type" (group_type self) Io.Superposition.Utility.serQuery "created_by" (created_by self) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) - Io.Superposition.Utility.serQuery "sort_on" (sort_on self) - Io.Superposition.Utility.serQuery "name" (name self) - Io.Superposition.Utility.serQuery "page" (page self) - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= - Io.Superposition.Utility.serQuery "sort_on" (sort_on self) - Io.Superposition.Utility.serQuery "name" (name self) - Io.Superposition.Utility.serQuery "page" (page self) - Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= Io.Superposition.Utility.serQuery "dimension_match_strategy" (dimension_match_strategy self) Io.Superposition.Utility.serQuery "sort_on" (sort_on self) Io.Superposition.Utility.serQuery "name" (name self) Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs index c259813cc..49d8949cd 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentInput.hs @@ -330,38 +330,7 @@ instance Io.Superposition.Utility.IntoRequestBuilder ListExperimentInput where Io.Superposition.Utility.serQuery "to_date" (to_date self) Io.Superposition.Utility.serQuery "page" (page self) Io.Superposition.Utility.serQuery "status" (status self) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) -======= -<<<<<<< HEAD -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) -======= - Io.Superposition.Utility.serHeader "If-Modified-Since" (if_modified_since self) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - Io.Superposition.Utility.serHeader "if-modified-since" (if_modified_since self) ->>>>>>> 45a3cd01 (reabse fix) Io.Superposition.Utility.serHeader "x-workspace" (workspace_id self) Io.Superposition.Utility.serHeader "x-org-id" (org_id self) Io.Superposition.Utility.serField "context" (context self) diff --git a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs index eb4812a99..03a0aa25b 100644 --- a/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs +++ b/clients/haskell/sdk/Io/Superposition/Model/ListExperimentOutput.hs @@ -2,73 +2,14 @@ module Io.Superposition.Model.ListExperimentOutput ( setTotalPages, setTotalItems, setData', -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD setLastModified, -======= -<<<<<<< HEAD -======= - setLastModified, ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - setLastModified, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - setLastModified, -======= - setLastModifiedAt, ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - setLastModified, ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - setLastModified, ->>>>>>> 45a3cd01 (reabse fix) build, ListExperimentOutputBuilder, ListExperimentOutput, total_pages, total_items, -<<<<<<< HEAD -<<<<<<< HEAD - data', - last_modified -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD - data' -======= - data', - last_modified ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= data', last_modified ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - last_modified_at ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - last_modified ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) ) where import qualified Control.Applicative import qualified Control.Monad.State.Strict @@ -89,36 +30,8 @@ import qualified Network.HTTP.Types data ListExperimentOutput = ListExperimentOutput { total_pages :: Data.Int.Int32, total_items :: Data.Int.Int32, -<<<<<<< HEAD -<<<<<<< HEAD - data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, - last_modified :: Data.Time.UTCTime -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD - data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse -======= data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, last_modified :: Data.Time.UTCTime ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - data' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse, - last_modified :: Data.Time.UTCTime ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - last_modified_at :: Data.Time.UTCTime ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - last_modified :: Data.Time.UTCTime ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) } deriving ( GHC.Show.Show, Data.Eq.Eq, @@ -129,36 +42,8 @@ instance Data.Aeson.ToJSON ListExperimentOutput where toJSON a = Data.Aeson.object [ "total_pages" Data.Aeson..= total_pages a, "total_items" Data.Aeson..= total_items a, -<<<<<<< HEAD -<<<<<<< HEAD "data" Data.Aeson..= data' a, "last_modified" Data.Aeson..= last_modified a -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD - "data" Data.Aeson..= data' a -======= - "data" Data.Aeson..= data' a, - "last_modified" Data.Aeson..= last_modified a ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - "data" Data.Aeson..= data' a, - "last_modified" Data.Aeson..= last_modified a ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - "last_modified_at" Data.Aeson..= last_modified_at a ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - "last_modified" Data.Aeson..= last_modified a ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) ] @@ -169,38 +54,7 @@ instance Data.Aeson.FromJSON ListExperimentOutput where Data.Functor.<$> (v Data.Aeson..: "total_pages") Control.Applicative.<*> (v Data.Aeson..: "total_items") Control.Applicative.<*> (v Data.Aeson..: "data") -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - Control.Applicative.<*> (v Data.Aeson..: "last_modified") -======= -<<<<<<< HEAD -======= - Control.Applicative.<*> (v Data.Aeson..: "last_modified") ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - Control.Applicative.<*> (v Data.Aeson..: "last_modified") ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) Control.Applicative.<*> (v Data.Aeson..: "last_modified") -======= - Control.Applicative.<*> (v Data.Aeson..: "last_modified_at") ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - Control.Applicative.<*> (v Data.Aeson..: "last_modified") ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - Control.Applicative.<*> (v Data.Aeson..: "last_modified") ->>>>>>> 45a3cd01 (reabse fix) @@ -208,36 +62,8 @@ instance Data.Aeson.FromJSON ListExperimentOutput where data ListExperimentOutputBuilderState = ListExperimentOutputBuilderState { total_pagesBuilderState :: Data.Maybe.Maybe Data.Int.Int32, total_itemsBuilderState :: Data.Maybe.Maybe Data.Int.Int32, -<<<<<<< HEAD -<<<<<<< HEAD - data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), - last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD - data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse) -======= - data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), - last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= data'BuilderState :: Data.Maybe.Maybe ([] Io.Superposition.Model.ExperimentResponse.ExperimentResponse), last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - last_modified_atBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - last_modifiedBuilderState :: Data.Maybe.Maybe Data.Time.UTCTime ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) } deriving ( GHC.Generics.Generic ) @@ -246,36 +72,8 @@ defaultBuilderState :: ListExperimentOutputBuilderState defaultBuilderState = ListExperimentOutputBuilderState { total_pagesBuilderState = Data.Maybe.Nothing, total_itemsBuilderState = Data.Maybe.Nothing, -<<<<<<< HEAD -<<<<<<< HEAD - data'BuilderState = Data.Maybe.Nothing, - last_modifiedBuilderState = Data.Maybe.Nothing -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD - data'BuilderState = Data.Maybe.Nothing -======= data'BuilderState = Data.Maybe.Nothing, last_modifiedBuilderState = Data.Maybe.Nothing ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - data'BuilderState = Data.Maybe.Nothing, - last_modifiedBuilderState = Data.Maybe.Nothing ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - last_modified_atBuilderState = Data.Maybe.Nothing ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - last_modifiedBuilderState = Data.Maybe.Nothing ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) } type ListExperimentOutputBuilder = Control.Monad.State.Strict.State ListExperimentOutputBuilderState @@ -292,91 +90,22 @@ setData' :: [] Io.Superposition.Model.ExperimentResponse.ExperimentResponse -> L setData' value = Control.Monad.State.Strict.modify (\s -> (s { data'BuilderState = Data.Maybe.Just value })) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) setLastModified :: Data.Time.UTCTime -> ListExperimentOutputBuilder () setLastModified value = Control.Monad.State.Strict.modify (\s -> (s { last_modifiedBuilderState = Data.Maybe.Just value })) -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) build :: ListExperimentOutputBuilder () -> Data.Either.Either Data.Text.Text ListExperimentOutput build builder = do let (_, st) = Control.Monad.State.Strict.runState builder defaultBuilderState total_pages' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.total_pages is a required property.") Data.Either.Right (total_pagesBuilderState st) total_items' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.total_items is a required property.") Data.Either.Right (total_itemsBuilderState st) data'' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.data' is a required property.") Data.Either.Right (data'BuilderState st) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) Data.Either.Right (ListExperimentOutput { total_pages = total_pages', total_items = total_items', data' = data'', last_modified = last_modified' -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD - Data.Either.Right (ListExperimentOutput { - total_pages = total_pages', - total_items = total_items', - data' = data'' -======= -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) - last_modified' <- Data.Maybe.maybe (Data.Either.Left "Io.Superposition.Model.ListExperimentOutput.ListExperimentOutput.last_modified is a required property.") Data.Either.Right (last_modifiedBuilderState st) - Data.Either.Right (ListExperimentOutput { - total_pages = total_pages', - total_items = total_items', - data' = data'', - last_modified = last_modified' -<<<<<<< HEAD ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - last_modified_at = last_modified_at' ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - last_modified = last_modified' ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) }) @@ -388,42 +117,9 @@ instance Io.Superposition.Utility.FromResponseParser ListExperimentOutput where var2 <- Io.Superposition.Utility.deSerField "total_pages" var3 <- Io.Superposition.Utility.deSerField "total_items" pure $ ListExperimentOutput { -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD - total_pages = var1, - total_items = var2, - data' = var0 -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) total_pages = var2, total_items = var3, data' = var1, last_modified = var0 -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= - last_modified_at = var0 ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - last_modified = var0 ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java index f586be065..79b07bff2 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionAsyncClientImpl.java @@ -272,47 +272,8 @@ @SmithyGenerated final class SuperpositionAsyncClientImpl extends Client implements SuperpositionAsyncClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) - .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) -======= ->>>>>>> 0dd5da56 (fix: some fixes) -======= -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 964966cd (feat: Add prefix filter in list exp) -======= -<<<<<<< HEAD -======= - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) ->>>>>>> 6e8749e1 (Test) -======= - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) ->>>>>>> 82479b8f (fix: more fixes) -======= - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) - .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) ->>>>>>> 5f8110af (Test) ->>>>>>> c1293812 (Test) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) -======= - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) ->>>>>>> 45a3cd01 (reabse fix) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java index f518d5d4a..a5c489143 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/client/SuperpositionClientImpl.java @@ -272,47 +272,8 @@ @SmithyGenerated final class SuperpositionClientImpl extends Client implements SuperpositionClient { private static final TypeRegistry TYPE_REGISTRY = TypeRegistry.builder() -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) - .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) -======= ->>>>>>> 0dd5da56 (fix: some fixes) -======= -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 964966cd (feat: Add prefix filter in list exp) -======= -<<<<<<< HEAD -======= - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) ->>>>>>> 6e8749e1 (Test) -======= - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) ->>>>>>> 82479b8f (fix: more fixes) -======= - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) - .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) ->>>>>>> 5f8110af (Test) ->>>>>>> c1293812 (Test) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) -======= - .putType(AccessDeniedException.$ID, AccessDeniedException.class, AccessDeniedException::builder) - .putType(ValidationException.$ID, ValidationException.class, ValidationException::builder) ->>>>>>> 45a3cd01 (reabse fix) .putType(NotAuthorizedException.$ID, NotAuthorizedException.class, NotAuthorizedException::builder) .putType(InternalFailureException.$ID, InternalFailureException.class, InternalFailureException::builder) .putType(UnknownOperationException.$ID, UnknownOperationException.class, UnknownOperationException::builder) diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java index 4e7d468c1..77b01791b 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetConfigInput.java @@ -37,35 +37,8 @@ public final class GetConfigInput implements SerializableStruct { new HttpQueryTrait("prefix")) .putMember("version", PreludeSchemas.STRING, new HttpQueryTrait("version")) -<<<<<<< HEAD -<<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD -======= - .putMember("if_modified_since", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - .putMember("if_modified_since", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - new HttpHeaderTrait("If-Modified-Since")) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) .putMember("context", SharedSchemas.CONTEXT_MAP) .build(); diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java index 882a3871a..a9a14f6e6 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/GetExperimentConfigInput.java @@ -38,16 +38,8 @@ public final class GetExperimentConfigInput implements SerializableStruct { .putMember("prefix", SharedSchemas.STRING_LIST, new HttpQueryTrait("prefix")) .putMember("context", SharedSchemas.CONTEXT_MAP) -<<<<<<< HEAD -<<<<<<< HEAD .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, - new HttpQueryTrait("dimension_match_strategy")) ->>>>>>> 0dd5da56 (fix: some fixes) .build(); private static final Schema $SCHEMA_WORKSPACE_ID = $SCHEMA.member("workspace_id"); @@ -55,28 +47,14 @@ public final class GetExperimentConfigInput implements SerializableStruct { private static final Schema $SCHEMA_IF_MODIFIED_SINCE = $SCHEMA.member("if_modified_since"); private static final Schema $SCHEMA_PREFIX = $SCHEMA.member("prefix"); private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); -<<<<<<< HEAD -<<<<<<< HEAD private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); ->>>>>>> 0dd5da56 (fix: some fixes) private final transient String workspaceId; private final transient String orgId; private final transient Instant ifModifiedSince; private final transient List prefix; private final transient Map context; -<<<<<<< HEAD -<<<<<<< HEAD - private final transient DimensionMatchStrategy dimensionMatchStrategy; -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= private final transient DimensionMatchStrategy dimensionMatchStrategy; ->>>>>>> 0dd5da56 (fix: some fixes) private GetExperimentConfigInput(Builder builder) { this.workspaceId = builder.workspaceId; @@ -84,14 +62,7 @@ private GetExperimentConfigInput(Builder builder) { this.ifModifiedSince = builder.ifModifiedSince; this.prefix = builder.prefix == null ? null : Collections.unmodifiableList(builder.prefix); this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); -<<<<<<< HEAD -<<<<<<< HEAD this.dimensionMatchStrategy = builder.dimensionMatchStrategy; -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - this.dimensionMatchStrategy = builder.dimensionMatchStrategy; ->>>>>>> 0dd5da56 (fix: some fixes) } public String workspaceId() { @@ -133,19 +104,10 @@ public boolean hasContext() { return context != null; } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -164,30 +126,13 @@ public boolean equals(Object other) { && Objects.equals(this.orgId, that.orgId) && Objects.equals(this.ifModifiedSince, that.ifModifiedSince) && Objects.equals(this.prefix, that.prefix) -<<<<<<< HEAD -<<<<<<< HEAD - && Objects.equals(this.context, that.context) - && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy); -======= - && Objects.equals(this.context, that.context); ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= && Objects.equals(this.context, that.context) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy); ->>>>>>> 0dd5da56 (fix: some fixes) } @Override public int hashCode() { -<<<<<<< HEAD -<<<<<<< HEAD - return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context, dimensionMatchStrategy); -======= - return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context); ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= return Objects.hash(workspaceId, orgId, ifModifiedSince, prefix, context, dimensionMatchStrategy); ->>>>>>> 0dd5da56 (fix: some fixes) } @Override @@ -208,18 +153,9 @@ public void serializeMembers(ShapeSerializer serializer) { if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } -<<<<<<< HEAD -<<<<<<< HEAD if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - if (dimensionMatchStrategy != null) { - serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); - } ->>>>>>> 0dd5da56 (fix: some fixes) } @Override @@ -231,14 +167,7 @@ public T getMemberValue(Schema member) { case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, ifModifiedSince); case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, prefix); case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); -<<<<<<< HEAD -<<<<<<< HEAD - case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); ->>>>>>> 0dd5da56 (fix: some fixes) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -257,14 +186,7 @@ public Builder toBuilder() { builder.ifModifiedSince(this.ifModifiedSince); builder.prefix(this.prefix); builder.context(this.context); -<<<<<<< HEAD -<<<<<<< HEAD builder.dimensionMatchStrategy(this.dimensionMatchStrategy); -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - builder.dimensionMatchStrategy(this.dimensionMatchStrategy); ->>>>>>> 0dd5da56 (fix: some fixes) return builder; } @@ -285,14 +207,7 @@ public static final class Builder implements ShapeBuilder prefix; private Map context; -<<<<<<< HEAD -<<<<<<< HEAD - private DimensionMatchStrategy dimensionMatchStrategy; -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= private DimensionMatchStrategy dimensionMatchStrategy; ->>>>>>> 0dd5da56 (fix: some fixes) private Builder() {} @@ -349,10 +264,6 @@ public Builder context(Map context) { return this; } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) /** * @return this builder. */ @@ -361,11 +272,6 @@ public Builder dimensionMatchStrategy(DimensionMatchStrategy dimensionMatchStrat return this; } -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) @Override public GetExperimentConfigInput build() { tracker.validate(); @@ -381,14 +287,7 @@ public void setMemberValue(Schema member, Object value) { case 2 -> ifModifiedSince((Instant) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, value)); case 3 -> prefix((List) SchemaUtils.validateSameMember($SCHEMA_PREFIX, member, value)); case 4 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); -<<<<<<< HEAD -<<<<<<< HEAD case 5 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - case 5 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); ->>>>>>> 0dd5da56 (fix: some fixes) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -430,14 +329,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 2 -> builder.ifModifiedSince(de.readTimestamp(member)); case 3 -> builder.prefix(SharedSerde.deserializeStringList(member, de)); case 4 -> builder.context(SharedSerde.deserializeContextMap(member, de)); -<<<<<<< HEAD -<<<<<<< HEAD - case 5 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= case 5 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); ->>>>>>> 0dd5da56 (fix: some fixes) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java index 06fe80114..dc046fa70 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentGroupsInput.java @@ -39,35 +39,8 @@ public final class ListExperimentGroupsInput implements SerializableStruct { .putMember("org_id", PreludeSchemas.STRING, new HttpHeaderTrait("x-org-id"), new RequiredTrait()) -<<<<<<< HEAD -<<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD -======= - .putMember("if_modified_since", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - .putMember("if_modified_since", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - new HttpHeaderTrait("If-Modified-Since")) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) .putMember("name", PreludeSchemas.STRING, new HttpQueryTrait("name")) .putMember("created_by", PreludeSchemas.STRING, @@ -80,33 +53,9 @@ >>>>>>> de718464 (fix: more fixes) new HttpQueryTrait("sort_by")) .putMember("group_type", SharedSchemas.GROUP_TYPE_LIST, new HttpQueryTrait("group_type")) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, - new HttpQueryTrait("dimension_match_strategy")) - .putMember("context", SharedSchemas.CONTEXT_MAP) -======= -<<<<<<< HEAD -======= - .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, - new HttpQueryTrait("dimension_match_strategy")) - .putMember("context", SharedSchemas.CONTEXT_MAP) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= .putMember("dimension_match_strategy", DimensionMatchStrategy.$SCHEMA, new HttpQueryTrait("dimension_match_strategy")) .putMember("context", SharedSchemas.CONTEXT_MAP) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) .build(); private static final Schema $SCHEMA_COUNT = $SCHEMA.member("count"); @@ -121,30 +70,8 @@ >>>>>>> de718464 (fix: more fixes) private static final Schema $SCHEMA_SORT_ON = $SCHEMA.member("sort_on"); private static final Schema $SCHEMA_SORT_BY = $SCHEMA.member("sort_by"); private static final Schema $SCHEMA_GROUP_TYPE = $SCHEMA.member("group_type"); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); - private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); -======= -<<<<<<< HEAD -======= - private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); - private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= private static final Schema $SCHEMA_DIMENSION_MATCH_STRATEGY = $SCHEMA.member("dimension_match_strategy"); private static final Schema $SCHEMA_CONTEXT = $SCHEMA.member("context"); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private final transient Integer count; private final transient Integer page; @@ -158,30 +85,8 @@ >>>>>>> de718464 (fix: more fixes) private final transient ExperimentGroupSortOn sortOn; private final transient SortBy sortBy; private final transient List groupType; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - private final transient DimensionMatchStrategy dimensionMatchStrategy; - private final transient Map context; -======= -<<<<<<< HEAD -======= - private final transient DimensionMatchStrategy dimensionMatchStrategy; - private final transient Map context; ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= private final transient DimensionMatchStrategy dimensionMatchStrategy; private final transient Map context; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private ListExperimentGroupsInput(Builder builder) { this.count = builder.count; @@ -196,30 +101,8 @@ private ListExperimentGroupsInput(Builder builder) { this.sortOn = builder.sortOn; this.sortBy = builder.sortBy; this.groupType = builder.groupType == null ? null : Collections.unmodifiableList(builder.groupType); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - this.dimensionMatchStrategy = builder.dimensionMatchStrategy; - this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); -======= -<<<<<<< HEAD -======= this.dimensionMatchStrategy = builder.dimensionMatchStrategy; this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - this.dimensionMatchStrategy = builder.dimensionMatchStrategy; - this.context = builder.context == null ? null : Collections.unmodifiableMap(builder.context); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } /** @@ -309,25 +192,6 @@ public boolean hasGroupType() { return groupType != null; } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= -======= ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) public DimensionMatchStrategy dimensionMatchStrategy() { return dimensionMatchStrategy; } @@ -343,13 +207,6 @@ public boolean hasContext() { return context != null; } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -375,62 +232,14 @@ public boolean equals(Object other) { && Objects.equals(this.lastModifiedBy, that.lastModifiedBy) && Objects.equals(this.sortOn, that.sortOn) && Objects.equals(this.sortBy, that.sortBy) -<<<<<<< HEAD -<<<<<<< HEAD - && Objects.equals(this.groupType, that.groupType) - && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) - && Objects.equals(this.context, that.context); -======= -<<<<<<< HEAD - && Objects.equals(this.groupType, that.groupType); -======= - && Objects.equals(this.groupType, that.groupType) - && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) - && Objects.equals(this.context, that.context); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= && Objects.equals(this.groupType, that.groupType) && Objects.equals(this.dimensionMatchStrategy, that.dimensionMatchStrategy) && Objects.equals(this.context, that.context); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override public int hashCode() { -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); -======= -<<<<<<< HEAD - return Objects.hash(count, page, all, workspaceId, orgId, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType); -======= return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); -======= - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, context); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - return Objects.hash(count, page, all, workspaceId, orgId, ifModifiedSince, name, createdBy, lastModifiedBy, sortOn, sortBy, groupType, dimensionMatchStrategy, context); ->>>>>>> 45a3cd01 (reabse fix) } @Override @@ -472,36 +281,12 @@ public void serializeMembers(ShapeSerializer serializer) { if (groupType != null) { serializer.writeList($SCHEMA_GROUP_TYPE, groupType, groupType.size(), SharedSerde.GroupTypeListSerializer.INSTANCE); } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) if (dimensionMatchStrategy != null) { serializer.writeString($SCHEMA_DIMENSION_MATCH_STRATEGY, dimensionMatchStrategy.value()); } if (context != null) { serializer.writeMap($SCHEMA_CONTEXT, context, context.size(), SharedSerde.ContextMapSerializer.INSTANCE); } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } @Override @@ -513,20 +298,6 @@ public T getMemberValue(Schema member) { case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_COUNT, member, count); case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_PAGE, member, page); case 4 -> (T) SchemaUtils.validateSameMember($SCHEMA_ALL, member, all); -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD - case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_NAME, member, name); - case 6 -> (T) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, createdBy); - case 7 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_BY, member, lastModifiedBy); - case 8 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, sortOn); - case 9 -> (T) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, sortBy); - case 10 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 5 -> (T) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, ifModifiedSince); case 6 -> (T) SchemaUtils.validateSameMember($SCHEMA_NAME, member, name); case 7 -> (T) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, createdBy); @@ -536,29 +307,6 @@ public T getMemberValue(Schema member) { case 11 -> (T) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, groupType); case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= - case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - case 12 -> (T) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, dimensionMatchStrategy); - case 13 -> (T) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, context); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -584,30 +332,8 @@ public Builder toBuilder() { builder.sortOn(this.sortOn); builder.sortBy(this.sortBy); builder.groupType(this.groupType); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) builder.dimensionMatchStrategy(this.dimensionMatchStrategy); builder.context(this.context); -======= -<<<<<<< HEAD -======= - builder.dimensionMatchStrategy(this.dimensionMatchStrategy); - builder.context(this.context); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - builder.dimensionMatchStrategy(this.dimensionMatchStrategy); - builder.context(this.context); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return builder; } @@ -635,30 +361,8 @@ public static final class Builder implements ShapeBuilder groupType; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - private DimensionMatchStrategy dimensionMatchStrategy; - private Map context; -======= -<<<<<<< HEAD -======= private DimensionMatchStrategy dimensionMatchStrategy; private Map context; ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - private DimensionMatchStrategy dimensionMatchStrategy; - private Map context; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) private Builder() {} @@ -789,14 +493,6 @@ public Builder groupType(List groupType) { return this; } -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** * @return this builder. */ @@ -813,13 +509,6 @@ public Builder context(Map context) { return this; } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public ListExperimentGroupsInput build() { tracker.validate(); @@ -835,20 +524,6 @@ public void setMemberValue(Schema member, Object value) { case 2 -> count((int) SchemaUtils.validateSameMember($SCHEMA_COUNT, member, value)); case 3 -> page((int) SchemaUtils.validateSameMember($SCHEMA_PAGE, member, value)); case 4 -> all((boolean) SchemaUtils.validateSameMember($SCHEMA_ALL, member, value)); -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD - case 5 -> name((String) SchemaUtils.validateSameMember($SCHEMA_NAME, member, value)); - case 6 -> createdBy((String) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, value)); - case 7 -> lastModifiedBy((String) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_BY, member, value)); - case 8 -> sortOn((ExperimentGroupSortOn) SchemaUtils.validateSameMember($SCHEMA_SORT_ON, member, value)); - case 9 -> sortBy((SortBy) SchemaUtils.validateSameMember($SCHEMA_SORT_BY, member, value)); - case 10 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 5 -> ifModifiedSince((Instant) SchemaUtils.validateSameMember($SCHEMA_IF_MODIFIED_SINCE, member, value)); case 6 -> name((String) SchemaUtils.validateSameMember($SCHEMA_NAME, member, value)); case 7 -> createdBy((String) SchemaUtils.validateSameMember($SCHEMA_CREATED_BY, member, value)); @@ -858,29 +533,6 @@ public void setMemberValue(Schema member, Object value) { case 11 -> groupType((List) SchemaUtils.validateSameMember($SCHEMA_GROUP_TYPE, member, value)); case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= - case 12 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - case 12 -> dimensionMatchStrategy((DimensionMatchStrategy) SchemaUtils.validateSameMember($SCHEMA_DIMENSION_MATCH_STRATEGY, member, value)); - case 13 -> context((Map) SchemaUtils.validateSameMember($SCHEMA_CONTEXT, member, value)); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -922,20 +574,6 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 2 -> builder.count(de.readInteger(member)); case 3 -> builder.page(de.readInteger(member)); case 4 -> builder.all(de.readBoolean(member)); -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD - case 5 -> builder.name(de.readString(member)); - case 6 -> builder.createdBy(de.readString(member)); - case 7 -> builder.lastModifiedBy(de.readString(member)); - case 8 -> builder.sortOn(ExperimentGroupSortOn.builder().deserializeMember(de, member).build()); - case 9 -> builder.sortBy(SortBy.builder().deserializeMember(de, member).build()); - case 10 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 5 -> builder.ifModifiedSince(de.readTimestamp(member)); case 6 -> builder.name(de.readString(member)); case 7 -> builder.createdBy(de.readString(member)); @@ -945,29 +583,6 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 11 -> builder.groupType(SharedSerde.deserializeGroupTypeList(member, de)); case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= - case 12 -> builder.context(SharedSerde.deserializeContextMap(member, de)); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - case 12 -> builder.dimensionMatchStrategy(DimensionMatchStrategy.builder().deserializeMember(de, member).build()); - case 13 -> builder.context(SharedSerde.deserializeContextMap(member, de)); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java index 44835c6b9..6ae8fca70 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentInput.java @@ -39,35 +39,8 @@ public final class ListExperimentInput implements SerializableStruct { .putMember("org_id", PreludeSchemas.STRING, new HttpHeaderTrait("x-org-id"), new RequiredTrait()) -<<<<<<< HEAD -<<<<<<< HEAD .putMember("if_modified_since", SharedSchemas.DATE_TIME, new HttpHeaderTrait("if-modified-since")) -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD -======= - .putMember("if_modified_since", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - .putMember("if_modified_since", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - new HttpHeaderTrait("If-Modified-Since")) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - new HttpHeaderTrait("if-modified-since")) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) .putMember("status", SharedSchemas.EXPERIMENT_STATUS_TYPE_LIST, new HttpQueryTrait("status")) .putMember("from_date", SharedSchemas.DATE_TIME, diff --git a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java index 1e1dc6d11..a63db2bb9 100644 --- a/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java +++ b/clients/java/sdk/src/main/java/io/juspay/superposition/model/ListExperimentOutput.java @@ -30,143 +30,26 @@ public final class ListExperimentOutput implements SerializableStruct { new RequiredTrait()) .putMember("data", SharedSchemas.EXPERIMENT_LIST, new RequiredTrait()) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) .putMember("last_modified", SharedSchemas.DATE_TIME, new HttpHeaderTrait("last-modified"), new RequiredTrait()) -======= -<<<<<<< HEAD -======= - .putMember("last_modified", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("last-modified"), - new RequiredTrait()) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - .putMember("last_modified", SharedSchemas.DATE_TIME, - new HttpHeaderTrait("last-modified"), - new RequiredTrait()) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) .build(); private static final Schema $SCHEMA_TOTAL_PAGES = $SCHEMA.member("total_pages"); private static final Schema $SCHEMA_TOTAL_ITEMS = $SCHEMA.member("total_items"); private static final Schema $SCHEMA_DATA = $SCHEMA.member("data"); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); -======= -<<<<<<< HEAD -======= - private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); -======= - private static final Schema $SCHEMA_LAST_MODIFIED_AT = $SCHEMA.member("last_modified_at"); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - private static final Schema $SCHEMA_LAST_MODIFIED = $SCHEMA.member("last_modified"); ->>>>>>> 45a3cd01 (reabse fix) private final transient int totalPages; private final transient int totalItems; private final transient List data; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - private final transient Instant lastModified; -======= -<<<<<<< HEAD -======= - private final transient Instant lastModified; ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= private final transient Instant lastModified; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - private final transient Instant lastModified; -======= - private final transient Instant lastModifiedAt; ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - private final transient Instant lastModified; ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - private final transient Instant lastModified; ->>>>>>> 45a3cd01 (reabse fix) private ListExperimentOutput(Builder builder) { this.totalPages = builder.totalPages; this.totalItems = builder.totalItems; this.data = Collections.unmodifiableList(builder.data); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - this.lastModified = builder.lastModified; -======= -<<<<<<< HEAD -======= this.lastModified = builder.lastModified; ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - this.lastModified = builder.lastModified; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - this.lastModified = builder.lastModified; -======= - this.lastModifiedAt = builder.lastModifiedAt; ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - this.lastModified = builder.lastModified; ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - this.lastModified = builder.lastModified; ->>>>>>> 45a3cd01 (reabse fix) } public int totalPages() { @@ -185,34 +68,10 @@ public boolean hasData() { return true; } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) public Instant lastModified() { return lastModified; } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public String toString() { return ToStringSerializer.serialize(this); @@ -229,73 +88,13 @@ public boolean equals(Object other) { ListExperimentOutput that = (ListExperimentOutput) other; return this.totalPages == that.totalPages && this.totalItems == that.totalItems -<<<<<<< HEAD -<<<<<<< HEAD && Objects.equals(this.data, that.data) && Objects.equals(this.lastModified, that.lastModified); -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD - && Objects.equals(this.data, that.data); -======= - && Objects.equals(this.data, that.data) - && Objects.equals(this.lastModified, that.lastModified); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - && Objects.equals(this.data, that.data) - && Objects.equals(this.lastModified, that.lastModified); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - && Objects.equals(this.lastModifiedAt, that.lastModifiedAt); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - && Objects.equals(this.lastModified, that.lastModified); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) } @Override public int hashCode() { -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD return Objects.hash(totalPages, totalItems, data, lastModified); -======= -<<<<<<< HEAD - return Objects.hash(totalPages, totalItems, data); -======= - return Objects.hash(totalPages, totalItems, data, lastModified); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - return Objects.hash(totalPages, totalItems, data, lastModified); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - return Objects.hash(totalPages, totalItems, data, lastModified); -======= - return Objects.hash(totalPages, totalItems, data, lastModifiedAt); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - return Objects.hash(totalPages, totalItems, data, lastModified); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - return Objects.hash(totalPages, totalItems, data, lastModified); ->>>>>>> 45a3cd01 (reabse fix) } @Override @@ -308,38 +107,7 @@ public void serializeMembers(ShapeSerializer serializer) { serializer.writeInteger($SCHEMA_TOTAL_PAGES, totalPages); serializer.writeInteger($SCHEMA_TOTAL_ITEMS, totalItems); serializer.writeList($SCHEMA_DATA, data, data.size(), SharedSerde.ExperimentListSerializer.INSTANCE); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); -======= -<<<<<<< HEAD -======= - serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); -======= - serializer.writeTimestamp($SCHEMA_LAST_MODIFIED_AT, lastModifiedAt); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - serializer.writeTimestamp($SCHEMA_LAST_MODIFIED, lastModified); ->>>>>>> 45a3cd01 (reabse fix) } @Override @@ -349,38 +117,7 @@ public T getMemberValue(Schema member) { case 0 -> (T) SchemaUtils.validateSameMember($SCHEMA_TOTAL_PAGES, member, totalPages); case 1 -> (T) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, totalItems); case 2 -> (T) SchemaUtils.validateSameMember($SCHEMA_DATA, member, data); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); -======= -<<<<<<< HEAD -======= - case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); -======= - case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_AT, member, lastModifiedAt); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - case 3 -> (T) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, lastModified); ->>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Attempted to get non-existent member: " + member.id()); }; } @@ -397,38 +134,7 @@ public Builder toBuilder() { builder.totalPages(this.totalPages); builder.totalItems(this.totalItems); builder.data(this.data); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - builder.lastModified(this.lastModified); -======= -<<<<<<< HEAD -======= - builder.lastModified(this.lastModified); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= builder.lastModified(this.lastModified); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - builder.lastModified(this.lastModified); -======= - builder.lastModifiedAt(this.lastModifiedAt); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - builder.lastModified(this.lastModified); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - builder.lastModified(this.lastModified); ->>>>>>> 45a3cd01 (reabse fix) return builder; } @@ -447,38 +153,7 @@ public static final class Builder implements ShapeBuilder private int totalPages; private int totalItems; private List data; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - private Instant lastModified; -======= -<<<<<<< HEAD -======= - private Instant lastModified; ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - private Instant lastModified; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - private Instant lastModified; -======= - private Instant lastModifiedAt; ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - private Instant lastModified; ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= private Instant lastModified; ->>>>>>> 45a3cd01 (reabse fix) private Builder() {} @@ -517,14 +192,6 @@ public Builder data(List data) { return this; } -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** *

Required * @return this builder. @@ -535,13 +202,6 @@ public Builder lastModified(Instant lastModified) { return this; } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) @Override public ListExperimentOutput build() { tracker.validate(); @@ -555,38 +215,7 @@ public void setMemberValue(Schema member, Object value) { case 0 -> totalPages((int) SchemaUtils.validateSameMember($SCHEMA_TOTAL_PAGES, member, value)); case 1 -> totalItems((int) SchemaUtils.validateSameMember($SCHEMA_TOTAL_ITEMS, member, value)); case 2 -> data((List) SchemaUtils.validateSameMember($SCHEMA_DATA, member, value)); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); -======= -<<<<<<< HEAD -======= - case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); -======= - case 3 -> lastModifiedAt((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED_AT, member, value)); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - case 3 -> lastModified((Instant) SchemaUtils.validateSameMember($SCHEMA_LAST_MODIFIED, member, value)); ->>>>>>> 45a3cd01 (reabse fix) default -> ShapeBuilder.super.setMemberValue(member, value); } } @@ -605,33 +234,9 @@ public ShapeBuilder errorCorrection() { if (!tracker.checkMember($SCHEMA_DATA)) { data(Collections.emptyList()); } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { - lastModified(Instant.EPOCH); - } -======= -<<<<<<< HEAD -======= if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { lastModified(Instant.EPOCH); } ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - if (!tracker.checkMember($SCHEMA_LAST_MODIFIED)) { - lastModified(Instant.EPOCH); - } ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return this; } @@ -656,38 +261,7 @@ public void accept(Builder builder, Schema member, ShapeDeserializer de) { case 0 -> builder.totalPages(de.readInteger(member)); case 1 -> builder.totalItems(de.readInteger(member)); case 2 -> builder.data(SharedSerde.deserializeExperimentList(member, de)); -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - case 3 -> builder.lastModified(de.readTimestamp(member)); -======= -<<<<<<< HEAD -======= - case 3 -> builder.lastModified(de.readTimestamp(member)); ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - case 3 -> builder.lastModified(de.readTimestamp(member)); ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - case 3 -> builder.lastModified(de.readTimestamp(member)); -======= - case 3 -> builder.lastModifiedAt(de.readTimestamp(member)); ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - case 3 -> builder.lastModified(de.readTimestamp(member)); ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= case 3 -> builder.lastModified(de.readTimestamp(member)); ->>>>>>> 45a3cd01 (reabse fix) default -> throw new IllegalArgumentException("Unexpected member: " + member.memberName()); } } diff --git a/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts b/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts index 10f4ed157..89805641c 100644 --- a/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts +++ b/clients/javascript/sdk/src/commands/GetExperimentConfigCommand.ts @@ -52,14 +52,7 @@ export interface GetExperimentConfigCommandOutput extends GetExperimentConfigOut * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, -<<<<<<< HEAD -<<<<<<< HEAD * dimension_match_strategy: "exact" || "subset", -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - * dimension_match_strategy: "exact" || "subset", ->>>>>>> 0dd5da56 (fix: some fixes) * }; * const command = new GetExperimentConfigCommand(input); * const response = await client.send(command); diff --git a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts index 5fd549d1b..1c89d2d4c 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentCommand.ts @@ -118,38 +118,7 @@ export interface ListExperimentCommandOutput extends ListExperimentOutput, __Met * // experiment_group_id: "STRING_VALUE", * // }, * // ], -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD * // last_modified: new Date("TIMESTAMP"), // required -======= -<<<<<<< HEAD -======= - * // last_modified: new Date("TIMESTAMP"), // required ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - * // last_modified: new Date("TIMESTAMP"), // required ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - * // last_modified: new Date("TIMESTAMP"), // required -======= - * // last_modified_at: new Date("TIMESTAMP"), // required ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - * // last_modified: new Date("TIMESTAMP"), // required ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - * // last_modified: new Date("TIMESTAMP"), // required ->>>>>>> 45a3cd01 (reabse fix) * // }; * * ``` diff --git a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts index ef6deb97b..38d6a18f0 100644 --- a/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts +++ b/clients/javascript/sdk/src/commands/ListExperimentGroupsCommand.ts @@ -57,34 +57,10 @@ export interface ListExperimentGroupsCommandOutput extends ListExperimentGroupsO * group_type: [ // GroupTypeList * "USER_CREATED" || "SYSTEM_GENERATED", * ], -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) * dimension_match_strategy: "exact" || "subset", * context: { // ContextMap * "": "DOCUMENT_VALUE", * }, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) * }; * const command = new ListExperimentGroupsCommand(input); * const response = await client.send(command); diff --git a/clients/javascript/sdk/src/models/models_0.ts b/clients/javascript/sdk/src/models/models_0.ts index b8b6746b6..22ee0b59c 100644 --- a/clients/javascript/sdk/src/models/models_0.ts +++ b/clients/javascript/sdk/src/models/models_0.ts @@ -1891,21 +1891,12 @@ export interface GetExperimentConfigInput { * @public */ context?: Record | undefined; -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) /** * Strategy to follow while filter items based on the context * @public */ dimension_match_strategy?: DimensionMatchStrategy | undefined; -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) } /** @@ -2018,14 +2009,6 @@ export interface ListExperimentGroupsInput { * @public */ group_type?: (GroupType)[] | undefined; -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /** * Strategy to follow while filter items based on the context @@ -2039,13 +2022,6 @@ export interface ListExperimentGroupsInput { * @public */ context?: Record | undefined; -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } /** @@ -2179,38 +2155,7 @@ export interface ListExperimentOutput { total_pages: number | undefined; total_items: number | undefined; data: (ExperimentResponse)[] | undefined; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD last_modified: Date | undefined; -======= -<<<<<<< HEAD -======= - last_modified: Date | undefined; ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - last_modified: Date | undefined; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - last_modified: Date | undefined; -======= - last_modified_at: Date | undefined; ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - last_modified: Date | undefined; ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - last_modified: Date | undefined; ->>>>>>> 45a3cd01 (reabse fix) } /** diff --git a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts index a02194523..532f66bb0 100644 --- a/clients/javascript/sdk/src/protocols/Aws_restJson1.ts +++ b/clients/javascript/sdk/src/protocols/Aws_restJson1.ts @@ -1284,14 +1284,7 @@ export const se_GetExperimentConfigCommand = async( b.bp("/experiment-config"); const query: any = map({ [_p]: [() => input.prefix !== void 0, () => ((input[_p]! || []))], -<<<<<<< HEAD -<<<<<<< HEAD [_dms]: [,input[_dms]!], -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - [_dms]: [,input[_dms]!], ->>>>>>> 0dd5da56 (fix: some fixes) }); let body: any; body = JSON.stringify(take(input, { @@ -4117,38 +4110,7 @@ export const de_ListExperimentCommand = async( } const contents: any = map({ $metadata: deserializeMetadata(output), -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], -======= -<<<<<<< HEAD -======= - [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], -======= - [_lma]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= [_lm_]: [() => void 0 !== output.headers[_lm], () => __expectNonNull(__parseRfc3339DateTimeWithOffset(output.headers[_lm]))], ->>>>>>> 45a3cd01 (reabse fix) }); const data: Record = __expectNonNull((__expectObject(await parseBody(output.body, context))), "body"); const doc = take(data, { diff --git a/clients/python/sdk/superposition_sdk/_private/schemas.py b/clients/python/sdk/superposition_sdk/_private/schemas.py index cc8d59099..d1801435a 100644 --- a/clients/python/sdk/superposition_sdk/_private/schemas.py +++ b/clients/python/sdk/superposition_sdk/_private/schemas.py @@ -1717,14 +1717,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "if_modified_since": { "target": DATE_TIME, "index": 4, @@ -1735,13 +1727,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "context": { "target": CONTEXT_MAP, "index": 5, @@ -9659,10 +9644,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 5, @@ -9673,11 +9654,6 @@ ], }, -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) } ) @@ -10037,14 +10013,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "if_modified_since": { "target": DATE_TIME, "index": 5, @@ -10055,13 +10023,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": { "target": STRING, "index": 6, @@ -10118,56 +10079,9 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD "dimension_match_strategy": { "target": DIMENSION_MATCH_STRATEGY, "index": 12, -======= -<<<<<<< HEAD -======= -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - "dimension_match_strategy": { - "target": DIMENSION_MATCH_STRATEGY, - "index": 12, - "traits": [ - Trait.new(id=ShapeID("smithy.api#notProperty")), - Trait.new(id=ShapeID("smithy.api#httpQuery"), value="dimension_match_strategy"), - - ], - }, - - "context": { - "target": CONTEXT_MAP, - "index": 13, - "traits": [ - Trait.new(id=ShapeID("smithy.api#notProperty")), - - ], - }, - - } -) - -<<<<<<< HEAD -EXPERIMENT_GROUP_RESPONSE = Schema.collection( - id=ShapeID("io.superposition#ExperimentGroupResponse"), - - members={ - "id": { - "target": STRING, - "index": 0, ->>>>>>> 91d47048 (fix: more fixes) "traits": [ Trait.new(id=ShapeID("smithy.api#notProperty")), Trait.new(id=ShapeID("smithy.api#httpQuery"), value="dimension_match_strategy"), @@ -10187,8 +10101,6 @@ } ) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) LIST_EXPERIMENT_GROUPS_OUTPUT = Schema.collection( id=ShapeID("io.superposition#ListExperimentGroupsOutput"), @@ -11016,14 +10928,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "if_modified_since": { "target": DATE_TIME, "index": 5, @@ -11034,13 +10938,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "status": { "target": EXPERIMENT_STATUS_TYPE_LIST, "index": 6, @@ -11207,23 +11104,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) "last_modified": { "target": DATE_TIME, "index": 3, @@ -11234,13 +11114,6 @@ ], }, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } ) diff --git a/clients/python/sdk/superposition_sdk/config.py b/clients/python/sdk/superposition_sdk/config.py index 366f268ed..504703be7 100644 --- a/clients/python/sdk/superposition_sdk/config.py +++ b/clients/python/sdk/superposition_sdk/config.py @@ -189,26 +189,7 @@ ) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD _ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] -======= -_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= -_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] -======= -_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] ->>>>>>> 6e8749e1 (Test) ->>>>>>> c1293812 (Test) -======= -_ServiceInterceptor = Union[Interceptor[AddMembersToGroupInput, AddMembersToGroupOutput, Any, Any], Interceptor[ApplicableVariantsInput, ApplicableVariantsOutput, Any, Any], Interceptor[BulkOperationInput, BulkOperationOutput, Any, Any], Interceptor[ConcludeExperimentInput, ConcludeExperimentOutput, Any, Any], Interceptor[CreateContextInput, CreateContextOutput, Any, Any], Interceptor[CreateDefaultConfigInput, CreateDefaultConfigOutput, Any, Any], Interceptor[CreateDimensionInput, CreateDimensionOutput, Any, Any], Interceptor[CreateExperimentInput, CreateExperimentOutput, Any, Any], Interceptor[CreateExperimentGroupInput, CreateExperimentGroupOutput, Any, Any], Interceptor[CreateFunctionInput, CreateFunctionOutput, Any, Any], Interceptor[CreateOrganisationInput, CreateOrganisationOutput, Any, Any], Interceptor[CreateSecretInput, CreateSecretOutput, Any, Any], Interceptor[CreateTypeTemplatesInput, CreateTypeTemplatesOutput, Any, Any], Interceptor[CreateVariableInput, CreateVariableOutput, Any, Any], Interceptor[CreateWebhookInput, CreateWebhookOutput, Any, Any], Interceptor[CreateWorkspaceInput, CreateWorkspaceOutput, Any, Any], Interceptor[DeleteContextInput, DeleteContextOutput, Any, Any], Interceptor[DeleteDefaultConfigInput, DeleteDefaultConfigOutput, Any, Any], Interceptor[DeleteDimensionInput, DeleteDimensionOutput, Any, Any], Interceptor[DeleteExperimentGroupInput, DeleteExperimentGroupOutput, Any, Any], Interceptor[DeleteFunctionInput, DeleteFunctionOutput, Any, Any], Interceptor[DeleteSecretInput, DeleteSecretOutput, Any, Any], Interceptor[DeleteTypeTemplatesInput, DeleteTypeTemplatesOutput, Any, Any], Interceptor[DeleteVariableInput, DeleteVariableOutput, Any, Any], Interceptor[DeleteWebhookInput, DeleteWebhookOutput, Any, Any], Interceptor[DiscardExperimentInput, DiscardExperimentOutput, Any, Any], Interceptor[GetConfigInput, GetConfigOutput, Any, Any], Interceptor[GetConfigJsonInput, GetConfigJsonOutput, Any, Any], Interceptor[GetConfigTomlInput, GetConfigTomlOutput, Any, Any], Interceptor[GetContextInput, GetContextOutput, Any, Any], Interceptor[GetContextFromConditionInput, GetContextFromConditionOutput, Any, Any], Interceptor[GetDefaultConfigInput, GetDefaultConfigOutput, Any, Any], Interceptor[GetDimensionInput, GetDimensionOutput, Any, Any], Interceptor[GetExperimentInput, GetExperimentOutput, Any, Any], Interceptor[GetExperimentConfigInput, GetExperimentConfigOutput, Any, Any], Interceptor[GetExperimentGroupInput, GetExperimentGroupOutput, Any, Any], Interceptor[GetFunctionInput, GetFunctionOutput, Any, Any], Interceptor[GetOrganisationInput, GetOrganisationOutput, Any, Any], Interceptor[GetResolvedConfigInput, GetResolvedConfigOutput, Any, Any], Interceptor[GetResolvedConfigWithIdentifierInput, GetResolvedConfigWithIdentifierOutput, Any, Any], Interceptor[GetSecretInput, GetSecretOutput, Any, Any], Interceptor[GetTypeTemplateInput, GetTypeTemplateOutput, Any, Any], Interceptor[GetTypeTemplatesListInput, GetTypeTemplatesListOutput, Any, Any], Interceptor[GetVariableInput, GetVariableOutput, Any, Any], Interceptor[GetVersionInput, GetVersionOutput, Any, Any], Interceptor[GetWebhookInput, GetWebhookOutput, Any, Any], Interceptor[GetWebhookByEventInput, GetWebhookByEventOutput, Any, Any], Interceptor[GetWorkspaceInput, GetWorkspaceOutput, Any, Any], Interceptor[ListAuditLogsInput, ListAuditLogsOutput, Any, Any], Interceptor[ListContextsInput, ListContextsOutput, Any, Any], Interceptor[ListDefaultConfigsInput, ListDefaultConfigsOutput, Any, Any], Interceptor[ListDimensionsInput, ListDimensionsOutput, Any, Any], Interceptor[ListExperimentInput, ListExperimentOutput, Any, Any], Interceptor[ListExperimentGroupsInput, ListExperimentGroupsOutput, Any, Any], Interceptor[ListFunctionInput, ListFunctionOutput, Any, Any], Interceptor[ListOrganisationInput, ListOrganisationOutput, Any, Any], Interceptor[ListSecretsInput, ListSecretsOutput, Any, Any], Interceptor[ListVariablesInput, ListVariablesOutput, Any, Any], Interceptor[ListVersionsInput, ListVersionsOutput, Any, Any], Interceptor[ListWebhookInput, ListWebhookOutput, Any, Any], Interceptor[ListWorkspaceInput, ListWorkspaceOutput, Any, Any], Interceptor[MigrateWorkspaceSchemaInput, MigrateWorkspaceSchemaOutput, Any, Any], Interceptor[MoveContextInput, MoveContextOutput, Any, Any], Interceptor[PauseExperimentInput, PauseExperimentOutput, Any, Any], Interceptor[PublishInput, PublishOutput, Any, Any], Interceptor[RampExperimentInput, RampExperimentOutput, Any, Any], Interceptor[RemoveMembersFromGroupInput, RemoveMembersFromGroupOutput, Any, Any], Interceptor[ResumeExperimentInput, ResumeExperimentOutput, Any, Any], Interceptor[RotateMasterEncryptionKeyInput, RotateMasterEncryptionKeyOutput, Any, Any], Interceptor[RotateWorkspaceEncryptionKeyInput, RotateWorkspaceEncryptionKeyOutput, Any, Any], Interceptor[TestInput, TestOutput, Any, Any], Interceptor[UpdateDefaultConfigInput, UpdateDefaultConfigOutput, Any, Any], Interceptor[UpdateDimensionInput, UpdateDimensionOutput, Any, Any], Interceptor[UpdateExperimentGroupInput, UpdateExperimentGroupOutput, Any, Any], Interceptor[UpdateFunctionInput, UpdateFunctionOutput, Any, Any], Interceptor[UpdateOrganisationInput, UpdateOrganisationOutput, Any, Any], Interceptor[UpdateOverrideInput, UpdateOverrideOutput, Any, Any], Interceptor[UpdateOverridesExperimentInput, UpdateOverridesExperimentOutput, Any, Any], Interceptor[UpdateSecretInput, UpdateSecretOutput, Any, Any], Interceptor[UpdateTypeTemplatesInput, UpdateTypeTemplatesOutput, Any, Any], Interceptor[UpdateVariableInput, UpdateVariableOutput, Any, Any], Interceptor[UpdateWebhookInput, UpdateWebhookOutput, Any, Any], Interceptor[UpdateWorkspaceInput, UpdateWorkspaceOutput, Any, Any], Interceptor[ValidateContextInput, ValidateContextOutput, Any, Any], Interceptor[WeightRecomputeInput, WeightRecomputeOutput, Any, Any]] ->>>>>>> 45a3cd01 (reabse fix) @dataclass(init=False) class Config: """Configuration for Superposition.""" diff --git a/clients/python/sdk/superposition_sdk/deserialize.py b/clients/python/sdk/superposition_sdk/deserialize.py index cb1f810be..e3166812f 100644 --- a/clients/python/sdk/superposition_sdk/deserialize.py +++ b/clients/python/sdk/superposition_sdk/deserialize.py @@ -1538,14 +1538,6 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf body_kwargs = ListExperimentOutput.deserialize_kwargs(deserializer) kwargs.update(body_kwargs) -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) for fld in http_response.fields: for key, value in fld.as_tuples(): _key_lowercase = key.lower() @@ -1556,13 +1548,6 @@ async def _deserialize_list_experiment(http_response: HTTPResponse, config: Conf case _: pass -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) return ListExperimentOutput(**kwargs) async def _deserialize_error_list_experiment(http_response: HTTPResponse, config: Config) -> ApiError: diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py index 6a432ecb7..abff3d688 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -9806,18 +9806,9 @@ class GetExperimentConfigInput: :param context: Map representing the context. Keys correspond to the names of the dimensions. -<<<<<<< HEAD -<<<<<<< HEAD :param dimension_match_strategy: Strategy to follow while filter items based on the context -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - :param dimension_match_strategy: - Strategy to follow while filter items based on the context - ->>>>>>> 0dd5da56 (fix: some fixes) """ workspace_id: str | None = None @@ -9825,14 +9816,7 @@ class GetExperimentConfigInput: if_modified_since: datetime | None = None prefix: list[str] | None = None context: dict[str, Document] | None = None -<<<<<<< HEAD -<<<<<<< HEAD dimension_match_strategy: str | None = None -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - dimension_match_strategy: str | None = None ->>>>>>> 0dd5da56 (fix: some fixes) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT, self) @@ -9866,18 +9850,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 4: kwargs["context"] = _deserialize_context_map(de, _SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["context"]) -<<<<<<< HEAD -<<<<<<< HEAD case 5: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["dimension_match_strategy"]) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - case 5: - kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_GET_EXPERIMENT_CONFIG_INPUT.members["dimension_match_strategy"]) - ->>>>>>> 0dd5da56 (fix: some fixes) case _: logger.debug("Unexpected member schema: %s", schema) @@ -10190,36 +10165,12 @@ class ListExperimentGroupsInput: :param group_type: Filter by the type of group (USER_CREATED or SYSTEM_GENERATED). -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) :param dimension_match_strategy: Strategy to follow while filter items based on the context :param context: Map representing the context. Keys correspond to the names of the dimensions. -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) """ count: int | None = None @@ -10234,30 +10185,8 @@ class ListExperimentGroupsInput: sort_on: str | None = None sort_by: str | None = None group_type: list[str] | None = None -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) - dimension_match_strategy: str | None = None - context: dict[str, Document] | None = None -======= -<<<<<<< HEAD -======= - dimension_match_strategy: str | None = None - context: dict[str, Document] | None = None ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= dimension_match_strategy: str | None = None context: dict[str, Document] | None = None ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT, self) @@ -10312,27 +10241,12 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 11: kwargs["group_type"] = _deserialize_group_type_list(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["group_type"]) -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case 12: kwargs["dimension_match_strategy"] = de.read_string(_SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["dimension_match_strategy"]) case 13: kwargs["context"] = _deserialize_context_map(de, _SCHEMA_LIST_EXPERIMENT_GROUPS_INPUT.members["context"]) -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case _: logger.debug("Unexpected member schema: %s", schema) @@ -11174,30 +11088,8 @@ class ListExperimentOutput: data: list[ExperimentResponse] -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) last_modified: datetime -======= -<<<<<<< HEAD -======= - last_modified: datetime - ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - last_modified: datetime - ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) def serialize(self, serializer: ShapeSerializer): serializer.write_struct(_SCHEMA_LIST_EXPERIMENT_OUTPUT, self) @@ -11225,24 +11117,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: case 2: kwargs["data"] = _deserialize_experiment_list(de, _SCHEMA_LIST_EXPERIMENT_OUTPUT.members["data"]) -<<<<<<< HEAD -<<<<<<< HEAD - case 3: - kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) - -======= -<<<<<<< HEAD -======= - case 3: - kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) - ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= case 3: kwargs["last_modified"] = de.read_timestamp(_SCHEMA_LIST_EXPERIMENT_OUTPUT.members["last_modified"]) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) case _: logger.debug("Unexpected member schema: %s", schema) diff --git a/clients/python/sdk/superposition_sdk/serialize.py b/clients/python/sdk/superposition_sdk/serialize.py index a2f9a43e9..d5a515a25 100644 --- a/clients/python/sdk/superposition_sdk/serialize.py +++ b/clients/python/sdk/superposition_sdk/serialize.py @@ -1055,35 +1055,8 @@ async def _serialize_get_config(input: GetConfigInput, config: Config) -> HTTPRe headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) -<<<<<<< HEAD -<<<<<<< HEAD if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD -======= - if input.if_modified_since is not None: - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - if input.if_modified_since is not None: - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) return _HTTPRequest( destination=_URI( host="", @@ -1325,16 +1298,8 @@ async def _serialize_get_experiment_config(input: GetExperimentConfigInput, conf query_params: list[tuple[str, str | None]] = [] if input.prefix is not None: query_params.extend(("prefix", e) for e in input.prefix) -<<<<<<< HEAD -<<<<<<< HEAD if input.dimension_match_strategy is not None: query_params.append(("dimension_match_strategy", input.dimension_match_strategy)) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - if input.dimension_match_strategy is not None: - query_params.append(("dimension_match_strategy", input.dimension_match_strategy)) ->>>>>>> 0dd5da56 (fix: some fixes) query = join_query_params(params=query_params, prefix=query) @@ -2063,35 +2028,8 @@ async def _serialize_list_experiment(input: ListExperimentInput, config: Config) headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) -<<<<<<< HEAD -<<<<<<< HEAD - if input.if_modified_since is not None: - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD -======= if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - if input.if_modified_since is not None: - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) return _HTTPRequest( destination=_URI( host="", @@ -2152,35 +2090,8 @@ async def _serialize_list_experiment_groups(input: ListExperimentGroupsInput, co headers.extend(Fields([Field(name="x-workspace", values=[input.workspace_id])])) if input.org_id: headers.extend(Fields([Field(name="x-org-id", values=[input.org_id])])) -<<<<<<< HEAD -<<<<<<< HEAD - if input.if_modified_since is not None: - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD -======= - if input.if_modified_since is not None: - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= if input.if_modified_since is not None: headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - headers.extend(Fields([Field(name="If-Modified-Since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - headers.extend(Fields([Field(name="if-modified-since", values=[serialize_rfc3339(ensure_utc(input.if_modified_since))])])) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) return _HTTPRequest( destination=_URI( host="", diff --git a/crates/context_aware_config/src/helpers.rs b/crates/context_aware_config/src/helpers.rs index 981c55abe..38072c4bf 100644 --- a/crates/context_aware_config/src/helpers.rs +++ b/crates/context_aware_config/src/helpers.rs @@ -6,11 +6,14 @@ use actix_web::{ }; use chrono::Utc; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper}; -use fred::{interfaces::KeysInterface, types::Expiration}; +use fred::types::Expiration; use serde_json::{Map, Value, json}; use service_utils::{ helpers::get_from_env_or_default, - redis::{CONFIG_KEY_SUFFIX, CONFIG_VERSION_KEY_SUFFIX, LAST_MODIFIED_KEY_SUFFIX}, + redis::{ + CONFIG_KEY_SUFFIX, CONFIG_VERSION_KEY_SUFFIX, LAST_MODIFIED_KEY_SUFFIX, + redis_set_data, + }, }; use service_utils::{ helpers::{fetch_dimensions_info_map, generate_snowflake_id}, @@ -250,45 +253,24 @@ pub async fn put_config_in_redis( let last_modified_at_key = format!("{}{LAST_MODIFIED_KEY_SUFFIX}", **schema_name); let config_version_key = format!("{}{CONFIG_VERSION_KEY_SUFFIX}", **schema_name); - redis_pool - .set::<(), String, String>( - config_key, - parsed_config, - expiration.clone(), - None, - false, - ) - .await - .map_err(|e| { - log::warn!("failed to set config in redis: {}", e); - unexpected_error!("failed to set config in redis") - })?; - redis_pool - .set::<(), String, String>( - last_modified_at_key, - config_version.created_at.to_rfc2822(), - expiration.clone(), - None, - false, - ) - .await - .map_err(|e| { - log::warn!("failed to set last_modified_key in redis: {}", e); - unexpected_error!("failed to set last_modified_key in redis") - })?; - redis_pool - .set::<(), String, i64>( - config_version_key, - config_version.id, - expiration, - None, - false, - ) - .await - .map_err(|e| { - log::warn!("failed to set config_version_key in redis: {}", e); - unexpected_error!("failed to set config_version_key in redis") - })?; + redis_set_data(redis_pool, config_key, parsed_config, expiration.clone()).await?; + + redis_set_data( + redis_pool, + last_modified_at_key, + config_version.created_at.to_rfc2822(), + expiration.clone(), + ) + .await?; + + redis_set_data( + redis_pool, + config_version_key, + config_version.id, + expiration, + ) + .await?; + Ok(()) } diff --git a/crates/experimentation_platform/Cargo.toml b/crates/experimentation_platform/Cargo.toml index d17a87e02..1138b8306 100644 --- a/crates/experimentation_platform/Cargo.toml +++ b/crates/experimentation_platform/Cargo.toml @@ -17,7 +17,6 @@ chrono = { workspace = true } diesel = { workspace = true } experimentation_client = { path = "../experimentation_client" } fred = { workspace = true, features = ["metrics"] } -futures = { workspace = true } inventory = { workspace = true } log = { workspace = true } reqwest = { workspace = true } diff --git a/crates/experimentation_platform/src/api/experiment_config/handlers.rs b/crates/experimentation_platform/src/api/experiment_config/handlers.rs index 500371bf5..8e72fe694 100644 --- a/crates/experimentation_platform/src/api/experiment_config/handlers.rs +++ b/crates/experimentation_platform/src/api/experiment_config/handlers.rs @@ -6,7 +6,6 @@ use actix_web::{ }; use chrono::{DateTime, Utc}; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; -use futures::join; use service_utils::{ db::run_query, helpers::is_not_modified, @@ -158,6 +157,7 @@ fn get_experiment_config_db( workspace_context: &WorkspaceContext, ) -> superposition::DieselResult { let filters = filters.into_inner(); + let dimension_match_strategy = filters.dimension_match_strategy.unwrap_or_default(); let exp_list = { let mut experiment_list: Vec = experiments::experiments @@ -174,7 +174,7 @@ fn get_experiment_config_db( } if !dimension_params.is_empty() { - let filter_fn = match filters.dimension_match_strategy.unwrap_or_default() { + let filter_fn = match dimension_match_strategy { DimensionMatchStrategy::Exact => Experiment::get_satisfied, DimensionMatchStrategy::Subset => Experiment::filter_by_eval, }; @@ -194,7 +194,7 @@ fn get_experiment_config_db( .load::(conn)?; if !dimension_params.is_empty() { - let filter_fn = match filters.dimension_match_strategy.unwrap_or_default() { + let filter_fn = match dimension_match_strategy { DimensionMatchStrategy::Exact => ExperimentGroup::get_satisfied, DimensionMatchStrategy::Subset => ExperimentGroup::filter_by_eval, }; diff --git a/crates/experimentation_platform/src/api/experiment_groups/helpers.rs b/crates/experimentation_platform/src/api/experiment_groups/helpers.rs index 81eb04336..eff634d79 100644 --- a/crates/experimentation_platform/src/api/experiment_groups/helpers.rs +++ b/crates/experimentation_platform/src/api/experiment_groups/helpers.rs @@ -5,16 +5,14 @@ use chrono::{DateTime, Utc}; use diesel::{ BoolExpressionMethods, ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper, }; -use fred::{ - prelude::{KeysInterface, RedisPool}, - types::Expiration, -}; +use fred::{prelude::RedisPool, types::Expiration}; use serde_json::Value; use service_utils::{ helpers::{generate_snowflake_id, get_from_env_or_default}, redis::{ EXPERIMENT_CONFIG_LAST_MODIFIED_KEY_SUFFIX, EXPERIMENT_GROUPS_LAST_MODIFIED_KEY_SUFFIX, EXPERIMENT_GROUPS_LIST_KEY_SUFFIX, + redis_set_data, }, service::types::{AppState, SchemaName, WorkspaceContext}, }; @@ -506,41 +504,23 @@ pub async fn put_experiment_groups_in_redis( let key_ttl: i64 = get_from_env_or_default("REDIS_KEY_TTL", 604800); let expiration = Some(Expiration::EX(key_ttl)); - pool.set::<(), String, String>( + redis_set_data( + pool, config_modified_at_key, last_modified.clone(), expiration.clone(), - None, - false, ) - .await - .map_err(|e| { - log::warn!( - "failed to set experiment config last_modified_key in redis: {}", - e - ); - unexpected_error!("failed to set experiment config last_modified_key in redis") - })?; + .await?; - pool.set::<(), String, String>( + redis_set_data( + pool, last_modified_at_key, last_modified, expiration.clone(), - None, - false, ) - .await - .map_err(|e| { - log::warn!("failed to set experiment last_modified_key in redis: {}", e); - unexpected_error!("failed to set experiment last_modified_key in redis") - })?; + .await?; - pool.set::<(), String, String>(key, serialized, expiration, None, false) - .await - .map_err(|e| { - log::warn!("Failed to write experiment groups to redis: {}", e); - unexpected_error!("Failed to write experiment groups to redis: {}", e) - })?; + redis_set_data(pool, key, serialized, expiration).await?; log::debug!("Successfully updated experiment groups cache in Redis"); Ok(()) diff --git a/crates/experimentation_platform/src/api/experiments/helpers.rs b/crates/experimentation_platform/src/api/experiments/helpers.rs index fd418077a..a3e52eee3 100644 --- a/crates/experimentation_platform/src/api/experiments/helpers.rs +++ b/crates/experimentation_platform/src/api/experiments/helpers.rs @@ -9,16 +9,13 @@ use diesel::{ pg::PgConnection, r2d2::{ConnectionManager, PooledConnection}, }; -use fred::{ - prelude::{KeysInterface, RedisPool}, - types::Expiration, -}; +use fred::{prelude::RedisPool, types::Expiration}; use serde_json::{Map, Value}; use service_utils::{ helpers::get_from_env_or_default, redis::{ EXPERIMENT_CONFIG_LAST_MODIFIED_KEY_SUFFIX, EXPERIMENTS_LAST_MODIFIED_KEY_SUFFIX, - EXPERIMENTS_LIST_KEY_SUFFIX, + EXPERIMENTS_LIST_KEY_SUFFIX, redis_set_data, }, service::types::{AppState, ExperimentationFlags, SchemaName, WorkspaceContext}, }; @@ -858,40 +855,23 @@ pub async fn put_experiments_in_redis( let key_ttl: i64 = get_from_env_or_default("REDIS_KEY_TTL", 604800); let expiration = Some(Expiration::EX(key_ttl)); - pool.set::<(), String, String>( + redis_set_data( + pool, config_modified_at_key, last_modified.clone(), expiration.clone(), - None, - false, ) - .await - .map_err(|e| { - log::warn!( - "failed to set experiment config last_modified_key in redis: {}", - e - ); - unexpected_error!("failed to set experiment config last_modified_key in redis") - })?; + .await?; - pool.set::<(), String, String>( + redis_set_data( + pool, last_modified_at_key, last_modified, expiration.clone(), - None, - false, ) - .await - .map_err(|e| { - log::warn!("failed to set experiment last_modified_key in redis: {}", e); - unexpected_error!("failed to set experiment last_modified_key in redis") - })?; - pool.set::<(), String, String>(key, serialized, expiration, None, false) - .await - .map_err(|e| { - log::warn!("Failed to write experiments to redis: {}", e); - unexpected_error!("Failed to write experiments to redis: {}", e) - })?; + .await?; + + redis_set_data(pool, key, serialized, expiration).await?; log::debug!("Successfully updated experiments cache in Redis"); Ok(()) diff --git a/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql b/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql index 0b99c3ca7..83720a3d0 100644 --- a/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql +++ b/crates/service_utils/src/middlewares/auth_z/casbin/casbin.sql @@ -96,10 +96,6 @@ VALUES ('g3', 'experiment_config:get', 'read', '', '', '', ''), ('p', 'experiment_config_reader', '*', 'experiment_config', 'read', '*', '') - -- experiment_config - ('g3', 'experiment_config:get', 'read', '', '', '', ''), - ('p', 'experiment_config_reader', '*', 'experiment_config', 'read', '*', '') - -- TODO: Figure out what to do about Auth and Organisation resources, which don't fit neatly into the "workspace" schema. For now, we can use a wildcard schema ("*") for these resources in the policy rules, but this is something we may want to revisit for more fine-grained control in the future. ON CONFLICT (ptype, v0, v1, v2, v3, v4, v5) DO NOTHING; diff --git a/crates/service_utils/src/redis.rs b/crates/service_utils/src/redis.rs index af479866f..590dfefef 100644 --- a/crates/service_utils/src/redis.rs +++ b/crates/service_utils/src/redis.rs @@ -1,8 +1,9 @@ use fred::{ prelude::{KeysInterface, RedisClient, RedisPool}, - types::Expiration, + types::{Expiration, RedisValue}, }; use serde::{Serialize, de::DeserializeOwned}; +use superposition_macros::unexpected_error; use superposition_types::{DBConnection, result as superposition}; use crate::{ @@ -114,3 +115,18 @@ where })?; Ok(value) } + +pub async fn redis_set_data>( + pool: &RedisPool, + key_name: String, + value: T, + expiration: Option, +) -> superposition::Result<()> { + let key = key_name.clone(); + pool.set::<(), String, T>(key_name, value, expiration, None, false) + .await + .map_err(|e| { + log::warn!("Failed to set {} in redis: {}", key, e); + unexpected_error!("failed to set {} in redis", key) + }) +} diff --git a/crates/superposition_core/src/ffi.rs b/crates/superposition_core/src/ffi.rs index 44860b5f9..7e15661cb 100644 --- a/crates/superposition_core/src/ffi.rs +++ b/crates/superposition_core/src/ffi.rs @@ -308,8 +308,7 @@ impl ProviderCache { &_q, targeting_key.as_deref().unwrap_or(""), filter_prefixes.clone(), - ) - .map_err(OperationError::Unexpected)?; + ); _q.insert("variantIds".to_string(), variants.into()); } diff --git a/crates/superposition_provider/examples/local_file_watch_example.rs b/crates/superposition_provider/examples/local_file_watch_example.rs index deaa91ebd..985dfefeb 100644 --- a/crates/superposition_provider/examples/local_file_watch_example.rs +++ b/crates/superposition_provider/examples/local_file_watch_example.rs @@ -23,7 +23,7 @@ async fn main() { None, RefreshStrategy::Watch(WatchStrategy::default()), ); - provider.init().await.unwrap(); + provider.init(EvaluationContext::default()).await.unwrap(); let context = EvaluationContext::default() .with_custom_field("os", "linux") @@ -31,7 +31,10 @@ async fn main() { // Poll in a loop to show updated values after file changes loop { - let config = provider.resolve_all_features(&context).await.unwrap(); + let config = provider + .resolve_all_features(context.clone()) + .await + .unwrap(); println!("Config: {:?}", config); tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; } diff --git a/crates/superposition_provider/examples/local_http_example.rs b/crates/superposition_provider/examples/local_http_example.rs index a28db8c54..db4743cd6 100644 --- a/crates/superposition_provider/examples/local_http_example.rs +++ b/crates/superposition_provider/examples/local_http_example.rs @@ -25,16 +25,19 @@ async fn main() { timeout: Some(10), }), ); - provider.init().await.unwrap(); + provider.init(EvaluationContext::default()).await.unwrap(); let context = EvaluationContext::default() .with_targeting_key("user-1234") .with_custom_field("dimension", "d2"); - let all_config = provider.resolve_all_features(&context).await.unwrap(); + let all_config = provider + .resolve_all_features(context.clone()) + .await + .unwrap(); println!("All config: {:?}", all_config); - let variants = provider.get_applicable_variants(&context).await.unwrap(); + let variants = provider.get_applicable_variants(context).await.unwrap(); println!("Variants: {:?}", variants); provider.close().await.unwrap(); diff --git a/crates/superposition_sdk/src/client/get_experiment_config.rs b/crates/superposition_sdk/src/client/get_experiment_config.rs index cf4494f59..ff5d4d793 100644 --- a/crates/superposition_sdk/src/client/get_experiment_config.rs +++ b/crates/superposition_sdk/src/client/get_experiment_config.rs @@ -8,14 +8,7 @@ impl super::Client { /// - [`if_modified_since(DateTime)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::if_modified_since) / [`set_if_modified_since(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_if_modified_since):
required: **false**
While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.
/// - [`prefix(impl Into)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::prefix) / [`set_prefix(Option>)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_prefix):
required: **false**
(undocumented)
/// - [`context(impl Into, Document)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::context) / [`set_context(Option>)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
-<<<<<<< HEAD -<<<<<<< HEAD /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
-======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::get_experiment_config::builders::GetExperimentConfigFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
->>>>>>> 0dd5da56 (fix: some fixes) /// - On success, responds with [`GetExperimentConfigOutput`](crate::operation::get_experiment_config::GetExperimentConfigOutput) with field(s): /// - [`last_modified(DateTime)`](crate::operation::get_experiment_config::GetExperimentConfigOutput::last_modified): (undocumented) /// - [`experiments(Vec::)`](crate::operation::get_experiment_config::GetExperimentConfigOutput::experiments): (undocumented) diff --git a/crates/superposition_sdk/src/client/list_experiment.rs b/crates/superposition_sdk/src/client/list_experiment.rs index ac0a28a87..e225f5cf8 100644 --- a/crates/superposition_sdk/src/client/list_experiment.rs +++ b/crates/superposition_sdk/src/client/list_experiment.rs @@ -26,38 +26,7 @@ impl super::Client { /// - [`total_pages(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_pages): (undocumented) /// - [`total_items(i32)`](crate::operation::list_experiment::ListExperimentOutput::total_items): (undocumented) /// - [`data(Vec::)`](crate::operation::list_experiment::ListExperimentOutput::data): (undocumented) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) -======= -<<<<<<< HEAD -======= - /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) -======= - /// - [`last_modified_at(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified_at): (undocumented) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - /// - [`last_modified(DateTime)`](crate::operation::list_experiment::ListExperimentOutput::last_modified): (undocumented) ->>>>>>> 45a3cd01 (reabse fix) /// - On failure, responds with [`SdkError`](crate::operation::list_experiment::ListExperimentError) pub fn list_experiment(&self) -> crate::operation::list_experiment::builders::ListExperimentFluentBuilder { crate::operation::list_experiment::builders::ListExperimentFluentBuilder::new(self.handle.clone()) diff --git a/crates/superposition_sdk/src/client/list_experiment_groups.rs b/crates/superposition_sdk/src/client/list_experiment_groups.rs index 01afba9b9..7b9010458 100644 --- a/crates/superposition_sdk/src/client/list_experiment_groups.rs +++ b/crates/superposition_sdk/src/client/list_experiment_groups.rs @@ -15,30 +15,8 @@ impl super::Client { /// - [`sort_on(ExperimentGroupSortOn)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::sort_on) / [`set_sort_on(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_sort_on):
required: **false**
Field to sort the results by.
/// - [`sort_by(SortBy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::sort_by) / [`set_sort_by(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_sort_by):
required: **false**
Sort order (ascending or descending).
/// - [`group_type(GroupType)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::group_type) / [`set_group_type(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_group_type):
required: **false**
Filter by the type of group (USER_CREATED or SYSTEM_GENERATED).
-<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
/// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
-======= -<<<<<<< HEAD -======= - /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
- /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - /// - [`dimension_match_strategy(DimensionMatchStrategy)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::dimension_match_strategy) / [`set_dimension_match_strategy(Option)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_dimension_match_strategy):
required: **false**
Strategy to follow while filter items based on the context
- /// - [`context(impl Into, Document)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::context) / [`set_context(Option>)`](crate::operation::list_experiment_groups::builders::ListExperimentGroupsFluentBuilder::set_context):
required: **false**
Map representing the context. Keys correspond to the names of the dimensions.
->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// - On success, responds with [`ListExperimentGroupsOutput`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput) with field(s): /// - [`total_pages(i32)`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput::total_pages): (undocumented) /// - [`total_items(i32)`](crate::operation::list_experiment_groups::ListExperimentGroupsOutput::total_items): (undocumented) diff --git a/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs b/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs index 947bd0f67..54620380e 100644 --- a/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs +++ b/crates/superposition_sdk/src/operation/get_experiment_config/_get_experiment_config_input.rs @@ -13,16 +13,8 @@ pub struct GetExperimentConfigInput { pub prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, -<<<<<<< HEAD -<<<<<<< HEAD /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= - /// Strategy to follow while filter items based on the context - pub dimension_match_strategy: ::std::option::Option, ->>>>>>> 0dd5da56 (fix: some fixes) } impl GetExperimentConfigInput { #[allow(missing_docs)] // documentation missing in model @@ -48,19 +40,10 @@ impl GetExperimentConfigInput { pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() } -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) } impl GetExperimentConfigInput { /// Creates a new builder-style object to manufacture [`GetExperimentConfigInput`](crate::operation::get_experiment_config::GetExperimentConfigInput). @@ -78,14 +61,7 @@ pub struct GetExperimentConfigInputBuilder { pub(crate) if_modified_since: ::std::option::Option<::aws_smithy_types::DateTime>, pub(crate) prefix: ::std::option::Option<::std::vec::Vec::<::std::string::String>>, pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, -<<<<<<< HEAD -<<<<<<< HEAD - pub(crate) dimension_match_strategy: ::std::option::Option, -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= pub(crate) dimension_match_strategy: ::std::option::Option, ->>>>>>> 0dd5da56 (fix: some fixes) } impl GetExperimentConfigInputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -166,10 +142,6 @@ impl GetExperimentConfigInputBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { &self.context } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -183,11 +155,6 @@ impl GetExperimentConfigInputBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { &self.dimension_match_strategy } -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) /// Consumes the builder and constructs a [`GetExperimentConfigInput`](crate::operation::get_experiment_config::GetExperimentConfigInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -202,16 +169,8 @@ impl GetExperimentConfigInputBuilder { , context: self.context , -<<<<<<< HEAD -<<<<<<< HEAD - dimension_match_strategy: self.dimension_match_strategy - , -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= dimension_match_strategy: self.dimension_match_strategy , ->>>>>>> 0dd5da56 (fix: some fixes) } ) } diff --git a/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs b/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs index b69a020a1..522d273ef 100644 --- a/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs +++ b/crates/superposition_sdk/src/operation/get_experiment_config/builders.rs @@ -176,10 +176,6 @@ impl GetExperimentConfigFluentBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.inner.get_context() } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -194,10 +190,5 @@ impl GetExperimentConfigFluentBuilder { pub fn get_dimension_match_strategy(&self) -> &::std::option::Option { self.inner.get_dimension_match_strategy() } -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) } diff --git a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs index 492880b2e..cce48692d 100644 --- a/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs +++ b/crates/superposition_sdk/src/operation/list_experiment/_list_experiment_output.rs @@ -9,35 +9,8 @@ pub struct ListExperimentOutput { pub total_items: i32, #[allow(missing_docs)] // documentation missing in model pub data: ::std::vec::Vec::, -<<<<<<< HEAD -<<<<<<< HEAD #[allow(missing_docs)] // documentation missing in model pub last_modified: ::aws_smithy_types::DateTime, -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD -======= - #[allow(missing_docs)] // documentation missing in model - pub last_modified: ::aws_smithy_types::DateTime, ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - #[allow(missing_docs)] // documentation missing in model - pub last_modified: ::aws_smithy_types::DateTime, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= - pub last_modified_at: ::aws_smithy_types::DateTime, ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - pub last_modified: ::aws_smithy_types::DateTime, ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) } impl ListExperimentOutput { #[allow(missing_docs)] // documentation missing in model @@ -52,25 +25,10 @@ impl ListExperimentOutput { pub fn data(&self) -> &[crate::types::ExperimentResponse] { use std::ops::Deref; self.data.deref() } -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model pub fn last_modified(&self) -> &::aws_smithy_types::DateTime { &self.last_modified } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentOutput { /// Creates a new builder-style object to manufacture [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput). @@ -86,38 +44,7 @@ pub struct ListExperimentOutputBuilder { pub(crate) total_pages: ::std::option::Option, pub(crate) total_items: ::std::option::Option, pub(crate) data: ::std::option::Option<::std::vec::Vec::>, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, -======= -<<<<<<< HEAD -======= - pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, -======= - pub(crate) last_modified_at: ::std::option::Option<::aws_smithy_types::DateTime>, ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= - pub(crate) last_modified: ::std::option::Option<::aws_smithy_types::DateTime>, ->>>>>>> 45a3cd01 (reabse fix) } impl ListExperimentOutputBuilder { #[allow(missing_docs)] // documentation missing in model @@ -166,14 +93,6 @@ impl ListExperimentOutputBuilder { pub fn get_data(&self) -> &::std::option::Option<::std::vec::Vec::> { &self.data } -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) #[allow(missing_docs)] // documentation missing in model /// This field is required. pub fn last_modified(mut self, input: ::aws_smithy_types::DateTime) -> Self { @@ -188,50 +107,12 @@ impl ListExperimentOutputBuilder { pub fn get_last_modified(&self) -> &::std::option::Option<::aws_smithy_types::DateTime> { &self.last_modified } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Consumes the builder and constructs a [`ListExperimentOutput`](crate::operation::list_experiment::ListExperimentOutput). /// This method will fail if any of the following fields are not set: /// - [`total_pages`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::total_pages) /// - [`total_items`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::total_items) /// - [`data`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::data) -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) -======= -<<<<<<< HEAD -======= - /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) - /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) -======= - /// - [`last_modified_at`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified_at) ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= - /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= /// - [`last_modified`](crate::operation::list_experiment::builders::ListExperimentOutputBuilder::last_modified) ->>>>>>> 45a3cd01 (reabse fix) pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( crate::operation::list_experiment::ListExperimentOutput { @@ -250,35 +131,11 @@ impl ListExperimentOutputBuilder { ::aws_smithy_types::error::operation::BuildError::missing_field("data", "data was not specified but it is required when building ListExperimentOutput") )? , -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) last_modified: self.last_modified .ok_or_else(|| ::aws_smithy_types::error::operation::BuildError::missing_field("last_modified", "last_modified was not specified but it is required when building ListExperimentOutput") )? , -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } ) } diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs index 70cc7f4da..bc426b206 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/_list_experiment_groups_input.rs @@ -27,34 +27,10 @@ pub struct ListExperimentGroupsInput { pub sort_by: ::std::option::Option, /// Filter by the type of group (USER_CREATED or SYSTEM_GENERATED). pub group_type: ::std::option::Option<::std::vec::Vec::>, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub dimension_match_strategy: ::std::option::Option, /// Map representing the context. Keys correspond to the names of the dimensions. pub context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentGroupsInput { /// Number of items to be returned in each page. @@ -108,25 +84,6 @@ impl ListExperimentGroupsInput { self.group_type.as_deref() .unwrap_or_default() } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= -======= ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(&self) -> ::std::option::Option<&crate::types::DimensionMatchStrategy> { self.dimension_match_strategy.as_ref() @@ -135,13 +92,6 @@ impl ListExperimentGroupsInput { pub fn context(&self) -> ::std::option::Option<&::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.context.as_ref() } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentGroupsInput { /// Creates a new builder-style object to manufacture [`ListExperimentGroupsInput`](crate::operation::list_experiment_groups::ListExperimentGroupsInput). @@ -166,30 +116,8 @@ pub struct ListExperimentGroupsInputBuilder { pub(crate) sort_on: ::std::option::Option, pub(crate) sort_by: ::std::option::Option, pub(crate) group_type: ::std::option::Option<::std::vec::Vec::>, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) pub(crate) dimension_match_strategy: ::std::option::Option, pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, -======= -<<<<<<< HEAD -======= - pub(crate) dimension_match_strategy: ::std::option::Option, - pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= - pub(crate) dimension_match_strategy: ::std::option::Option, - pub(crate) context: ::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>>, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } impl ListExperimentGroupsInputBuilder { /// Number of items to be returned in each page. @@ -356,25 +284,6 @@ impl ListExperimentGroupsInputBuilder { pub fn get_group_type(&self) -> &::std::option::Option<::std::vec::Vec::> { &self.group_type } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= -======= ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.dimension_match_strategy = ::std::option::Option::Some(input); @@ -407,13 +316,6 @@ impl ListExperimentGroupsInputBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { &self.context } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) /// Consumes the builder and constructs a [`ListExperimentGroupsInput`](crate::operation::list_experiment_groups::ListExperimentGroupsInput). pub fn build(self) -> ::std::result::Result { ::std::result::Result::Ok( @@ -442,34 +344,10 @@ impl ListExperimentGroupsInputBuilder { , group_type: self.group_type , -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) dimension_match_strategy: self.dimension_match_strategy , context: self.context , -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } ) } diff --git a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs index 97f3decdd..820a00e2a 100644 --- a/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs +++ b/crates/superposition_sdk/src/operation/list_experiment_groups/builders.rs @@ -269,25 +269,6 @@ impl ListExperimentGroupsFluentBuilder { pub fn get_group_type(&self) -> &::std::option::Option<::std::vec::Vec::> { self.inner.get_group_type() } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= -======= ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) /// Strategy to follow while filter items based on the context pub fn dimension_match_strategy(mut self, input: crate::types::DimensionMatchStrategy) -> Self { self.inner = self.inner.dimension_match_strategy(input); @@ -321,12 +302,5 @@ impl ListExperimentGroupsFluentBuilder { pub fn get_context(&self) -> &::std::option::Option<::std::collections::HashMap::<::std::string::String, ::aws_smithy_types::Document>> { self.inner.get_context() } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs index 174f473e4..409ac9055 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_get_config.rs @@ -77,14 +77,6 @@ pub fn ser_get_config_headers( })?; builder = builder.header("x-org-id", header_value); } -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -97,13 +89,6 @@ pub fn ser_get_config_headers( })?; builder = builder.header("if-modified-since", header_value); } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Ok(builder) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs index 073bfa30d..43cd98cca 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment.rs @@ -37,34 +37,10 @@ pub fn de_list_experiment_http_response(_response_status: u16, _response_headers #[allow(unused_mut)] let mut output = crate::operation::list_experiment::builders::ListExperimentOutputBuilder::default(); output = crate::protocol_serde::shape_list_experiment::de_list_experiment(_response_body, output).map_err(crate::operation::list_experiment::ListExperimentError::unhandled)?; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) output = output.set_last_modified( crate::protocol_serde::shape_list_experiment_output::de_last_modified_header(_response_headers) .map_err(|_|crate::operation::list_experiment::ListExperimentError::unhandled("Failed to parse last_modified from header `last-modified"))? ); -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) crate::serde_util::list_experiment_output_output_correct_errors(output).build().map_err(crate::operation::list_experiment::ListExperimentError::unhandled)? }) } @@ -97,14 +73,6 @@ pub fn ser_list_experiment_headers( })?; builder = builder.header("x-org-id", header_value); } -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -117,13 +85,6 @@ pub fn ser_list_experiment_headers( })?; builder = builder.header("if-modified-since", header_value); } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Ok(builder) } diff --git a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs index 99e7ab0b6..0ec5ea3a9 100644 --- a/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs +++ b/crates/superposition_sdk/src/protocol_serde/shape_list_experiment_groups.rs @@ -73,14 +73,6 @@ pub fn ser_list_experiment_groups_headers( })?; builder = builder.header("x-org-id", header_value); } -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) if let ::std::option::Option::Some(inner_5) = &input.if_modified_since { let formatted_6 = inner_5.fmt(::aws_smithy_types::date_time::Format::DateTime)?; let header_value = formatted_6; @@ -93,13 +85,6 @@ pub fn ser_list_experiment_groups_headers( })?; builder = builder.header("if-modified-since", header_value); } -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) Ok(builder) } diff --git a/crates/superposition_sdk/src/serde_util.rs b/crates/superposition_sdk/src/serde_util.rs index 9a9090bb8..f711352cc 100644 --- a/crates/superposition_sdk/src/serde_util.rs +++ b/crates/superposition_sdk/src/serde_util.rs @@ -591,38 +591,7 @@ pub(crate) fn list_experiment_output_output_correct_errors(mut builder: crate::o if builder.total_pages.is_none() { builder.total_pages = Some(Default::default()) } if builder.total_items.is_none() { builder.total_items = Some(Default::default()) } if builder.data.is_none() { builder.data = Some(Default::default()) } -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } -======= -<<<<<<< HEAD -======= -if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= -if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) -if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } -======= -if builder.last_modified_at.is_none() { builder.last_modified_at = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= -if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= -if builder.last_modified.is_none() { builder.last_modified = Some(::aws_smithy_types::DateTime::from_fractional_secs(0, 0_f64)) } ->>>>>>> 45a3cd01 (reabse fix) builder } diff --git a/crates/superposition_sdk/src/types.rs b/crates/superposition_sdk/src/types.rs index f4bd03e3c..95dec09cf 100644 --- a/crates/superposition_sdk/src/types.rs +++ b/crates/superposition_sdk/src/types.rs @@ -15,20 +15,6 @@ pub use crate::types::_group_type::GroupType; pub use crate::types::_bucket::Bucket; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_experiment_response::ExperimentResponse; pub use crate::types::_variant::Variant; @@ -40,16 +26,6 @@ pub use crate::types::_experiment_status_type::ExperimentStatusType; pub use crate::types::_experiment_type::ExperimentType; pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; -======= -<<<<<<< HEAD -pub use crate::types::_experiment_group_response::ExperimentGroupResponse; -======= -pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= -pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) pub use crate::types::_experiment_group_sort_on::ExperimentGroupSortOn; @@ -65,48 +41,10 @@ pub use crate::types::_workspace_response::WorkspaceResponse; pub use crate::types::_type_templates_response::TypeTemplatesResponse; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -pub use crate::types::_experiment_sort_on::ExperimentSortOn; - -<<<<<<< HEAD -pub use crate::types::_variant_update_request::VariantUpdateRequest; - -<<<<<<< HEAD -======= -pub use crate::types::_experiment_response::ExperimentResponse; - -pub use crate::types::_dimension_match_strategy::DimensionMatchStrategy; - -======= ->>>>>>> 8fc501b7 (fix: more fixes) -pub use crate::types::_experiment_sort_on::ExperimentSortOn; - ->>>>>>> 91d47048 (fix: more fixes) -======= -pub use crate::types::_variant::Variant; - -pub use crate::types::_variant_type::VariantType; - -pub use crate::types::_experiment_response::ExperimentResponse; - -pub use crate::types::_experiment_status_type::ExperimentStatusType; - -pub use crate::types::_experiment_type::ExperimentType; - -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_experiment_sort_on::ExperimentSortOn; pub use crate::types::_variant_update_request::VariantUpdateRequest; ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) pub use crate::types::_org_status::OrgStatus; pub use crate::types::_organisation_response::OrganisationResponse; diff --git a/crates/superposition_sdk/src/types/builders.rs b/crates/superposition_sdk/src/types/builders.rs index 5037cf7ef..0c6bfeb74 100644 --- a/crates/superposition_sdk/src/types/builders.rs +++ b/crates/superposition_sdk/src/types/builders.rs @@ -4,21 +4,6 @@ pub use crate::types::_secret_response::SecretResponseBuilder; pub use crate::types::_variable_response::VariableResponseBuilder; pub use crate::types::_experiment_group_response::ExperimentGroupResponseBuilder; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - -pub use crate::types::_bucket::BucketBuilder; - -pub use crate::types::_experiment_response::ExperimentResponseBuilder; - -pub use crate::types::_variant::VariantBuilder; -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_bucket::BucketBuilder; @@ -32,26 +17,6 @@ pub use crate::types::_workspace_response::WorkspaceResponseBuilder; pub use crate::types::_type_templates_response::TypeTemplatesResponseBuilder; -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= -pub use crate::types::_variant::VariantBuilder; - -pub use crate::types::_experiment_response::ExperimentResponseBuilder; - -<<<<<<< HEAD ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 6e8749e1 (Test) ->>>>>>> c1293812 (Test) -======= ->>>>>>> 45a3cd01 (reabse fix) pub use crate::types::_variant_update_request::VariantUpdateRequestBuilder; pub use crate::types::_organisation_response::OrganisationResponseBuilder; diff --git a/docs/docs/api/Superposition.openapi.json b/docs/docs/api/Superposition.openapi.json index 6c118e874..960a230b1 100644 --- a/docs/docs/api/Superposition.openapi.json +++ b/docs/docs/api/Superposition.openapi.json @@ -170,23 +170,6 @@ } }, { -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", @@ -196,13 +179,6 @@ } }, { -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "x-org-id", "in": "header", "schema": { @@ -1945,10 +1921,6 @@ "explode": true }, { -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 0dd5da56 (fix: some fixes) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -1957,11 +1929,6 @@ } }, { -<<<<<<< HEAD -======= ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= ->>>>>>> 0dd5da56 (fix: some fixes) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", @@ -2177,25 +2144,6 @@ "explode": true }, { -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= -======= ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) "name": "dimension_match_strategy", "in": "query", "description": "Strategy to follow while filter items based on the context", @@ -2213,13 +2161,6 @@ } }, { -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "x-org-id", "in": "header", "schema": { @@ -2858,24 +2799,6 @@ } }, { -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= -======= ->>>>>>> 7f7fa5af (feat: Add prefix filter in list exp) ->>>>>>> 964966cd (feat: Add prefix filter in list exp) -======= ->>>>>>> 45a3cd01 (reabse fix) "name": "prefix", "in": "query", "style": "form", @@ -2888,13 +2811,6 @@ "explode": true }, { -<<<<<<< HEAD -======= -<<<<<<< HEAD -======= ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "if-modified-since", "in": "header", "description": "While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.", @@ -2904,13 +2820,6 @@ } }, { -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) "name": "x-org-id", "in": "header", "schema": { diff --git a/docs/docs/api/get-config.api.mdx b/docs/docs/api/get-config.api.mdx index 21c269faa..2632ff82a 100644 --- a/docs/docs/api/get-config.api.mdx +++ b/docs/docs/api/get-config.api.mdx @@ -5,39 +5,7 @@ description: "Retrieves config data with context evaluation, including applicabl sidebar_label: "GetConfig" hide_title: true hide_table_of_contents: true -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD api: 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 -======= -<<<<<<< HEAD -api: eJzNWEtv2zgQ/iuETruAnWS7yKW3NA3SYBM4cJxT1jBoaWSxlSgtSSU2DP/3nSEl6mHZTZoc2kNbkfPmNy9vgwh0qERhRC6Dz8EUjBLwDJqFuYzFikXccPYiTEIHBtaGwTNPS070IyZkmJaRkCvGiyIVIV+mUBPqEcufQSmBGkaMy4hFEPMyNYwEoIYl1xCxXLJC5c9IFRFnJEiyPglGQV6AsnpuIrTsGsylNQlvFPyHAsyXPNoEn7eBVSgN/bcyg7hOv2tyaRvoMIGM0//MpgAUlS+/Q2hQDipGHUaA9mLWZoiQR84unt63WXajXvjueMEUFAo02kNhMYmPx8m/8h/YUGAV3hfoKjO5JZA8w3Dksf2IRAZS1zEwwqRkyaWTgfKD3a459kGZuohcVpHY7Yiq4AolG1Bo69M2IDXIg9bFYo2yBVmMbGqDH9psrMQ4Vxl99mPGleJEJwxkunWuES9yZY2CdZHmER4aVcJu5BUiCMifPY19FY0oz7oe52o1FlHNmwCPQB1jduAQCqI9O9bjl1z90AUP4R3y5nRCz6cdaj6dndE/XRz4d2F4zWp61OMUWsaUazPO8kjEgoQP4PSwT+gLx7wzFJpjnJbSZfK4foY3acKTj80u/QpMHZDgfN2z2BeN9yTutE5a3RQhnjKkwPQRnJVUqjA3fBXMuAkTtOCE2aTG0iZkK3mrnKaqV1U7XUAo4o2rCLVYk3AUVWrDlsAwVXspX/lFqaxEjkyblo+yzJaIXbx8AbFKzOBVXYEXVMIXP9DUN+T0KMj4+sZd/oUfQtYfuw5SnlpvMApstg7obTnhTZ7vVbh7jm/EUwtd3z7e8LK/jACXr6XrOE3nck+ENT3FstHvYC8JSI+IpnkxrtxrOmz4hlD11FoHRaWNEOIidNS6be9tI2Li47EbOLS9gbyyJi6crneF5BokojQkQ8fWRuZEMARIGZoS7fV5EaewFtT97cDgXXaemkTl5SrJS2MdvLi/6bjl7CL1vve958W7VeNwffptw1Dkul/Qmoz2MVq4q22QS5jEtsP3PaxFT6+uH28vpnuxqc8HglOzPkphgn6613xz6q6HOG8nlxe3i8vJt8l0tqe5cznYt9r6OtRHlU6v7iazq0Nau7c/Vdsln+9a1epr/QozkmAhU4CMQIabxUrxIvkFAL9ixPLqvbZrqwyvLDIx67OiNLCISxmSqoWbfX7m6Z71ezhrodJPS0PxuJFx3i5P/uIrJsSeXj8U7NetTjVo94L54PjrJqzu/Hs+NJrdIIXCJ3gAhSKvlMKsPe8OaR808eAAoPnqQPRrFwbMGXKGODhV86deo7rjEnVkRIeBwaaT5LQt4WNZg7hBJAanYb05aQhLN0dgudAZNufNCS/ESWJM8YVrEV6UxPFkk6x/D9ihlCeYN9IeKCJVuT0o00eBzoN+kf02m90zS804ktP65MJew404l3RP6Dpi2WvUWPJjeiyBfSd69Gmzbl6teVak0F0XiU4Q7kl59a4PJSKhlTJ++saF4dP5+Ozv8dl5VetNxi2uqjUFQc38ptuxvrXp/laLehVwknWKc5KwE2upUrLYIdBmOnmEoEkImniy3ZLcR5XudnTs1kKCZSQ0mYcwjnmqYRRg423vrdYqPAgIoweIm52zoZ7TB07dS3ogQni9/g0qPRj5P6ZVAfuTHfLd2dBaXo+b/BGq2qttR5sjqGrJeOZqeU2xV94ajoswhMIcpW0XnPvJA/XbZfWTTGZ/CAgUf6Gfa/BvtIZ+0TH1cGfPaAmWq9IWycDJpD//A6RphGo= -======= -api: eJztWEtv2zgQ/iuETruAnWbbzaW3NA3SYFs4cBzsIWsYtDSy2EiklqQSG4b/+86QEi3ZUpo+FuihBdJE5HCe3zzIbZSAibUorVAyehtNwWoBj2BYrGQqVizhlrMnYTNasLC2DB55XnGiHzEh47xKhFwxXpa5iPkyh4bQjJh6BK0FShgxLhOWQMqr3DJigBKW3EDClGSlVo9IldDJRBBncxKNIlWCdnKuE9TsCuyFUwl3NPyLDOw7lWyit9vICZSW/qzVoFOvPhsyaRuZOIOC0192UwKyUsvPEFvkg4JRhhVgApu17SPkideL5zftI7vRgfs+8ZJpKDUY1IfcYrPgj5N/5F+wIcdq3C/RVGaVI5C8QHeo1H0kogBpGh9YYXPS5MLzQP7RbrdfDk6Zeo9c1J7Y7Yiq5Bo5W9Co6/02IjF4BrVLxRp5C9IYj+kNfhi7cRxTpQv6PPQZ15oTnbBQmNa6QbzIlVMK1mWuEly0uoLdKAhEEJA9RxIPRexZhaMiHRcqEamAZGwQbNAwyYAnoKND//+dCQRgZbzrBeLuzemfzLvbABOGWQ3cItS4YYhNpUfsKRNxxiRAYiggS2AZgjVHGgPkQQv5hi03DNWNH5qYBpYxWtyELrO2DDsnbIYKkEhCq9Dgwl3wB2Cm0oAHuGVxLjBciAku8QcldJlT0vBHJRJWSQkxGMM1KsLz3KDaIIkaWXH8kYpVJSYrONgM+faXv/r81Ubceqz0aiySI6ANwtWXI1L4CPnr8ZPSD6bkPcB9Ob85rXgLXea9Pj2lX91IhkrAcDt4BOV4ge5gzo0N+dRbGYdtQlt8Rxg36fxV53Hlx1Zp84LaNMBBJL0ah+bzPQ1g2hR/s29mPGdIgWVYcEw1xDXW2NBNC27jDDU4Ya45YIsUstUE6t5AwK67pikhFunGd5aGrUuOojKW0hFL/kHrqO2ilqCFwkOblo2yKpaISNx8ArHKbO9W08kXNAosHlDVr+gNo6jg62u/+Qd+CNl87DpIuW/FYBS5HOyR2zIiqDw/6pQ3HGPEc9eYwhjyFZH9ZgT4LKz85LKfgHyIcDbIsRgcTkKuNjWI2A9BrlBRND02wmBRz2aNDPJKGyFc+7LYyHYzXBsRk+CPXc+imzHIKqfiwsv6LpdcgUSUxqTo2OnIPAuGAKliS9U95EWaw1rQFOkGz2Cyt9RmWlWrTFXWGXh+c90xy+tF4sMM9T0R71aN4fr007qhVOawoO0zOvho4be2kZIwSd2keGhhw3p6eXX38Xx65Jtmvcc5zdE7KWx0mO7NuTn1zKGTHycX5x8XF5MPk+nsSHJns3cqbcvrUD8rdHr5aTK7HJLa3f2i2C75fNeqVu+bKMyIg4NMCTIBGW8WK83L7BsA/IJRPYgP0q6cMNxyyMSsL8rKwiKtZEyiFn6i+ZKlR9of4ayFyjAD9fnjWqaqXZ7CxntMiCO5YSg4rludatDuBfPea5Sfm7r3qLO+gesaKTSG4BY0sryk2ZiddUevHzTxFDTHrga835jQo06fMXSCUzW/P2hUn7hEGQXRoWOw6WSKbt0YLKcQt4jE6FXc3MANxJWfI7BcmAKb8+aEl+KERvp33Ij4vKIT9y7JDvcBO5QOBPM9t1vySF1uB3kGL9D60Y3mw2x2wxw140hO13Dv9gZudHJJ+4SuZzR7iRhH/pwcR+DiREGf7p8tLte8KHPoPjsQnSDck/A6rrcVIqGVMmH6xmvA67Px6Zvx6Vld623BHa7qyweCmoUXk472rReTn+rBp3Y48XqFc5JwE2ulc9LYI9BlOlmEoMkImriy3RLfO53vdrTsnxcIlokwpB7COOW5gVGEjbf9/uG0woWIMDpAvH+72FPP6QOn7iUFiBDeXOp6hQ56/tfdG4aj7r3f9/zzfNQGvf3btLbsd/a8zNYDwP8vqv080JHmCerKPZ75ztlQHDWT/YnzOIbSPkvbLu83k1uabpb1Q2rhnu8izZ/okRX/R23oHdY2o7Rbo4cEuapcS4o8T/r3H5g62Cs= ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= -api: eJztWEtv2zgQ/iuETruAnWbbzaW3NA3SYFs4cBzsIWsYtDSy2EiklqQSG4b/+86QEi3ZUpo+FuihBdJE5HCe3zzIbZSAibUorVAyehtNwWoBj2BYrGQqVizhlrMnYTNasLC2DB55XnGiHzEh47xKhFwxXpa5iPkyh4bQjJh6BK0FShgxLhOWQMqr3DJigBKW3EDClGSlVo9IldDJRBBncxKNIlWCdnKuE9TsCuyFUwl3NPyLDOw7lWyit9vICZSW/qzVoFOvPhsyaRuZOIOC0192UwKyUsvPEFvkg4JRhhVgApu17SPkideL5zftI7vRgfs+8ZJpKDUY1IfcYrPgj5N/5F+wIcdq3C/RVGaVI5C8QHeo1H0kogBpGh9YYXPS5MLzQP7RbrdfDk6Zeo9c1J7Y7Yiq5Bo5W9Co6/02IjF4BrVLxRp5C9IYj+kNfhi7cRxTpQv6PPQZ15oTnbBQmNa6QbzIlVMK1mWuEly0uoLdKAhEEJA9RxIPRexZhaMiHRcqEamAZGwQbNAwyYAnoKND//+dCQRgZbzrBeLuzemfzLvbABOGWQ3cItS4YYhNpUfsKRNxxiRAYiggS2AZgjVHGgPkQQv5hi03DNWNH5qYBpYxWtyELrO2DDsnbIYKkEhCq9Dgwl3wB2Cm0oAHuGVxLjBciAku8QcldJlT0vBHJRJWSQkxGMM1KsLz3KDaIIkaWXH8kYpVJSYrONgM+faXv/r81Ubceqz0aiySI6ANwtWXI1L4CPnr8ZPSD6bkPcB9Ob85rXgLXea9Pj2lX91IhkrAcDt4BOV4ge5gzo0N+dRbGYdtQlt8Rxg36fxV53Hlx1Zp84LaNMBBJL0ah+bzPQ1g2hR/s29mPGdIgWVYcEw1xDXW2NBNC27jDDU4Ya45YIsUstUE6t5AwK67pikhFunGd5aGrUuOojKW0hFL/kHrqO2ilqCFwkOblo2yKpaISNx8ArHKbO9W08kXNAosHlDVr+gNo6jg62u/+Qd+CNl87DpIuW/FYBS5HOyR2zIiqDw/6pQ3HGPEc9eYwhjyFZH9ZgT4LKz85LKfgHyIcDbIsRgcTkKuNjWI2A9BrlBRND02wmBRz2aNDPJKGyFc+7LYyHYzXBsRk+CPXc+imzHIKqfiwsv6LpdcgUSUxqTo2OnIPAuGAKliS9U95EWaw1rQFOkGz2Cyt9RmWlWrTFXWGXh+c90xy+tF4sMM9T0R71aN4fr007qhVOawoO0zOvho4be2kZIwSd2keGhhw3p6eXX38Xx65Jtmvcc5zdE7KWx0mO7NuTn1zKGTHycX5x8XF5MPk+nsSHJns3cqbcvrUD8rdHr5aTK7HJLa3f2i2C75fNeqVu+bKMyIg4NMCTIBGW8WK83L7BsA/IJRPYgP0q6cMNxyyMSsL8rKwiKtZEyiFn6i+ZKlR9of4ayFyjAD9fnjWqaqXZ7CxntMiCO5YSg4rludatDuBfPea5Sfm7r3qLO+gesaKTSG4BY0sryk2ZiddUevHzTxFDTHrga835jQo06fMXSCUzW/P2hUn7hEGQXRoWOw6WSKbt0YLKcQt4jE6FXc3MANxJWfI7BcmAKb8+aEl+KERvp33Ij4vKIT9y7JDvcBO5QOBPM9t1vySF1uB3kGL9D60Y3mw2x2wxw140hO13Dv9gZudHJJ+4SuZzR7iRhH/pwcR+DiREGf7p8tLte8KHPoPjsQnSDck/A6rrcVIqGVMmH6xmvA67Px6Zvx6Vld623BHa7qyweCmoUXk472rReTn+rBp3Y48XqFc5JwE2ulc9LYI9BlOlmEoMkImriy3RLfO53vdrTsnxcIlokwpB7COOW5gVGEjbf9/uG0woWIMDpAvH+72FPP6QOn7iUFiBDeXOp6hQ56/tfdG4aj7r3f9/zzfNQGvf3btLbsd/a8zNYDwP8vqv080JHmCerKPZ75ztlQHDWT/YnzOIbSPkvbLu83k1uabpb1Q2rhnu8izZ/okRX/R23oHdY2o7Rbo4cEuapcS4o8T/r3H5g62Cs= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) -======= -======= ->>>>>>> de718464 (fix: more fixes) -api: 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 -======= -api: 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 ->>>>>>> 6e8749e1 (Test) -<<<<<<< HEAD ->>>>>>> c1293812 (Test) -======= -======= -api: eJztWEtv2zgQ/iuETruAnWbbzaW3NA3SYFs4cBzsIWsYtDSy2EiklqQSG4b/+86QEi3ZUpo+FuihBdJE5HCe3zzIbZSAibUorVAyehtNwWoBj2BYrGQqVizhlrMnYTNasLC2DB55XnGiHzEh47xKhFwxXpa5iPkyh4bQjJh6BK0FShgxLhOWQMqr3DJigBKW3EDClGSlVo9IldDJRBBncxKNIlWCdnKuE9TsCuyFUwl3NPyLDOw7lWyit9vICZSW/qzVoFOvPhsyaRuZOIOC0192UwKyUsvPEFvkg4JRhhVgApu17SPkideL5zftI7vRgfs+8ZJpKDUY1IfcYrPgj5N/5F+wIcdq3C/RVGaVI5C8QHeo1H0kogBpGh9YYXPS5MLzQP7RbrdfDk6Zeo9c1J7Y7Yiq5Bo5W9Co6/02IjF4BrVLxRp5C9IYj+kNfhi7cRxTpQv6PPQZ15oTnbBQmNa6QbzIlVMK1mWuEly0uoLdKAhEEJA9RxIPRexZhaMiHRcqEamAZGwQbNAwyYAnoKND//+dCQRgZbzrBeLuzemfzLvbABOGWQ3cItS4YYhNpUfsKRNxxiRAYiggS2AZgjVHGgPkQQv5hi03DNWNH5qYBpYxWtyELrO2DDsnbIYKkEhCq9Dgwl3wB2Cm0oAHuGVxLjBciAku8QcldJlT0vBHJRJWSQkxGMM1KsLz3KDaIIkaWXH8kYpVJSYrONgM+faXv/r81Ubceqz0aiySI6ANwtWXI1L4CPnr8ZPSD6bkPcB9Ob85rXgLXea9Pj2lX91IhkrAcDt4BOV4ge5gzo0N+dRbGYdtQlt8Rxg36fxV53Hlx1Zp84LaNMBBJL0ah+bzPQ1g2hR/s29mPGdIgWVYcEw1xDXW2NBNC27jDDU4Ya45YIsUstUE6t5AwK67pikhFunGd5aGrUuOojKW0hFL/kHrqO2ilqCFwkOblo2yKpaISNx8ArHKbO9W08kXNAosHlDVr+gNo6jg62u/+Qd+CNl87DpIuW/FYBS5HOyR2zIiqDw/6pQ3HGPEc9eYwhjyFZH9ZgT4LKz85LKfgHyIcDbIsRgcTkKuNjWI2A9BrlBRND02wmBRz2aNDPJKGyFc+7LYyHYzXBsRk+CPXc+imzHIKqfiwsv6LpdcgUSUxqTo2OnIPAuGAKliS9U95EWaw1rQFOkGz2Cyt9RmWlWrTFXWGXh+c90xy+tF4sMM9T0R71aN4fr007qhVOawoO0zOvho4be2kZIwSd2keGhhw3p6eXX38Xx65Jtmvcc5zdE7KWx0mO7NuTn1zKGTHycX5x8XF5MPk+nsSHJns3cqbcvrUD8rdHr5aTK7HJLa3f2i2C75fNeqVu+bKMyIg4NMCTIBGW8WK83L7BsA/IJRPYgP0q6cMNxyyMSsL8rKwiKtZEyiFn6i+ZKlR9of4ayFyjAD9fnjWqaqXZ7CxntMiCO5YSg4rludatDuBfPea5Sfm7r3qLO+gesaKTSG4BY0sryk2ZiddUevHzTxFDTHrga835jQo06fMXSCUzW/P2hUn7hEGQXRoWOw6WSKbt0YLKcQt4jE6FXc3MANxJWfI7BcmAKb8+aEl+KERvp33Ij4vKIT9y7JDvcBO5QOBPM9t1vySF1uB3kGL9D60Y3mw2x2wxw140hO13Dv9gZudHJJ+4SuZzR7iRhH/pwcR+DiREGf7p8tLte8KHPoPjsQnSDck/A6rrcVIqGVMmH6xmvA67Px6Zvx6Vld623BHa7qyweCmoUXk472rReTn+rBp3Y48XqFc5JwE2ulc9LYI9BlOlmEoMkImriy3RLfO53vdrTsnxcIlokwpB7COOW5gVGEjbf9/uG0woWIMDpAvH+72FPP6QOn7iUFiBDeXOp6hQ56/tfdG4aj7r3f9/zzfNQGvf3btLbsd/a8zNYDwP8vqv080JHmCerKPZ75ztlQHDWT/YnzOIbSPkvbLu83k1uabpb1Q2rhnu8izZ/okRX/R23oHdY2o7Rbo4cEuapcS4o8T/r3H5g62Cs= ->>>>>>> 82479b8f (fix: more fixes) ->>>>>>> de718464 (fix: more fixes) -======= -api: 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 ->>>>>>> 45a3cd01 (reabse fix) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/get-experiment-config.ParamsDetails.json b/docs/docs/api/get-experiment-config.ParamsDetails.json index 517d4f6f3..a100d92ac 100644 --- a/docs/docs/api/get-experiment-config.ParamsDetails.json +++ b/docs/docs/api/get-experiment-config.ParamsDetails.json @@ -1,9 +1 @@ -<<<<<<< HEAD -<<<<<<< HEAD -{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} -======= -{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= -{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} ->>>>>>> 0dd5da56 (fix: some fixes) +{"parameters":[{"name":"prefix","in":"query","style":"form","schema":{"type":"array","items":{"type":"string"}},"explode":true},{"name":"dimension_match_strategy","in":"query","description":"Strategy to follow while filter items based on the context","schema":{"type":"string","description":"Strategy to follow while filter items based on the context","enum":["exact","subset"],"title":"DimensionMatchStrategy"}},{"name":"if-modified-since","in":"header","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates.","schema":{"type":"string","description":"While using this, 304 response is treated as error, which needs to be handled separately by checking the response code of the http response. This is required to make sure that clients can cache the response and avoid unnecessary calls when there are no updates."}},{"name":"x-org-id","in":"header","schema":{"type":"string"},"required":true},{"name":"x-workspace","in":"header","schema":{"type":"string"},"required":true}]} \ No newline at end of file diff --git a/docs/docs/api/get-experiment-config.api.mdx b/docs/docs/api/get-experiment-config.api.mdx index 8acaf7cb3..649a8c0b3 100644 --- a/docs/docs/api/get-experiment-config.api.mdx +++ b/docs/docs/api/get-experiment-config.api.mdx @@ -5,15 +5,7 @@ description: "Retrieves the experiment configuration for a given workspace and o sidebar_label: "GetExperimentConfig" hide_title: true hide_table_of_contents: true -<<<<<<< HEAD -<<<<<<< HEAD api: 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 -======= -api: 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 ->>>>>>> 0c17747c (feat: Add experiment_config endpoint) -======= -api: eJztWVlvGzcQ/ivEPrWApKhJ/ZI3Rd66Rn1hJactUmFB7VIS471Kcm0phv57Z8i9xbXlOnkomiBOLHI4N78Zjh6dkMlA8EzxNHHeOx5TgrN7JonaMMK2GRM8ZokiQZqs+DoXFAnJKhWEkjW/Zwl5SMWdzGjACE1Ckoo1TfgXTTYic2AimMzSRDLCkyDKQRwJmaI8kiRdERpFTSlrkeaZ1IzqVdSFKhJTFWy0WjJjAV9xFpIVjxQTcuQMnBTItdTzEOw4Y8qtGEy17kAj2N85k+pDGu6c948O2KRgG3+lWRbxQJ9/81miKx4dGWxYTPE3tcsYME2Xn1mggE8mUJriTFZstspGSMOQI08a3TSP7Acdt1/SDPyUgatAH56stZkF39FfyW9sJ+GjMK4MiUo1QUJjpr2IH0I0VQI77Q3FVYSaTA0P4O/s9/WyxT2e8c208Ml+j/QZFSADXey8//TooEA4DXqu+BakcNQdjokdfJBqp3lDbsT4ses9KgRFOq5YLBvrEjIuWWv1IOZRGsKiEjnbDyqBlW2+TgIfjlDF1ruuCm2nzgoqdNcqjaL0gTxseMSKrCFaEbKkEhIJcrrhcpv6hZpfVQhL8hgcC3ZTnS4yX0qmnEUdqNPS8ks0vBSGzqqcw1fDOA31fRhKuGOs9MqG0ZCJA41/1+rl0qQZlwPybvxz45bCdRMMxISESsKESMUATYK7lzAWSjR0ycgG7mgENJJhjigW7chyR8BpwV2ZvxXLAGJapulGqazaQYAAefAXbyYXTKd2TO/gjueCmXsfRFyDQEAT+AEJbeaIFfQ+5SHJk4QFTEoqQBEAFglqM+1yYEXhJ0lJnoWgrL4ix0b4u7/QX82M2w4B5Yc8PEi0PpfuDfSiwgd3ezusCsgr+C1wxVioseXteIz/tSNpQT0ChJVvQKIRrVlEVKrqZlnrQa82sPKVakujCh4BpT1MeGhVOjBp61NluwQI47jjYAIMFejQPLPcWVmiz/ymz47jalLBwq823zd7hxxLDD11f5ncXsxh5dS9cOeuf/3R9bzzU3fWxNM6/nPkAyLSe7izPGT+HRTZl5UrqajKLXu1UlPPnczdU1iZXl9NL25P9e/nVzfe9Znnzmao7flsOvHMxs3kdga/WPWdaWGl1lAIVise+LAbwCZdN30Dwpdwf8osfF1r4pVtCXYgSXmGAAWUN04BGLEPg36wkGX6NHDDiOi2JYReIWm0J0XXgjB0TyNoOYp2bmdqY8nWtHy5VAie0IJ0mhqjB5p4T4H8W1yPgvGziQeRnXvXF7Di/nHjeueX7tV8ctEM4kfDqYxd4Si/R26VkM/sWy07NqrTVjtfsTRuh040wn4eQkfzSJVx0tWhjHKVC1KXCoyQiXfVxnaeDHi9mlGnwhSmUjYBRKDNKF9Xdu5bCPvJ0ZWndkMnVIeO1wxa0NSHX8EmBdX9gp+VpOVHKwuarJkPOCl7KAA2xEtxtzzTo3eMz7ZA+rmInto3mdAAVf3esidax+dts2pkaZWRVn1ou+oQywcmju2SYYlTUR66SF3BrxUMG7hgRVOvLPl7i0NehCXd5wCkOBVh3W+BP/NAYXemH83JwXN3dHS9LnBjQ+XGStBbRl+fs/+DQnJMSYWbRLc8RuD/aTyGTzwxn8b6kiGN38gmHr6wo/jWLdmLGB+FmMs8uGOvqb4tdz1ZiI+BqTa31tkGDnzQSuvDBgGfq/HQlnl+3czN/pzN3Uv/zL1yPb3U4H2GDE2p7+hWuqp731pg2rzjx2NrwwobrJrzFmS1p2yFuJYrYUVTbXMNqd2bPyERh/sHL9ou9lUwaV6YfaEsUHnQeg4tnhlnGcbtedaJ7Vl4DhQCoGjGBFQYF1/w5KT9LPxKr7kYX9trG0Y3ZnMWdWzGmKq+SXHamaVSC6MKCoPzpvbSMChHn5IFOUDiTs/xZMzVZjeiGR/hfOEDlTyY5Hj40wKf5t19Bs2aqAgWNbcZGm5s6+dZGYvrBxXz1/n8hmhqQoEc55/Gu+X7H08ucV/3Qf2aHSNGkz8lRxPocGBsvXpe7G5pnEWsPe9FOp6sUi28CN8sB+dDQHjBG2IojQpvx29PhuN3w/EJWoIxi6lOn2ISAllM6jQm1dS6U72rXPwPD+uLSKEb38Bbg+sCXDSvJoub97/MYki8DWY6bD4+4kj1VkT7PS6bATCmdsglXUaIICsaSTZwoFlsjqx1qwALDub5AXGvq1815rVaa/R6YrJda7oo6tgSEwxvaDkhsxrca8P3QSbrTz4TDtss/V9mzA9eYdmP5GmZjWnqtxfVnLW2pBmCosAM56aTKCkOal59YhIELFNP0i4alermeoYjumXxDVysv+1xBH3Ab+fgX9AGv8rTgwUk0Gs4i03Wua6cjuGJf/4BgQskhA== ->>>>>>> 0dd5da56 (fix: some fixes) sidebar_class_name: "post api-method" info_path: docs/api/superposition custom_edit_url: null diff --git a/docs/docs/api/list-experiment-groups.api.mdx b/docs/docs/api/list-experiment-groups.api.mdx index 2f4e9e9c3..f54b44ef5 100644 --- a/docs/docs/api/list-experiment-groups.api.mdx +++ b/docs/docs/api/list-experiment-groups.api.mdx @@ -5,32 +5,8 @@ description: "Lists experiment groups, with support for filtering and pagination sidebar_label: "ListExperimentGroups" hide_title: true hide_table_of_contents: true -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 45a3cd01 (reabse fix) api: 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 sidebar_class_name: "post api-method" -======= -<<<<<<< HEAD -api: eJy9WEtv4kgQ/istnzISECarXHJLsmw22t3ZCJjDKkKoscu4J35tdzsThPjvU9W2of3AAfI4Je2urvrqXdTa8UC5UqRaJLFz5fwtlFYMXlKQIoJYs6VMslT12E+hA6ayNE2kZn4imS9CjUTxkvHYYylfipgTk4HTcxJ8bg73XsFztOV4ZxgiUcoljwB5KOfqce3EeEBiN8lijbeC0PyfgVzhoYrxWxYtQLLEZ0JDpJhO2AKYBJ3JGDwmYgbcDQgSEBjlBhBx52rt6FVKImLz/m1sN5veFjJ96Ub8gBQsF0tskacU8Aw9pjSXmmzoyyRiX4+BezhPGysPw26o9z7TMkM2ueKK4Qv8H4mVJiuQaXpMLOPE+H7nd7bzp7GRCQvjzVatFkkSAo8/R75tAfOn0wR/mMhmi1UjDxg9Zmfwwl3NIq4xHDATVLZQmtD0mAcpxB4BQ0AL7j7hiYkoDYGYGJxfWs2RM/h8KLZlXAkcbTxfrA61jw6AZQr//xkkrHhuPtbRnqbzEextPUKu9DxKPOGL07UhJqxk8lE6HSLE1kxh8Z0n8WsKQehRSSBqw1SCykIs64tVN2bAcoK1uEyRMh441eOqUfHTrOdooUNiUCvuE5T7b9wE/pon6B0GsYfGOePKLaNXMiLLT0clj8WPNCtakmleIbYktu1SamApTzzwiABsFYnXzaqik/HP3EA4IsCInnpMnsRn3yej8fx2PLqejn4nVSf/Taajf+Z3o2+jMX3LFdYrAwKRR236cym5sS0Vxy7H2tLwc12YrbDx5JT4bN5bIWSIYR4mHsqhWm/Z9KWfyGVfeKVFA+Ce6X37fI68qDkICV4Ls5+JfFIpd+EN/Gb0RaUYJWBsezEc0p/m2FQfcRhSsvIppVMSa7ykxzxNQ+Ga2Dv/oYjDuokoWfwAl1IvlRSpWuTydaJ5OKcOp5pDAsLP7+uhsLv3uD4kdrbSazmlsa1y6W0Vw3FDZi62ajCJxePWOllVAf3bZnhjoBc9D7gKWglyv7ZcVDC2cQ54vIQ51jO1jyKX3WYA7nmCOPPwwdaikRZjSNEoqLbCsSMu32DfEjQnc6r6nrFRISvv2ih/wP6ClcIq54sYmEemU1SoSF1lxphnHuL8w1QKrvDztNuy1QFHVhnWM5xWcf4hc5dJfFviMIEhue8Ld44quDQBLKFtyIz4i4ioWnwdDvEk4vw0RAYREM1859+58NThZWizqbSUljJF9Y1uKEahr1GGY73B9tHmuUZjOphxY05oY7/IcHLSh6i5J18r5moV8czRj/uuKwXpscat8tYq3jcGtHlsdal3bww1bKWp6vm2y65ajtdGjMr8aedWr9ZrvbZ5pMWf+0K2V044LSmxf6wZl6W8kfnXxTzhN6f0besYNMxlCnG1Xvcq1d2C0tZfSjy3RV/ZbEjCZVt7ukcKicVoAvIZ5EhKrEKXH9KdsGKpamWxArnUpgVOmzL0gi9pO2C5ghX7gxk5VwcJLRiWYIBwjW3DOd/5oL8sdw0K3AwL5spsGlQkdLAa8FQMAq3TG66Ee53R48cZjQ/1e+AS5JZgtuM2IaPkeu/nuTUEfW/00z+n0wdmqBlHcgRdWL6cUcxvZbqnsOtAdogYQ94lxxAYV4nYTwzTcv7N0KhpokTxBv2mctYXw4vL/vC3/vCSECKJjrgJmWIKo9BlTf81mvY2AN9pB1WYg6rNeRpyYXpgJkOSlYeKXU3LUEHvBqgCXa7XaHf4LsPNhj7nwz3FjycUX4SUxD4PFXRocuSmqhXyE6ystZiZBPDsUKAeDuSYBVQHimLTdSKID1otdeDNt10nwv2ENVAH9KJDvRn7USuargC0m/P7ojps1dKBraXxn4ywe3fSAWK3mzlR9qHrj9cwvJ+HTtlVdKCrDHE7gLNiil1Qo6EOXP5KP67Wno2L2eoL64Zh7RhOtNIRouwNREVaTnDtupDadb0xe23sQeduNMXu/AuB2/OR -sidebar_class_name: "get api-method" -======= -api: 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 -sidebar_class_name: "post api-method" ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= -api: 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 -sidebar_class_name: "post api-method" ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) info_path: docs/api/superposition custom_edit_url: null --- diff --git a/docs/docs/api/list-experiment.api.mdx b/docs/docs/api/list-experiment.api.mdx index 6afa4ad11..c55494e79 100644 --- a/docs/docs/api/list-experiment.api.mdx +++ b/docs/docs/api/list-experiment.api.mdx @@ -5,35 +5,8 @@ description: "Retrieves a paginated list of experiments with support for filteri sidebar_label: "ListExperiment" hide_title: true hide_table_of_contents: true -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> c1293812 (Test) -======= ->>>>>>> de718464 (fix: more fixes) -======= ->>>>>>> 964966cd (feat: Add prefix filter in list exp) -======= ->>>>>>> 45a3cd01 (reabse fix) api: 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 sidebar_class_name: "post api-method" -======= -<<<<<<< HEAD -api: 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 -sidebar_class_name: "get api-method" -======= -api: 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 -sidebar_class_name: "post api-method" ->>>>>>> 8fc501b7 (fix: more fixes) ->>>>>>> 91d47048 (fix: more fixes) -======= -api: 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 -sidebar_class_name: "post api-method" ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) info_path: docs/api/superposition custom_edit_url: null --- diff --git a/smithy/patches/python.patch b/smithy/patches/python.patch index 8f51f3d08..bb3c453db 100644 --- a/smithy/patches/python.patch +++ b/smithy/patches/python.patch @@ -24,7 +24,7 @@ index 7c295b28..b7a7bd7e 100644 reportPrivateUsage = false diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py -index 3db5673f..9297cce5 100644 +index cb471c43..abff3d68 100644 --- a/clients/python/sdk/superposition_sdk/models.py +++ b/clients/python/sdk/superposition_sdk/models.py @@ -681,7 +681,7 @@ ADD_MEMBERS_TO_GROUP = APIOperation( @@ -450,7 +450,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -9909,7 +9909,7 @@ GET_EXPERIMENT_CONFIG = APIOperation( +@@ -9916,7 +9916,7 @@ GET_EXPERIMENT_CONFIG = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -459,7 +459,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10079,7 +10079,7 @@ GET_EXPERIMENT_GROUP = APIOperation( +@@ -10086,7 +10086,7 @@ GET_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -468,7 +468,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10309,7 +10309,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( +@@ -10316,7 +10316,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -477,7 +477,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10501,7 +10501,7 @@ REMOVE_MEMBERS_FROM_GROUP = APIOperation( +@@ -10508,7 +10508,7 @@ REMOVE_MEMBERS_FROM_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -486,7 +486,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10703,7 +10703,7 @@ UPDATE_EXPERIMENT_GROUP = APIOperation( +@@ -10710,7 +10710,7 @@ UPDATE_EXPERIMENT_GROUP = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -495,7 +495,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -10914,7 +10914,7 @@ GET_EXPERIMENT = APIOperation( +@@ -10921,7 +10921,7 @@ GET_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -504,7 +504,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -11129,7 +11129,7 @@ LIST_EXPERIMENT = APIOperation( +@@ -11136,7 +11136,7 @@ LIST_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -513,12 +513,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -<<<<<<< HEAD -@@ -12578,7 +12578,7 @@ PUBLISH = APIOperation( -======= -@@ -11345,7 +11345,7 @@ PAUSE_EXPERIMENT = APIOperation( ->>>>>>> 45a3cd01 (reabse fix) +@@ -11352,7 +11352,7 @@ PAUSE_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -527,11 +522,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -12900,7 +12900,7 @@ TEST = APIOperation( -======= -@@ -11568,7 +11568,7 @@ RAMP_EXPERIMENT = APIOperation( ->>>>>>> 45a3cd01 (reabse fix) +@@ -11575,7 +11575,7 @@ RAMP_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -540,11 +531,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -13093,7 +13093,7 @@ UPDATE_FUNCTION = APIOperation( -======= -@@ -11784,7 +11784,7 @@ RESUME_EXPERIMENT = APIOperation( ->>>>>>> 45a3cd01 (reabse fix) +@@ -11791,7 +11791,7 @@ RESUME_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -553,11 +540,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -13240,7 +13240,7 @@ GET_ORGANISATION = APIOperation( -======= -@@ -12095,7 +12095,7 @@ UPDATE_OVERRIDES_EXPERIMENT = APIOperation( ->>>>>>> 45a3cd01 (reabse fix) +@@ -12102,7 +12102,7 @@ UPDATE_OVERRIDES_EXPERIMENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -566,11 +549,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -13365,7 +13365,7 @@ GET_SECRET = APIOperation( -======= -@@ -12262,7 +12262,7 @@ GET_FUNCTION = APIOperation( ->>>>>>> 45a3cd01 (reabse fix) +@@ -12269,7 +12269,7 @@ GET_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -579,24 +558,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -13498,7 +13498,7 @@ GET_TYPE_TEMPLATE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -13710,7 +13710,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( -<<<<<<< HEAD -======= -@@ -14218,7 +14218,7 @@ LIST_VARIABLES = APIOperation( ->>>>>>> c1293812 (Test) -======= -@@ -12530,7 +12530,7 @@ LIST_FUNCTION = APIOperation( ->>>>>>> 45a3cd01 (reabse fix) +@@ -12537,7 +12537,7 @@ LIST_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -605,25 +567,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -12702,7 +12702,7 @@ PUBLISH = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -13024,7 +13024,7 @@ TEST = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -13217,7 +13217,7 @@ UPDATE_FUNCTION = APIOperation( +@@ -12709,7 +12709,7 @@ PUBLISH = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -632,7 +576,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13364,7 +13364,7 @@ GET_ORGANISATION = APIOperation( +@@ -13031,7 +13031,7 @@ TEST = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -641,34 +585,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -13489,7 +13489,7 @@ GET_SECRET = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -13622,7 +13622,7 @@ GET_TYPE_TEMPLATE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -13834,7 +13834,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -13960,7 +13960,7 @@ GET_VARIABLE = APIOperation( +@@ -13224,7 +13224,7 @@ UPDATE_FUNCTION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -677,7 +594,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14138,7 +14138,7 @@ GET_WEBHOOK = APIOperation( +@@ -13371,7 +13371,7 @@ GET_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -686,7 +603,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14316,7 +14316,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( +@@ -13496,7 +13496,7 @@ GET_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -695,7 +612,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14495,7 +14495,7 @@ GET_WORKSPACE = APIOperation( +@@ -13629,7 +13629,7 @@ GET_TYPE_TEMPLATE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -704,7 +621,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -14721,7 +14721,7 @@ LIST_ORGANISATION = APIOperation( +@@ -13841,7 +13841,7 @@ GET_TYPE_TEMPLATES_LIST = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -713,26 +630,8 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -<<<<<<< HEAD -@@ -15087,7 +15087,7 @@ LIST_VARIABLES = APIOperation( -======= ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -<<<<<<< HEAD -@@ -15344,7 +15344,7 @@ LIST_WEBHOOK = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, -======= -@@ -13836,7 +13836,7 @@ GET_VARIABLE = APIOperation( +@@ -13967,7 +13967,7 @@ GET_VARIABLE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -740,13 +639,8 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -15602,7 +15602,7 @@ LIST_WORKSPACE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, -======= -@@ -14014,7 +14014,7 @@ GET_WEBHOOK = APIOperation( +@@ -14145,7 +14145,7 @@ GET_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) }), effective_auth_schemes = [ - ShapeID("smithy.api#httpBasicAuth") @@ -754,20 +648,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -15679,7 +15679,7 @@ ROTATE_MASTER_ENCRYPTION_KEY = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15858,7 +15858,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( -======= -@@ -14192,7 +14192,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +@@ -14323,7 +14323,7 @@ GET_WEBHOOK_BY_EVENT = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -776,11 +657,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -16045,7 +16045,7 @@ UPDATE_ORGANISATION = APIOperation( -======= -@@ -14371,7 +14371,7 @@ GET_WORKSPACE = APIOperation( ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +@@ -14502,7 +14502,7 @@ GET_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -789,11 +666,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -16130,7 +16130,7 @@ ROTATE_WORKSPACE_ENCRYPTION_KEY = APIOperation( -======= -@@ -14597,7 +14597,7 @@ LIST_ORGANISATION = APIOperation( ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) +@@ -14728,7 +14728,7 @@ LIST_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -802,166 +675,7 @@ index 3db5673f..9297cce5 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -<<<<<<< HEAD -@@ -16281,7 +16281,7 @@ UPDATE_SECRET = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -16440,7 +16440,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -16585,7 +16585,7 @@ UPDATE_VARIABLE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -16824,7 +16824,7 @@ UPDATE_WEBHOOK = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -17070,7 +17070,7 @@ UPDATE_WORKSPACE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, -======= -@@ -14841,7 +14841,7 @@ LIST_SECRETS = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -<<<<<<< HEAD - -diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py -index 9ff09776..abff3d68 100644 ---- a/clients/python/sdk/superposition_sdk/models.py -+++ b/clients/python/sdk/superposition_sdk/models.py -@@ -10316,7 +10316,7 @@ LIST_EXPERIMENT_GROUPS = APIOperation( -======= -@@ -15087,7 +15087,7 @@ LIST_VARIABLES = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15344,7 +15344,7 @@ LIST_WEBHOOK = APIOperation( ->>>>>>> 588a53c4 (feat: Add prefix filter in list exp) - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15602,7 +15602,7 @@ LIST_WORKSPACE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15679,7 +15679,7 @@ ROTATE_MASTER_ENCRYPTION_KEY = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15858,7 +15858,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( -======= -@@ -14924,7 +14924,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( ->>>>>>> c1293812 (Test) - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15111,7 +15111,7 @@ UPDATE_ORGANISATION = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15270,7 +15270,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15415,7 +15415,7 @@ UPDATE_VARIABLE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15654,7 +15654,7 @@ UPDATE_WEBHOOK = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -@@ -15906,7 +15906,7 @@ UPDATE_WORKSPACE = APIOperation( - ShapeID("io.superposition#InternalServerError"): InternalServerError, - }), - effective_auth_schemes = [ -- ShapeID("smithy.api#httpBasicAuth") -+ ShapeID("smithy.api#httpBasicAuth"), - ShapeID("smithy.api#httpBearerAuth") - ] - ) -diff --git a/clients/python/sdk/superposition_sdk/models.py b/clients/python/sdk/superposition_sdk/models.py -index 294231fb..9d836018 100644 ---- a/clients/python/sdk/superposition_sdk/models.py -+++ b/clients/python/sdk/superposition_sdk/models.py -@@ -7025,7 +7025,7 @@ CREATE_WORKSPACE = APIOperation( -======= -@@ -14965,7 +14965,7 @@ LIST_SECRETS = APIOperation( ->>>>>>> 45a3cd01 (reabse fix) +@@ -14972,7 +14972,7 @@ LIST_SECRETS = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -970,7 +684,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -15211,7 +15211,7 @@ LIST_VARIABLES = APIOperation( +@@ -15218,7 +15218,7 @@ LIST_VARIABLES = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -979,7 +693,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -15468,7 +15468,7 @@ LIST_WEBHOOK = APIOperation( +@@ -15475,7 +15475,7 @@ LIST_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -988,7 +702,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -15726,7 +15726,7 @@ LIST_WORKSPACE = APIOperation( +@@ -15733,7 +15733,7 @@ LIST_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -997,7 +711,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -15803,7 +15803,7 @@ ROTATE_MASTER_ENCRYPTION_KEY = APIOperation( +@@ -15810,7 +15810,7 @@ ROTATE_MASTER_ENCRYPTION_KEY = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1006,7 +720,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -15982,7 +15982,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( +@@ -15989,7 +15989,7 @@ MIGRATE_WORKSPACE_SCHEMA = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1015,7 +729,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16169,7 +16169,7 @@ UPDATE_ORGANISATION = APIOperation( +@@ -16176,7 +16176,7 @@ UPDATE_ORGANISATION = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1024,7 +738,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16254,7 +16254,7 @@ ROTATE_WORKSPACE_ENCRYPTION_KEY = APIOperation( +@@ -16261,7 +16261,7 @@ ROTATE_WORKSPACE_ENCRYPTION_KEY = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1033,7 +747,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16405,7 +16405,7 @@ UPDATE_SECRET = APIOperation( +@@ -16412,7 +16412,7 @@ UPDATE_SECRET = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1042,7 +756,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16564,7 +16564,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( +@@ -16571,7 +16571,7 @@ UPDATE_TYPE_TEMPLATES = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1051,7 +765,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16709,7 +16709,7 @@ UPDATE_VARIABLE = APIOperation( +@@ -16716,7 +16716,7 @@ UPDATE_VARIABLE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1060,7 +774,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -16948,7 +16948,7 @@ UPDATE_WEBHOOK = APIOperation( +@@ -16955,7 +16955,7 @@ UPDATE_WEBHOOK = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ @@ -1069,7 +783,7 @@ index 294231fb..9d836018 100644 ShapeID("smithy.api#httpBearerAuth") ] ) -@@ -17194,7 +17194,7 @@ UPDATE_WORKSPACE = APIOperation( +@@ -17201,7 +17201,7 @@ UPDATE_WORKSPACE = APIOperation( ShapeID("io.superposition#InternalServerError"): InternalServerError, }), effective_auth_schemes = [ From 40beaa285dfb5a5f9c7789be0ebe05af369e5f4f Mon Sep 17 00:00:00 2001 From: "ayush.jain@juspay.in" Date: Tue, 24 Mar 2026 21:12:27 +0530 Subject: [PATCH 16/16] chore: resolving comments --- Cargo.lock | 124 +- crates/superposition_provider/Cargo.toml | 3 +- .../examples/config.toml | 6 +- .../examples/local_file_example.rs | 2 +- .../examples/local_http_example.rs | 2 +- .../superposition_provider/src/conversions.rs | 100 +- .../superposition_provider/src/data_source.rs | 28 +- .../src/data_source/file.rs | 92 +- .../src/data_source/http.rs | 117 +- .../src/local_provider.rs | 230 +- crates/superposition_provider/src/provider.rs | 7 +- .../src/remote_provider.rs | 27 +- crates/superposition_provider/src/traits.rs | 165 +- crates/superposition_provider/src/utils.rs | 165 +- ...026-02-14-configuration-resolver-design.md | 226 -- .../2026-02-14-configuration-resolver-plan.md | 1987 ----------------- 16 files changed, 460 insertions(+), 2821 deletions(-) delete mode 100644 docs/plans/2026-02-14-configuration-resolver-design.md delete mode 100644 docs/plans/2026-02-14-configuration-resolver-plan.md diff --git a/Cargo.lock b/Cargo.lock index 34027be9c..28ed9787d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2476,17 +2476,6 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" -[[package]] -name = "filetime" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" -dependencies = [ - "cfg-if", - "libc", - "libredox", -] - [[package]] name = "find-msvc-tools" version = "0.1.5" @@ -3317,11 +3306,11 @@ dependencies = [ [[package]] name = "inotify" -version = "0.10.2" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" +checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.1", "inotify-sys", "libc", ] @@ -3823,17 +3812,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" -[[package]] -name = "libredox" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" -dependencies = [ - "bitflags 2.9.1", - "libc", - "redox_syscall 0.7.1", -] - [[package]] name = "libsqlite3-sys" version = "0.26.0" @@ -4124,12 +4102,11 @@ dependencies = [ [[package]] name = "notify" -version = "7.0.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ "bitflags 2.9.1", - "filetime", "fsevent-sys", "inotify", "kqueue", @@ -4138,16 +4115,16 @@ dependencies = [ "mio 1.0.2", "notify-types", "walkdir", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] name = "notify-types" -version = "1.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585d3cb5e12e01aed9e8a1f70d5c6b5e86fe2a6e48fc8cd0b3e0b8df6f6eb174" +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "instant", + "bitflags 2.9.1", ] [[package]] @@ -4908,15 +4885,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_syscall" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" -dependencies = [ - "bitflags 2.9.1", -] - [[package]] name = "regex" version = "1.9.4" @@ -7248,6 +7216,15 @@ dependencies = [ "windows-targets 0.52.0", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -7302,6 +7279,23 @@ dependencies = [ "windows_x86_64_msvc 0.52.0", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -7320,6 +7314,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -7338,6 +7338,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -7356,6 +7362,18 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -7374,6 +7392,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -7392,6 +7416,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -7410,6 +7440,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -7428,6 +7464,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.5.40" diff --git a/crates/superposition_provider/Cargo.toml b/crates/superposition_provider/Cargo.toml index 9ec393e7e..a15a7e369 100644 --- a/crates/superposition_provider/Cargo.toml +++ b/crates/superposition_provider/Cargo.toml @@ -15,6 +15,7 @@ aws-smithy-types = { version = "1.3.0" } chrono = { workspace = true } derive_more = { workspace = true } log = { workspace = true } +notify = "8" open-feature = "0.2.5" reqwest = { workspace = true } serde = { workspace = true } @@ -27,8 +28,6 @@ tokio = { workspace = true } tokio-util = "0.7" uuid = { workspace = true } -notify = "7" - [dev-dependencies] env_logger = "0.11" diff --git a/crates/superposition_provider/examples/config.toml b/crates/superposition_provider/examples/config.toml index e4adc822a..2ea4a65cc 100644 --- a/crates/superposition_provider/examples/config.toml +++ b/crates/superposition_provider/examples/config.toml @@ -1,6 +1,10 @@ [default-configs] timeout = { value = 30, schema = { type = "integer" } } -currency = { value = "Rupee", schema = { type = "string", enum = ["Rupee", "Dollar", "Euro"] } } +currency = { value = "Rupee", schema = { type = "string", enum = [ + "Rupee", + "Dollar", + "Euro", +] } } price = { value = 10000, schema = { type = "integer", minimum = 0 } } [dimensions] diff --git a/crates/superposition_provider/examples/local_file_example.rs b/crates/superposition_provider/examples/local_file_example.rs index 6b02292da..a5133bacf 100644 --- a/crates/superposition_provider/examples/local_file_example.rs +++ b/crates/superposition_provider/examples/local_file_example.rs @@ -30,5 +30,5 @@ async fn main() { let config = provider.resolve_all_features(context).await.unwrap(); println!("Config: {:?}", config); - provider.close().await.unwrap(); + provider.close_provider().await.unwrap(); } diff --git a/crates/superposition_provider/examples/local_http_example.rs b/crates/superposition_provider/examples/local_http_example.rs index db4743cd6..685514698 100644 --- a/crates/superposition_provider/examples/local_http_example.rs +++ b/crates/superposition_provider/examples/local_http_example.rs @@ -40,5 +40,5 @@ async fn main() { let variants = provider.get_applicable_variants(context).await.unwrap(); println!("Variants: {:?}", variants); - provider.close().await.unwrap(); + provider.close_provider().await.unwrap(); } diff --git a/crates/superposition_provider/src/conversions.rs b/crates/superposition_provider/src/conversions.rs index 3e672d6b6..0d644e9e0 100644 --- a/crates/superposition_provider/src/conversions.rs +++ b/crates/superposition_provider/src/conversions.rs @@ -4,15 +4,17 @@ use aws_smithy_types::Document; use open_feature::{EvaluationContext, EvaluationContextFieldValue}; use serde_json::{Map, Value}; +use crate::{types::Result, SuperpositionError}; + pub fn value_to_document(value: Value) -> Document { match value { Value::Null => Document::Null, Value::Bool(b) => Document::Bool(b), Value::Number(n) => { - if let Some(i) = n.as_i64() { - Document::Number(aws_smithy_types::Number::NegInt(i)) - } else if let Some(u) = n.as_u64() { + if let Some(u) = n.as_u64() { Document::Number(aws_smithy_types::Number::PosInt(u)) + } else if let Some(i) = n.as_i64() { + Document::Number(aws_smithy_types::Number::NegInt(i)) } else if let Some(f) = n.as_f64() { Document::Number(aws_smithy_types::Number::Float(f)) } else { @@ -65,8 +67,13 @@ pub fn document_to_value(doc: Document) -> Value { Number::PosInt(val) => Value::Number(serde_json::Number::from(val)), Number::NegInt(val) => Value::Number(serde_json::Number::from(val)), Number::Float(val) => Value::Number( - serde_json::Number::from_f64(val) - .unwrap_or_else(|| serde_json::Number::from(0)), + serde_json::Number::from_f64(val).unwrap_or_else(|| { + log::warn!( + "Failed to convert float {} to JSON number, using 0 instead", + val + ); + serde_json::Number::from(0) + }), ), } } @@ -80,10 +87,15 @@ pub fn evaluation_context_to_value(value: EvaluationContextFieldValue) -> Value match value { EvaluationContextFieldValue::Bool(b) => Value::Bool(b), EvaluationContextFieldValue::Int(i) => Value::Number(serde_json::Number::from(i)), - EvaluationContextFieldValue::Float(f) => Value::Number( - serde_json::Number::from_f64(f) - .unwrap_or_else(|| serde_json::Number::from(0)), - ), + EvaluationContextFieldValue::Float(f) => { + Value::Number(serde_json::Number::from_f64(f).unwrap_or_else(|| { + log::warn!( + "Failed to convert float {} to JSON number, using 0 instead", + f + ); + serde_json::Number::from(0) + })) + } EvaluationContextFieldValue::String(s) => Value::String(s), EvaluationContextFieldValue::DateTime(dt) => Value::String(dt.to_string()), EvaluationContextFieldValue::Struct(s) => { @@ -95,7 +107,10 @@ pub fn evaluation_context_to_value(value: EvaluationContextFieldValue) -> Value .map(|(k, v)| (k.clone(), evaluation_context_to_value(v.clone()))) .collect() }) - .unwrap_or_default(); + .unwrap_or_else(|| { + log::warn!("Failed to downcast struct value to expected HashMap format, got {:?}. Returning empty object.", s.type_id()); + Map::new() + }); Value::Object(struct_map) } } @@ -136,3 +151,68 @@ pub fn evaluation_context_to_map(context: EvaluationContext) -> Map Result { + match value { + Value::Object(map) => { + let mut fields = HashMap::new(); + for (k, v) in map { + let open_feature_value = value_to_openfeature_value(v)?; + fields.insert(k, open_feature_value); + } + // StructValue is just a struct with a fields HashMap, not a complex conversion + Ok(open_feature::StructValue { fields }) + } + Value::Array(list) => { + let mut fields = HashMap::new(); + for (index, item) in list.into_iter().enumerate() { + let open_feature_value = value_to_openfeature_value(item)?; + fields.insert(index.to_string(), open_feature_value); + } + Ok(open_feature::StructValue { fields }) + } + _ => Err(SuperpositionError::ConfigError(format!( + "Cannot convert {:?} to StructValue - flag must be an object/array", + value + ))), + } +} + +/// Convert serde_json Value to OpenFeature Value +pub fn value_to_openfeature_value(value: Value) -> Result { + match value { + Value::Bool(b) => Ok(open_feature::Value::Bool(b)), + Value::String(s) => Ok(open_feature::Value::String(s)), + Value::Number(n) => { + if let Some(i) = n.as_i64() { + Ok(open_feature::Value::Int(i)) + } else if let Some(f) = n.as_f64() { + Ok(open_feature::Value::Float(f)) + } else { + Err(SuperpositionError::ConfigError(format!( + "Cannot convert number {} to OpenFeature value", + n + ))) + } + } + Value::Array(arr) => Ok(open_feature::Value::Array( + arr.into_iter() + .map(value_to_openfeature_value) + .collect::>>()?, + )), + Value::Object(map) => { + let fields = map + .into_iter() + .map(|(k, v)| Ok((k, value_to_openfeature_value(v)?))) + .collect::>>()?; + + // Create StructValue directly with fields HashMap + let struct_value = open_feature::StructValue { fields }; + Ok(open_feature::Value::Struct(struct_value)) + } + Value::Null => Err(SuperpositionError::ConfigError( + "Cannot convert null to OpenFeature value".to_string(), + )), + } +} diff --git a/crates/superposition_provider/src/data_source.rs b/crates/superposition_provider/src/data_source.rs index b282e9bf9..382d6f6a5 100644 --- a/crates/superposition_provider/src/data_source.rs +++ b/crates/superposition_provider/src/data_source.rs @@ -59,15 +59,6 @@ pub struct ConfigData { pub fetched_at: DateTime, } -impl ConfigData { - pub fn new(config: Config) -> Self { - Self { - config, - fetched_at: Utc::now(), - } - } -} - impl Display for ConfigData { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -89,15 +80,6 @@ pub struct ExperimentData { pub fetched_at: DateTime, } -impl ExperimentData { - pub fn new(config: ExperimentConfig) -> Self { - Self { - data: config, - fetched_at: Utc::now(), - } - } -} - impl Display for ExperimentData { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -119,7 +101,7 @@ pub trait SuperpositionDataSource: Send + Sync { /// Fetch the full resolved configuration. async fn fetch_config( &self, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result>; /// Fetch a resolved configuration filtered by the given context and key prefixes. @@ -127,13 +109,13 @@ pub trait SuperpositionDataSource: Send + Sync { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result>; /// Fetch all active experiments. async fn fetch_active_experiments( &self, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result>; /// Fetch active experiments whose conditions are candidates for the given context @@ -142,7 +124,7 @@ pub trait SuperpositionDataSource: Send + Sync { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result>; /// Fetch active experiments that match the given context and key prefixes. @@ -150,7 +132,7 @@ pub trait SuperpositionDataSource: Send + Sync { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result>; /// Whether this data source supports experiments. diff --git a/crates/superposition_provider/src/data_source/file.rs b/crates/superposition_provider/src/data_source/file.rs index 2a9bcf484..5ad760b41 100644 --- a/crates/superposition_provider/src/data_source/file.rs +++ b/crates/superposition_provider/src/data_source/file.rs @@ -1,9 +1,8 @@ use std::path::PathBuf; -use std::sync::{Arc, Mutex}; +use std::sync::Mutex; use async_trait::async_trait; use chrono::{DateTime, Utc}; -use log::error; use notify::{Event, RecommendedWatcher, Watcher}; use serde_json::{Map, Value}; use superposition_core::{ConfigFormat, TomlFormat}; @@ -14,18 +13,21 @@ use crate::types::{Result, SuperpositionError, WatchStream}; use super::{ConfigData, ExperimentData, SuperpositionDataSource}; +struct WatcherInner { + _watcher: RecommendedWatcher, + broadcast_tx: broadcast::Sender<()>, +} + pub struct FileDataSource { file_path: PathBuf, - watcher: Arc>>, - broadcast_tx: Arc>>>, + watcher: Mutex>, } impl FileDataSource { pub fn new(file_path: PathBuf) -> Self { Self { file_path, - watcher: Arc::new(Mutex::new(None)), - broadcast_tx: Arc::new(Mutex::new(None)), + watcher: Mutex::new(None), } } } @@ -34,8 +36,12 @@ impl FileDataSource { impl SuperpositionDataSource for FileDataSource { async fn fetch_config( &self, - _: Option>, + if_modified_since: Option>, ) -> Result> { + if if_modified_since.is_some() { + log::debug!("FileDataSource: ignoring if_modified_since, always reading fresh from file"); + } + let now = Utc::now(); let content = tokio::fs::read_to_string(&self.file_path) .await .map_err(|e| { @@ -49,17 +55,20 @@ impl SuperpositionDataSource for FileDataSource { SuperpositionError::ConfigError(format!("Failed to parse TOML config: {}", e)) })?; - Ok(FetchResponse::Data(ConfigData::new(config))) + Ok(FetchResponse::Data(ConfigData { + config, + fetched_at: now, + })) } async fn fetch_filtered_config( &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { let resp = self - .fetch_config(last_fetched_at) + .fetch_config(if_modified_since) .await? .map_data(|mut data| { data.config = data.config.filter( @@ -74,7 +83,7 @@ impl SuperpositionDataSource for FileDataSource { async fn fetch_active_experiments( &self, - _last_fetched_at: Option>, + _if_modified_since: Option>, ) -> Result> { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), @@ -85,7 +94,7 @@ impl SuperpositionDataSource for FileDataSource { &self, _context: Option>, _prefix_filter: Option>, - _last_fetched_at: Option>, + _if_modified_since: Option>, ) -> Result> { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), @@ -96,7 +105,7 @@ impl SuperpositionDataSource for FileDataSource { &self, _context: Option>, _prefix_filter: Option>, - _last_fetched_at: Option>, + _if_modified_since: Option>, ) -> Result> { Err(SuperpositionError::ConfigError( "Experiments not supported by FileDataSource".into(), @@ -108,25 +117,22 @@ impl SuperpositionDataSource for FileDataSource { } fn watch(&self) -> Result> { - // Check if already watching - return a new subscriber to existing broadcast - let tx_guard = self.broadcast_tx.lock().map_err(|e| { + // Acquire both locks upfront to prevent concurrent watcher creation + let mut watcher_guard = self.watcher.lock().map_err(|e| { SuperpositionError::ConfigError(format!( - "Failed to lock broadcast mutex: {}", + "Failed to lock watcher mutex: {}", e )) })?; - if let Some(tx) = tx_guard.as_ref() { - // Already watching - return a new subscriber + // If already watching, return a new subscriber to the existing broadcast + if let Some(inner) = watcher_guard.as_ref() { return Ok(Some(WatchStream { - receiver: tx.subscribe(), + receiver: inner.broadcast_tx.subscribe(), })); } - // Drop the lock before creating the watcher to avoid holding lock during setup - drop(tx_guard); - - // Create broadcast channel for multiple consumers + // Both checks confirmed None — safe to create under the lock let (tx, _rx) = broadcast::channel(16); let tx_clone = tx.clone(); @@ -136,7 +142,7 @@ impl SuperpositionDataSource for FileDataSource { let _ = tx_clone.send(()); } Err(e) => { - error!("FileDataSource: watch error: {}", e); + log::error!("FileDataSource: watch error: {}", e); } }, ) @@ -156,32 +162,14 @@ impl SuperpositionDataSource for FileDataSource { )) })?; - let mut watcher_guard = self.watcher.lock().map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to lock watcher mutex: {}", - e - )) - })?; - - let mut tx_guard = self.broadcast_tx.lock().map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to lock broadcast mutex: {}", - e - )) - })?; - - // Double-check in case another thread raced us - if let Some(tx) = tx_guard.as_ref() { - return Ok(Some(WatchStream { - receiver: tx.subscribe(), - })); - } - - *watcher_guard = Some(watcher); - *tx_guard = Some(tx.clone()); + let subscriber = tx.subscribe(); + *watcher_guard = Some(WatcherInner { + _watcher: watcher, + broadcast_tx: tx, + }); Ok(Some(WatchStream { - receiver: tx.subscribe(), + receiver: subscriber, })) } @@ -194,14 +182,6 @@ impl SuperpositionDataSource for FileDataSource { })?; *guard = None; - let mut tx_guard = self.broadcast_tx.lock().map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to lock broadcast mutex: {}", - e - )) - })?; - *tx_guard = None; - Ok(()) } } diff --git a/crates/superposition_provider/src/data_source/http.rs b/crates/superposition_provider/src/data_source/http.rs index f84a2ce28..227f13ff4 100644 --- a/crates/superposition_provider/src/data_source/http.rs +++ b/crates/superposition_provider/src/data_source/http.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; -use chrono::{DateTime, Utc}; -use log::info; +use chrono::{DateTime, TimeZone, Utc}; use serde_json::{Map, Value}; use superposition_sdk::error::SdkError; use superposition_sdk::types::DimensionMatchStrategy; @@ -14,42 +13,45 @@ use super::{ConfigData, ExperimentData, FetchResponse, SuperpositionDataSource}; pub struct HttpDataSource { options: SuperpositionOptions, + client: Client, } -impl HttpDataSource { - pub fn new(options: SuperpositionOptions) -> Self { - Self { options } - } +fn create_client(options: &SuperpositionOptions) -> Client { + let sdk_config = SdkConfig::builder() + .endpoint_url(&options.endpoint) + .bearer_token(options.token.clone().into()) + .behavior_version_latest() + .build(); - fn create_client(&self) -> Client { - let sdk_config = SdkConfig::builder() - .endpoint_url(&self.options.endpoint) - .bearer_token(self.options.token.clone().into()) - .behavior_version_latest() - .build(); + Client::from_conf(sdk_config) +} - Client::from_conf(sdk_config) +impl HttpDataSource { + pub fn new(options: SuperpositionOptions) -> Self { + Self { + client: create_client(&options), + options, + } } async fn fetch_experiments_with_filters( &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, - filter: Option, + if_modified_since: Option>, + filter: Option, ) -> Result> { - let client = self.create_client(); - - let mut experiment_builder = client + let mut experiment_builder = self + .client .get_experiment_config() .workspace_id(&self.options.workspace_id) .org_id(&self.options.org_id); - if let Some(fetched_at) = last_fetched_at + if let Some(modified_since) = if_modified_since .and_then(|t| t.timestamp_nanos_opt()) .and_then(|t| aws_smithy_types::DateTime::from_nanos(t.into()).ok()) { - experiment_builder = experiment_builder.if_modified_since(fetched_at); + experiment_builder = experiment_builder.if_modified_since(modified_since); } if let Some(context) = context { @@ -66,22 +68,23 @@ impl HttpDataSource { } if let Some(filter) = filter { - if filter { - experiment_builder = experiment_builder - .dimension_match_strategy(DimensionMatchStrategy::Subset); - } else { - experiment_builder = experiment_builder - .dimension_match_strategy(DimensionMatchStrategy::Exact); - } + experiment_builder = experiment_builder.dimension_match_strategy(filter); } - info!("Fetching experiments from Superposition service using SDK"); + log::info!("Fetching experiments from Superposition service using SDK"); let experiments_result = experiment_builder.send().await; let experiments_response = match experiments_result { - Ok(res) => ConversionUtils::convert_experiment_config_response(res) - .map(ExperimentData::new) - .map(FetchResponse::Data), + Ok(res) => { + let modified_at = + Utc.timestamp_nanos(res.last_modified.as_nanos() as i64); + ConversionUtils::convert_experiment_config_response(res) + .map(|d| ExperimentData { + data: d, + fetched_at: modified_at, + }) + .map(FetchResponse::Data) + } Err(SdkError::ResponseError(r)) if r.raw().status().as_u16() == 304 => { Ok(FetchResponse::NotModified) } @@ -91,7 +94,7 @@ impl HttpDataSource { ))), }?; - info!("Successfully fetched {}", experiments_response); + log::info!("Successfully fetched {}", experiments_response); Ok(experiments_response) } @@ -100,21 +103,20 @@ impl HttpDataSource { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { - let client = self.create_client(); - - info!("Fetching config from Superposition service using SDK"); - let mut builder = client + log::info!("Fetching config from Superposition service using SDK"); + let mut builder = self + .client .get_config() .workspace_id(&self.options.workspace_id) .org_id(&self.options.org_id); - if let Some(fetched_at) = last_fetched_at + if let Some(modified_since) = if_modified_since .and_then(|t| t.timestamp_nanos_opt()) .and_then(|t| aws_smithy_types::DateTime::from_nanos(t.into()).ok()) { - builder = builder.if_modified_since(fetched_at); + builder = builder.if_modified_since(modified_since); } if let Some(context) = context { @@ -133,9 +135,16 @@ impl HttpDataSource { let config_result = builder.send().await; let resp = match config_result { - Ok(res) => ConversionUtils::convert_get_config_response(res) - .map(ConfigData::new) - .map(FetchResponse::Data), + Ok(res) => { + let modified_at = + Utc.timestamp_nanos(res.last_modified.as_nanos() as i64); + ConversionUtils::convert_get_config_response(res) + .map(|d| ConfigData { + config: d, + fetched_at: modified_at, + }) + .map(FetchResponse::Data) + } Err(SdkError::ResponseError(r)) if r.raw().status().as_u16() == 304 => { Ok(FetchResponse::NotModified) } @@ -153,9 +162,9 @@ impl HttpDataSource { impl SuperpositionDataSource for HttpDataSource { async fn fetch_config( &self, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { - self.fetch_config_with_filters(None, None, last_fetched_at) + self.fetch_config_with_filters(None, None, if_modified_since) .await } @@ -163,17 +172,17 @@ impl SuperpositionDataSource for HttpDataSource { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { - self.fetch_config_with_filters(context, prefix_filter, last_fetched_at) + self.fetch_config_with_filters(context, prefix_filter, if_modified_since) .await } async fn fetch_active_experiments( &self, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { - self.fetch_experiments_with_filters(None, None, last_fetched_at, None) + self.fetch_experiments_with_filters(None, None, if_modified_since, None) .await } @@ -181,13 +190,13 @@ impl SuperpositionDataSource for HttpDataSource { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { self.fetch_experiments_with_filters( context, prefix_filter, - last_fetched_at, - Some(false), + if_modified_since, + Some(DimensionMatchStrategy::Exact), ) .await } @@ -196,13 +205,13 @@ impl SuperpositionDataSource for HttpDataSource { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { self.fetch_experiments_with_filters( context, prefix_filter, - last_fetched_at, - Some(true), + if_modified_since, + Some(DimensionMatchStrategy::Subset), ) .await } diff --git a/crates/superposition_provider/src/local_provider.rs b/crates/superposition_provider/src/local_provider.rs index 02e156f9e..c869ffe11 100644 --- a/crates/superposition_provider/src/local_provider.rs +++ b/crates/superposition_provider/src/local_provider.rs @@ -31,7 +31,7 @@ pub struct LocalResolutionProviderInner { refresh_strategy: RefreshStrategy, cached_config: RwLock>, cached_experiments: RwLock>, - polling_task: RwLock>>, + background_task: RwLock>>, metadata: ProviderMetadata, status: RwLock, global_context: RwLock, @@ -52,7 +52,7 @@ impl LocalResolutionProvider { refresh_strategy, cached_config: RwLock::new(None), cached_experiments: RwLock::new(None), - polling_task: RwLock::new(None), + background_task: RwLock::new(None), metadata: ProviderMetadata { name: "LocalResolutionProvider".to_string(), }, @@ -98,29 +98,46 @@ impl LocalResolutionProvider { *cached = config_data.into_data(); } - // Fetch experiments best-effort: try primary, optionally fallback, but don't fail - let exp_data = match self.primary.fetch_active_experiments(None).await { - Ok(exp_resp) => exp_resp.into_data(), - Err(e) => { - log::warn!( - "LocalResolutionProvider: primary experiment fetch failed (best-effort): {}", - e - ); - if let Some(fallback) = &self.fallback { - match fallback.fetch_active_experiments(None).await { - Ok(exp_resp) => exp_resp.into_data(), - Err(fb_err) => { + // Fetch experiments best-effort: try primary, else fallback + let exp_data = if self.primary.supports_experiments() { + match self.primary.fetch_active_experiments(None).await { + Ok(exp_resp) => exp_resp.into_data(), + Err(e) => { + log::warn!( + "LocalResolutionProvider: primary experiment fetch failed: {}", + e + ); + if let Some(fallback) = &self.fallback { + if fallback.supports_experiments() { + match fallback.fetch_active_experiments(None).await { + Ok(exp_resp) => exp_resp.into_data(), + Err(fb_err) => { + log::warn!( + "LocalResolutionProvider: fallback experiment fetch also failed: {}", + fb_err + ); + return Err(SuperpositionError::ConfigError(format!( + "Both primary and fallback experiment fetch failed. Primary: {}. Fallback: {}", + e, fb_err + ))); + } + } + } else { log::warn!( - "LocalResolutionProvider: fallback experiment fetch also failed (best-effort): {}", - fb_err + "LocalResolutionProvider: fallback does not support experiments" ); None } + } else { + return Err(SuperpositionError::ConfigError(format!( + "Primary experiment fetch failed and no fallback configured: {}", + e + ))); } - } else { - None } } + } else { + None }; if let Some(data) = exp_data { @@ -136,8 +153,8 @@ impl LocalResolutionProvider { polling_strategy.interval ); let task = self.start_polling(polling_strategy.interval).await; - let mut polling_task = self.polling_task.write().await; - *polling_task = Some(task); + let mut background_task = self.background_task.write().await; + *background_task = Some(task); } RefreshStrategy::OnDemand(on_demand_strategy) => { log::info!( @@ -154,14 +171,19 @@ impl LocalResolutionProvider { debounce_ms ); let task = self.start_watching(stream, debounce_ms).await; - let mut polling_task = self.polling_task.write().await; - *polling_task = Some(task); + let mut background_task = self.background_task.write().await; + *background_task = Some(task); } Ok(None) => { - log::warn!("Watch strategy selected but data source does not support watching"); + return Err(SuperpositionError::ConfigError( + "Watch strategy selected but data source does not support watching".into(), + )); } Err(e) => { - log::warn!("Failed to start watch: {}", e); + return Err(SuperpositionError::ConfigError(format!( + "Failed to start watch: {}", + e + ))); } } } @@ -171,13 +193,13 @@ impl LocalResolutionProvider { } { - let mut status = self.status.write().await; - *status = ProviderStatus::Ready; + let mut global_context = self.global_context.write().await; + *global_context = context; } { - let mut global_context = self.global_context.write().await; - *global_context = context; + let mut status = self.status.write().await; + *status = ProviderStatus::Ready; } Ok(()) @@ -187,11 +209,11 @@ impl LocalResolutionProvider { self.do_refresh().await } - pub async fn close(&self) -> Result<()> { - // Abort polling task + pub async fn close_provider(&self) -> Result<()> { + // Abort background task { - let mut polling_task = self.polling_task.write().await; - if let Some(task) = polling_task.take() { + let mut background_task = self.background_task.write().await; + if let Some(task) = background_task.take() { task.abort(); } } @@ -222,6 +244,11 @@ impl LocalResolutionProvider { *cached = None; } + { + let mut global_context = self.global_context.write().await; + *global_context = EvaluationContext::default(); + } + // Set status to NotReady { let mut status = self.status.write().await; @@ -262,7 +289,6 @@ impl LocalResolutionProvider { } }; - // Experiments refresh is best-effort, don't propagate errors if self.primary.supports_experiments() { let exp_last_fetched_at = { self.cached_experiments @@ -301,11 +327,11 @@ impl LocalResolutionProvider { } async fn start_polling(&self, interval: u64) -> JoinHandle<()> { - let provider_clone = self.clone(); + let provider = self.clone(); tokio::spawn(async move { loop { sleep(Duration::from_secs(interval)).await; - let _ = provider_clone.do_refresh().await; + let _ = provider.do_refresh().await; } }) } @@ -315,7 +341,7 @@ impl LocalResolutionProvider { mut watch_stream: crate::types::WatchStream, debounce_ms: u64, ) -> JoinHandle<()> { - let provider_clone = self.clone(); + let provider = self.clone(); tokio::spawn(async move { loop { @@ -324,77 +350,13 @@ impl LocalResolutionProvider { // Debounce: wait, then drain any queued events sleep(Duration::from_millis(debounce_ms)).await; while watch_stream.receiver.try_recv().is_ok() {} - - let last_fetched_at = { - provider_clone - .cached_config - .read() - .await - .as_ref() - .map(|data| data.fetched_at) - }; - - // Refresh config - match provider_clone.primary.fetch_config(last_fetched_at).await { - Ok(FetchResponse::Data(data)) => { - let mut cached = - provider_clone.cached_config.write().await; - *cached = Some(data); - log::debug!( - "LocalResolutionProvider: config updated via watch" - ); - } - Ok(FetchResponse::NotModified) => { - log::debug!( - "LocalResolutionProvider: config not modified on watch refresh" - ); - } - Err(e) => { - log::error!( - "LocalResolutionProvider: watch config refresh error: {}", - e - ); - } - } - - let exp_last_fetched_at = { - provider_clone - .cached_experiments - .read() - .await - .as_ref() - .map(|d| d.fetched_at) - }; - // Refresh experiments - match provider_clone - .primary - .fetch_active_experiments(exp_last_fetched_at) - .await - { - Ok(exp_resp) => { - let mut cached = - provider_clone.cached_experiments.write().await; - if let Some(data) = exp_resp.into_data() { - *cached = Some(data); - } - log::debug!( - "LocalResolutionProvider: experiments refreshed from primary on watch update" - ); - } - Err(e) => { - log::warn!( - "LocalResolutionProvider: experiment refresh failed, keeping last known good on watch update: {}", - e - ); - } - } + let _ = provider.do_refresh().await; } Err(e) => { log::error!( "LocalResolutionProvider: watch channel error: {}", e ); - break; } } } @@ -406,19 +368,27 @@ impl LocalResolutionProvider { let ttl = on_demand.ttl; let use_stale_on_error = on_demand.use_stale_on_error.unwrap_or_default(); - let should_refresh = { + let is_elapsed = |cached_at: DateTime| { + (chrono::Utc::now() - cached_at).num_seconds() > ttl as i64 + }; + + let should_refresh_config = { let cached = self.cached_config.read().await; - match cached.as_ref() { - Some(data) => { - let elapsed = - (chrono::Utc::now() - data.fetched_at).num_seconds(); - elapsed > ttl as i64 - } - None => true, - } + cached + .as_ref() + .map(|data| is_elapsed(data.fetched_at)) + .unwrap_or(true) + }; + + let should_refresh_experiments = { + let cached = self.cached_experiments.read().await; + cached + .as_ref() + .map(|data| is_elapsed(data.fetched_at)) + .unwrap_or(true) }; - if should_refresh { + if should_refresh_config || should_refresh_experiments { log::debug!("LocalResolutionProvider: TTL expired, refreshing on-demand"); if let Err(e) = self.do_refresh().await { if !use_stale_on_error { @@ -467,7 +437,7 @@ impl LocalResolutionProvider { &exp_data.data.experiment_groups, &query_data, &targeting_key.clone().unwrap_or_default(), - None, + prefix_filter.map(|p| p.to_vec()), ); query_data.insert( @@ -618,6 +588,7 @@ impl FeatureProvider for LocalResolutionProvider { fn status(&self) -> ProviderStatus { match self.status.try_read() { + // need to do this as ProviderStatus neither implements Copy nor Clone Ok(status) => match *status { ProviderStatus::Ready => ProviderStatus::Ready, ProviderStatus::Error => ProviderStatus::Error, @@ -633,8 +604,11 @@ impl FeatureProvider for LocalResolutionProvider { impl SuperpositionDataSource for LocalResolutionProvider { async fn fetch_config( &self, - _: Option>, + if_modified_since: Option>, ) -> Result> { + if if_modified_since.is_some() { + log::debug!("LocalResolutionProvider: ignoring if_modified_since for config, always returning cached data"); + } let cached = self.cached_config.read().await; match cached.as_ref() { Some(data) => Ok(FetchResponse::Data(data.clone())), @@ -648,27 +622,33 @@ impl SuperpositionDataSource for LocalResolutionProvider { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { - let resp = self.fetch_config(last_fetched_at).await?.map_data(|mut c| { - let prefix = prefix_filter.map(HashSet::from_iter); - c.config = c.config.filter(context.as_ref(), prefix.as_ref()); + let resp = self + .fetch_config(if_modified_since) + .await? + .map_data(|mut c| { + let prefix = prefix_filter.map(HashSet::from_iter); + c.config = c.config.filter(context.as_ref(), prefix.as_ref()); - c - }); + c + }); Ok(resp) } async fn fetch_active_experiments( &self, - _: Option>, + if_modified_since: Option>, ) -> Result> { if !self.supports_experiments() { return Err(SuperpositionError::ConfigError( "Experiments not supported by this provider".into(), )); } + if if_modified_since.is_some() { + log::debug!("LocalResolutionProvider: ignoring if_modified_since for experiments, always returning cached data"); + } let cached = self.cached_experiments.read().await; match cached.clone() { Some(data) => Ok(FetchResponse::Data(data)), @@ -682,7 +662,7 @@ impl SuperpositionDataSource for LocalResolutionProvider { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { if !self.supports_experiments() { return Err(SuperpositionError::ConfigError( @@ -691,7 +671,7 @@ impl SuperpositionDataSource for LocalResolutionProvider { } let resp = self - .fetch_active_experiments(last_fetched_at) + .fetch_active_experiments(if_modified_since) .await? .map_data(|mut exp_data| { let context = context.unwrap_or_default(); @@ -714,7 +694,7 @@ impl SuperpositionDataSource for LocalResolutionProvider { &self, context: Option>, prefix_filter: Option>, - last_fetched_at: Option>, + if_modified_since: Option>, ) -> Result> { if !self.supports_experiments() { return Err(SuperpositionError::ConfigError( @@ -723,7 +703,7 @@ impl SuperpositionDataSource for LocalResolutionProvider { } let resp = self - .fetch_active_experiments(last_fetched_at) + .fetch_active_experiments(if_modified_since) .await? .map_data(|mut exp_data| { let context = context.unwrap_or_default(); @@ -747,6 +727,6 @@ impl SuperpositionDataSource for LocalResolutionProvider { } async fn close(&self) -> Result<()> { - Ok(()) + self.close_provider().await } } diff --git a/crates/superposition_provider/src/provider.rs b/crates/superposition_provider/src/provider.rs index a63be4a52..0133b26ca 100644 --- a/crates/superposition_provider/src/provider.rs +++ b/crates/superposition_provider/src/provider.rs @@ -16,7 +16,6 @@ use superposition_types::{Config, DimensionInfo}; use tokio::sync::RwLock; use crate::types::*; -use crate::utils::ConversionUtils; use crate::{ client::{CacConfig, ExperimentationConfig}, conversions, @@ -315,10 +314,10 @@ impl FeatureProvider for SuperpositionProvider { evaluation_context: &EvaluationContext, ) -> EvaluationResult> { match self.eval_config(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { + Ok(mut config) => { + if let Some(value) = config.remove(flag_key) { // Use the conversion utility we added earlier - match ConversionUtils::serde_value_to_struct_value(value) { + match conversions::value_to_struct(value) { Ok(struct_value) => { return Ok(ResolutionDetails::new(struct_value)); } diff --git a/crates/superposition_provider/src/remote_provider.rs b/crates/superposition_provider/src/remote_provider.rs index 6fb699992..9a5e05b79 100644 --- a/crates/superposition_provider/src/remote_provider.rs +++ b/crates/superposition_provider/src/remote_provider.rs @@ -111,12 +111,24 @@ pub struct SuperpositionAPIProvider { global_context: RwLock, metadata: ProviderMetadata, status: RwLock, + client: Client, +} + +fn create_client(options: &SuperpositionOptions) -> Client { + let sdk_config = SdkConfig::builder() + .endpoint_url(&options.endpoint) + .bearer_token(options.token.clone().into()) + .behavior_version_latest() + .build(); + + Client::from_conf(sdk_config) } impl SuperpositionAPIProvider { /// Create a new provider without response caching. pub fn new(options: SuperpositionOptions) -> Self { Self { + client: create_client(&options), options, cache: None, global_context: RwLock::new(EvaluationContext::default()), @@ -137,6 +149,7 @@ impl SuperpositionAPIProvider { let cache = ResponseCache::new(max_entries, ttl); Self { + client: create_client(&options), options, cache: Some(Arc::new(RwLock::new(cache))), global_context: RwLock::new(EvaluationContext::default()), @@ -147,16 +160,6 @@ impl SuperpositionAPIProvider { } } - fn create_client(&self) -> Client { - let sdk_config = SdkConfig::builder() - .endpoint_url(&self.options.endpoint) - .bearer_token(self.options.token.clone().into()) - .behavior_version_latest() - .build(); - - Client::from_conf(sdk_config) - } - async fn resolve_remote( &self, mut context: EvaluationContext, @@ -178,7 +181,7 @@ impl SuperpositionAPIProvider { } // 2. Create SDK client - let client = self.create_client(); + let client = &self.client; let global_context = self.global_context.read().await; context.merge_missing(&global_context); @@ -300,6 +303,7 @@ impl FeatureExperimentMeta for SuperpositionAPIProvider { #[async_trait] impl FeatureProvider for SuperpositionAPIProvider { + // TODO: use context and set as global context for the provider async fn initialize(&mut self, _context: &EvaluationContext) { log::info!("Initializing SuperpositionAPIProvider..."); { @@ -359,6 +363,7 @@ impl FeatureProvider for SuperpositionAPIProvider { fn status(&self) -> ProviderStatus { match self.status.try_read() { + // need to do this as ProviderStatus neither implements Copy nor Clone Ok(status) => match *status { ProviderStatus::Ready => ProviderStatus::Ready, ProviderStatus::Error => ProviderStatus::Error, diff --git a/crates/superposition_provider/src/traits.rs b/crates/superposition_provider/src/traits.rs index 9455b7a82..d96f07135 100644 --- a/crates/superposition_provider/src/traits.rs +++ b/crates/superposition_provider/src/traits.rs @@ -5,7 +5,7 @@ use open_feature::{ }; use serde_json::{Map, Value}; -use crate::{types::Result, utils::ConversionUtils}; +use crate::{conversions, types::Result}; /// Trait for experiment variant resolution. /// @@ -40,27 +40,32 @@ pub trait AllFeatureProvider: Send + Sync { prefix_filter: Option<&[String]>, ) -> Result>; - async fn resolve_bool( + async fn resolve_typed( &self, flag_key: &str, evaluation_context: EvaluationContext, - ) -> EvaluationResult> { + type_name: &str, + extractor: impl Fn(Value) -> Option + Send + Sync, + ) -> EvaluationResult> { match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_bool() { - Some(bool_val) => Ok(ResolutionDetails::new(bool_val)), + Ok(mut config) => { + match config.remove(flag_key) { + Some(value) => extractor(value) + .map(ResolutionDetails::new) + .ok_or_else(|| EvaluationError { + code: EvaluationErrorCode::TypeMismatch, + message: Some(format!( + "Flag '{flag_key}' is not a {type_name}", + )), + }), None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a boolean", flag_key)), + code: EvaluationErrorCode::FlagNotFound, + message: Some(format!("Flag '{}' not found", flag_key)), }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, + } + } Err(e) => { - log::error!("Error evaluating boolean flag {}: {}", flag_key, e); + log::error!("Error evaluating {} flag {}: {}", type_name, flag_key, e); Err(EvaluationError { code: EvaluationErrorCode::General(format!( "Error evaluating flag '{}': {}", @@ -72,36 +77,25 @@ pub trait AllFeatureProvider: Send + Sync { } } + async fn resolve_bool( + &self, + flag_key: &str, + evaluation_context: EvaluationContext, + ) -> EvaluationResult> { + self.resolve_typed(flag_key, evaluation_context, "boolean", |v| v.as_bool()) + .await + } + async fn resolve_string( &self, flag_key: &str, evaluation_context: EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_str() { - Some(str_val) => Ok(ResolutionDetails::new(str_val.to_owned())), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a string", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating String flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_typed(flag_key, evaluation_context, "string", |v| match v { + Value::String(s) => Some(s), + _ => None, + }) + .await } async fn resolve_int( @@ -109,31 +103,8 @@ pub trait AllFeatureProvider: Send + Sync { flag_key: &str, evaluation_context: EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_i64() { - Some(int_val) => Ok(ResolutionDetails::new(int_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not an integer", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating integer flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_typed(flag_key, evaluation_context, "integer", |v| v.as_i64()) + .await } async fn resolve_float( @@ -141,31 +112,8 @@ pub trait AllFeatureProvider: Send + Sync { flag_key: &str, evaluation_context: EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => match value.as_f64() { - Some(float_val) => Ok(ResolutionDetails::new(float_val)), - None => Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!("Flag '{}' is not a float", flag_key)), - }), - }, - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating float flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_typed(flag_key, evaluation_context, "float", |v| v.as_f64()) + .await } async fn resolve_struct( @@ -173,38 +121,9 @@ pub trait AllFeatureProvider: Send + Sync { flag_key: &str, evaluation_context: EvaluationContext, ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => match config.get(flag_key) { - Some(value) => { - match ConversionUtils::serde_value_to_struct_value(value) { - Ok(struct_value) => Ok(ResolutionDetails::new(struct_value)), - Err(e) => { - log::error!("Error converting value to StructValue: {}", e); - Err(EvaluationError { - code: EvaluationErrorCode::TypeMismatch, - message: Some(format!( - "Flag '{}' is not a struct: {}", - flag_key, e - )), - }) - } - } - } - None => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Flag '{}' not found", flag_key)), - }), - }, - Err(e) => { - log::error!("Error evaluating Object flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::General(format!( - "Error evaluating flag '{}': {}", - flag_key, e - )), - message: Some(format!("Error evaluating flag '{}': {}", flag_key, e)), - }) - } - } + self.resolve_typed(flag_key, evaluation_context, "struct", |v| { + conversions::value_to_struct(v).ok() + }) + .await } } diff --git a/crates/superposition_provider/src/utils.rs b/crates/superposition_provider/src/utils.rs index b8c4607a3..41f7dec19 100644 --- a/crates/superposition_provider/src/utils.rs +++ b/crates/superposition_provider/src/utils.rs @@ -338,10 +338,10 @@ impl ConversionUtils { .map_err(|e| SuperpositionError::SerializationError(e.to_string()))?; let variant_value = Variant { - id: variant.id.clone(), + id: variant.id, variant_type, - context_id: variant.context_id.clone(), - override_id: variant.override_id.clone(), + context_id: variant.context_id, + override_id: variant.override_id, overrides: override_, }; variants.push(variant_value); @@ -367,7 +367,7 @@ impl ConversionUtils { } }; let experiment = FfiExperiment { - id: exp.id.clone(), + id: exp.id, context, variants, traffic_percentage: exp.traffic_percentage as u8, @@ -410,7 +410,7 @@ impl ConversionUtils { }; let experiment_group = FfiExperimentGroup { - id: exp_group.id.clone(), + id: exp_group.id, context, traffic_percentage: exp_group.traffic_percentage as u8, member_experiment_ids: exp_group.member_experiment_ids, @@ -418,11 +418,11 @@ impl ConversionUtils { buckets: Buckets::try_from( exp_group .buckets - .iter() + .into_iter() .map(|b| { - b.as_ref().map(|bucket| Bucket { - variant_id: bucket.variant_id.clone(), - experiment_id: bucket.experiment_id.clone(), + b.map(|bucket| Bucket { + variant_id: bucket.variant_id, + experiment_id: bucket.experiment_id, }) }) .collect::>(), @@ -553,151 +553,4 @@ impl ConversionUtils { let final_result: HashMap = result.into_iter().collect(); Ok(final_result) } - - /// Convert serde_json Value to boolean for OpenFeature provider - pub fn serde_value_to_bool(value: &Value) -> Result { - match value { - Value::Bool(b) => Ok(*b), - Value::String(s) => s.parse::().map_err(|_| { - SuperpositionError::ConfigError(format!( - "Cannot convert string '{}' to boolean", - s - )) - }), - _ => Err(SuperpositionError::ConfigError(format!( - "Cannot convert {:?} to boolean", - value - ))), - } - } - - /// Convert serde_json Value to string for OpenFeature provider - pub fn serde_value_to_string(value: &Value) -> Result { - match value { - Value::String(s) => Ok(s.clone()), - Value::Number(n) => Ok(n.to_string()), - Value::Bool(b) => Ok(b.to_string()), - _ => Err(SuperpositionError::ConfigError(format!( - "Cannot convert {:?} to string", - value - ))), - } - } - - /// Convert serde_json Value to integer for OpenFeature provider - pub fn serde_value_to_int(value: &Value) -> Result { - match value { - Value::Number(n) => n.as_i64().ok_or_else(|| { - SuperpositionError::ConfigError(format!( - "Cannot convert number {} to i64", - n - )) - }), - Value::String(s) => s.parse::().map_err(|_| { - SuperpositionError::ConfigError(format!( - "Cannot convert string '{}' to i64", - s - )) - }), - _ => Err(SuperpositionError::ConfigError(format!( - "Cannot convert {:?} to i64", - value - ))), - } - } - - /// Convert serde_json Value to float for OpenFeature provider - pub fn serde_value_to_float(value: &Value) -> Result { - match value { - Value::Number(n) => n.as_f64().ok_or_else(|| { - SuperpositionError::ConfigError(format!( - "Cannot convert number {} to f64", - n - )) - }), - Value::String(s) => s.parse::().map_err(|_| { - SuperpositionError::ConfigError(format!( - "Cannot convert string '{}' to f64", - s - )) - }), - _ => Err(SuperpositionError::ConfigError(format!( - "Cannot convert {:?} to f64", - value - ))), - } - } - - /// Convert serde_json Value to OpenFeature StructValue - pub fn serde_value_to_struct_value( - value: &Value, - ) -> Result { - match value { - Value::Object(map) => { - let mut fields = HashMap::new(); - for (k, v) in map { - let open_feature_value = Self::serde_value_to_openfeature_value(v)?; - fields.insert(k.clone(), open_feature_value); - } - // StructValue is just a struct with a fields HashMap, not a complex conversion - Ok(open_feature::StructValue { fields }) - } - Value::Array(list) => { - let mut fields = HashMap::new(); - for (index, item) in list.iter().enumerate() { - let open_feature_value = - Self::serde_value_to_openfeature_value(item)?; - fields.insert(index.to_string(), open_feature_value); - } - Ok(open_feature::StructValue { fields }) - } - _ => Err(SuperpositionError::ConfigError(format!( - "Cannot convert {:?} to StructValue - flag must be an object/array", - value - ))), - } - } - - /// Convert serde_json Value to OpenFeature Value - pub fn serde_value_to_openfeature_value( - value: &Value, - ) -> Result { - match value { - Value::Bool(b) => Ok(open_feature::Value::Bool(*b)), - Value::String(s) => Ok(open_feature::Value::String(s.clone())), - Value::Number(n) => { - if let Some(i) = n.as_i64() { - Ok(open_feature::Value::Int(i)) - } else if let Some(f) = n.as_f64() { - Ok(open_feature::Value::Float(f)) - } else { - Err(SuperpositionError::ConfigError(format!( - "Cannot convert number {} to OpenFeature value", - n - ))) - } - } - Value::Array(arr) => { - let mut list = Vec::new(); - for item in arr { - list.push(Self::serde_value_to_openfeature_value(item)?); - } - // OpenFeature uses Array, not List - Ok(open_feature::Value::Array(list)) - } - Value::Object(map) => { - let mut fields = HashMap::new(); - for (k, v) in map { - let open_feature_value = Self::serde_value_to_openfeature_value(v)?; - fields.insert(k.clone(), open_feature_value); - } - // Create StructValue directly with fields HashMap - let struct_value = open_feature::StructValue { fields }; - Ok(open_feature::Value::Struct(struct_value)) - } - Value::Null => Err(SuperpositionError::ConfigError( - "Cannot convert null to OpenFeature value".to_string(), - )), - } - } } diff --git a/docs/plans/2026-02-14-configuration-resolver-design.md b/docs/plans/2026-02-14-configuration-resolver-design.md deleted file mode 100644 index dc8261df5..000000000 --- a/docs/plans/2026-02-14-configuration-resolver-design.md +++ /dev/null @@ -1,226 +0,0 @@ -# Configuration Resolver (Superposition Provider Refactor) - -## Overview - -Refactor the `superposition_provider` crate to introduce a trait-based architecture with pluggable data sources, supporting both local (in-process) and remote configuration resolution. The existing implementation (`provider.rs`, `client.rs`) is kept for comparison. - -## Goals - -1. Define clean trait abstractions: `AllFeatureProvider`, `FeatureExperimentMeta`, `SuperpositionDataSource` -2. Support pluggable data sources (HTTP, File/TOML) via `SuperpositionDataSource` -3. Implement `LocalResolutionProvider` with primary + fallback data sources and multiple refresh strategies -4. Implement `SuperpositionAPIProvider` for remote resolution -5. All providers implement OpenFeature's `FeatureProvider` trait -6. Provide examples for HTTP, File, and primary+fallback configurations - -## Module Layout - -``` -crates/superposition_provider/src/ -├── lib.rs # Re-exports -├── types.rs # Error types, options (existing, extended) -├── traits.rs # AllFeatureProvider + FeatureExperimentMeta traits -├── data_source.rs # SuperpositionDataSource trait, ConfigData, ExperimentData -├── data_source/ -│ ├── http.rs # HttpDataSource -│ └── file.rs # FileDataSource (TOML) -├── local_provider.rs # LocalResolutionProvider -├── remote_provider.rs # SuperpositionAPIProvider -├── utils.rs # Existing ConversionUtils (kept) -├── provider.rs # Existing provider (kept for comparison) -└── client.rs # Existing client (kept for comparison) -``` - -Uses Rust 2018 module style (`data_source.rs` + `data_source/` directory, no `mod.rs`). - -## Core Traits - -### AllFeatureProvider - -Bulk configuration resolution. Returns all (or filtered) resolved config values. - -```rust -#[async_trait] -pub trait AllFeatureProvider: Send + Sync { - async fn resolve_all_features( - &self, - context: &EvaluationContext, - ) -> Result>; - - async fn resolve_all_features_with_filter( - &self, - context: &EvaluationContext, - prefix_filter: Option<&[String]>, - ) -> Result>; -} -``` - -### FeatureExperimentMeta - -Experiment variant resolution. - -```rust -#[async_trait] -pub trait FeatureExperimentMeta: Send + Sync { - async fn get_applicable_variants( - &self, - context: &EvaluationContext, - ) -> Result>; -} -``` - -### SuperpositionDataSource - -Abstraction for raw data fetching. Each source implements its own filtering logic. - -```rust -pub struct ConfigData { - pub config: Config, - pub fetched_at: DateTime, -} - -pub struct ExperimentData { - pub experiments: Experiments, - pub experiment_groups: ExperimentGroups, - pub fetched_at: DateTime, -} - -#[async_trait] -pub trait SuperpositionDataSource: Send + Sync { - async fn fetch_config(&self) -> Result; - - async fn fetch_filtered_config( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result; - - async fn fetch_active_experiments(&self) -> Result>; - - async fn fetch_candidate_active_experiments( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result>; - - async fn fetch_matching_active_experiments( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result>; - - fn supports_experiments(&self) -> bool; - - async fn close(&self) -> Result<()>; -} -``` - -- `fetch_candidate_active_experiments` - partial context matching (uses `Contextual::filter_by_eval`) -- `fetch_matching_active_experiments` - exact context matching (uses `Contextual::filter_exact_match`) - -## Data Source Implementations - -### HttpDataSource - -Wraps `superposition_sdk::Client`. Takes `SuperpositionOptions`. - -- `fetch_config` → `client.get_config()` -- `fetch_filtered_config` → fetches full config, filters locally via `Config::filter_by_prefix` / `Config::filter_by_dimensions` -- `fetch_active_experiments` → `client.list_experiment()` + `client.list_experiment_groups()` -- `fetch_candidate_active_experiments` → fetches all, filters via `Contextual::filter_by_eval` -- `fetch_matching_active_experiments` → fetches all, filters via `Contextual::filter_exact_match` -- `supports_experiments` → `true` -- `close` → no-op - -### FileDataSource - -Reads TOML config via `superposition_core::toml::parse_toml_config`. Takes `PathBuf`. - -- `fetch_config` → reads file, parses TOML -- `fetch_filtered_config` → parses full config, filters locally -- All experiment methods → `Ok(None)` -- `supports_experiments` → `false` -- `close` → no-op - -## LocalResolutionProvider - -In-process resolver with primary + optional fallback data source. - -```rust -pub struct LocalResolutionProvider { - primary: Box, - fallback: Option>, - refresh_strategy: RefreshStrategy, - cached_config: Arc>>, - cached_experiments: Arc>>, - polling_task: RwLock>>, -} -``` - -### Initialization - -1. Fetch from primary data source -2. If primary fails and fallback exists, fetch from fallback -3. If both fail, return error -4. Start refresh strategy - -### Refresh Strategies - -- **Polling** - spawns tokio task that periodically fetches from primary -- **OnDemand** - lazy fetch with TTL; uses stale data if fetch fails (configurable) -- **Manual** - no automatic refresh; caller invokes `refresh()` explicitly - -On refresh failure: keep last known good data (never overwrite cache with error). - -### Trait Implementations - -- **AllFeatureProvider**: reads cached config, calls `eval_config`. If experiments cached, calls `get_applicable_variants` and injects `variantIds` into context before evaluation. -- **FeatureExperimentMeta**: reads cached experiments/groups, calls `get_applicable_variants`. -- **FeatureProvider** (OpenFeature): delegates to `resolve_all_features`, extracts single key. - -### Public API - -```rust -impl LocalResolutionProvider { - pub fn new(primary, fallback, refresh_strategy) -> Self; - pub async fn init(&self) -> Result<()>; - pub async fn refresh(&self) -> Result<()>; - pub async fn close(&self) -> Result<()>; -} -``` - -## SuperpositionAPIProvider (Remote Resolution) - -Sends context over network, gets resolved config back. - -```rust -pub struct SuperpositionAPIProvider { - options: SuperpositionOptions, - cache: Option>, -} -``` - -- Uses `superposition_sdk::Client` to call resolve APIs -- Optional local response cache keyed on hash of (context + targeting_key) with TTL eviction -- Implements `AllFeatureProvider`, `FeatureExperimentMeta`, and OpenFeature `FeatureProvider` - -## EvaluationContext - -Re-uses `open_feature::EvaluationContext` directly. No custom wrapper type. All traits and providers accept `&EvaluationContext` from the OpenFeature SDK. - -## Examples - -Three example binaries in `crates/superposition_provider/examples/`: - -### `local_http_example.rs` -LocalResolutionProvider with HTTP source, polling refresh. - -### `local_file_example.rs` -LocalResolutionProvider with TOML file source, on-demand refresh. - -### `local_with_fallback_example.rs` -LocalResolutionProvider with HTTP primary + TOML fallback. Demonstrates: -- Bulk resolution (`resolve_all_features`) -- Filtered resolution (`resolve_all_features_with_filter`) -- Experiment variants (`get_applicable_variants`) -- Manual refresh (`refresh()`) diff --git a/docs/plans/2026-02-14-configuration-resolver-plan.md b/docs/plans/2026-02-14-configuration-resolver-plan.md deleted file mode 100644 index e97031ad8..000000000 --- a/docs/plans/2026-02-14-configuration-resolver-plan.md +++ /dev/null @@ -1,1987 +0,0 @@ -# Configuration Resolver Implementation Plan - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** Refactor the `superposition_provider` crate to use a trait-based architecture with pluggable data sources (HTTP, File), supporting both local and remote configuration resolution. - -**Architecture:** Three core traits (`AllFeatureProvider`, `FeatureExperimentMeta`, `SuperpositionDataSource`) with two provider implementations (`LocalResolutionProvider`, `SuperpositionAPIProvider`). Data sources are pluggable via `SuperpositionDataSource` trait. All providers implement OpenFeature's `FeatureProvider`. - -**Tech Stack:** Rust, async-trait, tokio, serde_json, open-feature, superposition_core (eval_config, get_applicable_variants, parse_toml_config), superposition_sdk (HTTP client), superposition_types (Config, Contextual) - -**Design doc:** `docs/plans/2026-02-14-configuration-resolver-design.md` - ---- - -### Task 1: Define core traits (`traits.rs`) - -**Files:** -- Create: `crates/superposition_provider/src/traits.rs` -- Modify: `crates/superposition_provider/src/lib.rs` - -**Step 1: Create `traits.rs` with `AllFeatureProvider` and `FeatureExperimentMeta` traits** - -```rust -use async_trait::async_trait; -use open_feature::EvaluationContext; -use serde_json::{Map, Value}; - -use crate::types::Result; - -/// Trait for bulk configuration resolution -/// -/// Provides methods to resolve all feature flags at once, -/// which is more efficient than resolving them one by one. -#[async_trait] -pub trait AllFeatureProvider: Send + Sync { - /// Resolve all features for the given evaluation context - async fn resolve_all_features( - &self, - context: &EvaluationContext, - ) -> Result>; - - /// Resolve features matching prefix filters - /// - /// If prefix_filter is None, behaves like resolve_all_features - async fn resolve_all_features_with_filter( - &self, - context: &EvaluationContext, - prefix_filter: Option<&[String]>, - ) -> Result>; -} - -/// Trait for experiment metadata and variant resolution -#[async_trait] -pub trait FeatureExperimentMeta: Send + Sync { - /// Get applicable variant IDs for the given context - async fn get_applicable_variants( - &self, - context: &EvaluationContext, - ) -> Result>; -} -``` - -**Step 2: Add `traits` module to `lib.rs`** - -Add `pub mod traits;` to `crates/superposition_provider/src/lib.rs` and re-export: `pub use traits::*;` - -**Step 3: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles with no errors - -**Step 4: Commit** - -```bash -git add crates/superposition_provider/src/traits.rs crates/superposition_provider/src/lib.rs -git commit -m "feat: add AllFeatureProvider and FeatureExperimentMeta traits" -``` - ---- - -### Task 2: Define `SuperpositionDataSource` trait (`data_source.rs`) - -**Files:** -- Create: `crates/superposition_provider/src/data_source.rs` -- Modify: `crates/superposition_provider/src/lib.rs` - -**Step 1: Create `data_source.rs` with trait, `ConfigData`, and `ExperimentData`** - -```rust -use async_trait::async_trait; -use chrono::{DateTime, Utc}; -use serde_json::{Map, Value}; -use superposition_core::experiment::ExperimentGroups; -use superposition_core::Experiments; -use superposition_types::Config; - -use crate::types::Result; - -pub mod file; -pub mod http; - -/// Data fetched from a configuration source -#[derive(Debug, Clone)] -pub struct ConfigData { - pub config: Config, - pub fetched_at: DateTime, -} - -impl ConfigData { - pub fn new(config: Config) -> Self { - Self { - config, - fetched_at: Utc::now(), - } - } -} - -/// Experiment data fetched from a source -#[derive(Debug, Clone)] -pub struct ExperimentData { - pub experiments: Experiments, - pub experiment_groups: ExperimentGroups, - pub fetched_at: DateTime, -} - -impl ExperimentData { - pub fn new(experiments: Experiments, experiment_groups: ExperimentGroups) -> Self { - Self { - experiments, - experiment_groups, - fetched_at: Utc::now(), - } - } -} - -/// Trait for abstracting data sources for Superposition configuration and experiments -/// -/// Allows plugging different data sources (HTTP, File, Redis, etc.) -/// into the Superposition provider system. Each implementation handles -/// its own filtering logic. -#[async_trait] -pub trait SuperpositionDataSource: Send + Sync { - /// Fetch the latest configuration from the data source - async fn fetch_config(&self) -> Result; - - /// Fetch configuration with context/prefix filters - /// - /// Each data source implements its own filtering strategy. - /// HTTP may use server-side filtering; File filters after parse. - async fn fetch_filtered_config( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result; - - /// Fetch all active experiment data - /// - /// Returns None if the data source doesn't support experiments - async fn fetch_active_experiments(&self) -> Result>; - - /// Fetch active experiments filtered with partial context matching - /// - /// Uses partial/candidate matching - experiments whose context - /// could potentially match the given dimensions. - /// Returns None if the data source doesn't support experiments. - async fn fetch_candidate_active_experiments( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result>; - - /// Fetch active experiments filtered with exact context matching - /// - /// Uses exact matching - only experiments whose context - /// exactly matches the given dimensions. - /// Returns None if the data source doesn't support experiments. - async fn fetch_matching_active_experiments( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result>; - - /// Check if this data source supports experiments - fn supports_experiments(&self) -> bool; - - /// Close and cleanup resources used by this data source - async fn close(&self) -> Result<()>; -} -``` - -**Step 2: Create placeholder files for submodules** - -Create empty `crates/superposition_provider/src/data_source/http.rs` and `crates/superposition_provider/src/data_source/file.rs` (just comments for now so it compiles). - -**Step 3: Add `data_source` module to `lib.rs`** - -Add `pub mod data_source;` and re-export: `pub use data_source::{ConfigData, ExperimentData, SuperpositionDataSource};` - -**Step 4: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles with no errors - -**Step 5: Commit** - -```bash -git add crates/superposition_provider/src/data_source.rs crates/superposition_provider/src/data_source/ crates/superposition_provider/src/lib.rs -git commit -m "feat: add SuperpositionDataSource trait with ConfigData and ExperimentData" -``` - ---- - -### Task 3: Implement `HttpDataSource` - -**Files:** -- Modify: `crates/superposition_provider/src/data_source/http.rs` - -**Reference files:** -- `crates/superposition_provider/src/client.rs` (existing HTTP fetch logic in `CacConfig::get_config_static`, `ExperimentationConfig::get_experiments_static`, `ExperimentationConfig::get_experiment_groups_static`) -- `crates/superposition_provider/src/utils.rs` (`ConversionUtils::convert_get_config_response`, `convert_experiments_response`, `convert_experiment_groups_response`) - -**Step 1: Implement `HttpDataSource` struct and `SuperpositionDataSource` trait** - -```rust -use std::collections::HashSet; - -use async_trait::async_trait; -use log::info; -use serde_json::{Map, Value}; -use superposition_types::logic::{apply, partial_apply}; - -use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; -use crate::types::{Result, SuperpositionError, SuperpositionOptions}; -use crate::utils::ConversionUtils; - -/// HTTP-based data source using the Superposition SDK -/// -/// Fetches configuration and experiment data from the Superposition -/// service over HTTP. -pub struct HttpDataSource { - options: SuperpositionOptions, -} - -impl HttpDataSource { - pub fn new(options: SuperpositionOptions) -> Self { - Self { options } - } - - fn create_client(&self) -> superposition_sdk::Client { - use superposition_sdk::{Client, Config as SdkConfig}; - - let sdk_config = SdkConfig::builder() - .endpoint_url(&self.options.endpoint) - .bearer_token(self.options.token.clone().into()) - .behavior_version_latest() - .build(); - - Client::from_conf(sdk_config) - } - - async fn fetch_experiments_and_groups(&self) -> Result { - use superposition_sdk::types::ExperimentStatusType; - - let client = self.create_client(); - - let (experiments_result, groups_result) = tokio::join!( - client - .list_experiment() - .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .all(true) - .status(ExperimentStatusType::Created) - .status(ExperimentStatusType::Inprogress) - .send(), - client - .list_experiment_groups() - .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .all(true) - .send() - ); - - let experiments_response = experiments_result.map_err(|e| { - SuperpositionError::NetworkError(format!("Failed to list experiments: {}", e)) - })?; - let groups_response = groups_result.map_err(|e| { - SuperpositionError::NetworkError(format!("Failed to list experiment groups: {}", e)) - })?; - - let experiments = ConversionUtils::convert_experiments_response(&experiments_response)?; - let groups = ConversionUtils::convert_experiment_groups_response(&groups_response)?; - - Ok(ExperimentData::new(experiments, groups)) - } - - /// Filter experiments by partial context match (any dimension matches) - fn filter_experiments_candidate( - exp_data: &ExperimentData, - context: &Map, - ) -> ExperimentData { - let filtered_experiments = exp_data - .experiments - .iter() - .filter(|exp| partial_apply(&exp.context, context)) - .cloned() - .collect(); - - let filtered_groups = exp_data - .experiment_groups - .iter() - .filter(|group| partial_apply(&group.context, context)) - .cloned() - .collect(); - - ExperimentData::new(filtered_experiments, filtered_groups) - } - - /// Filter experiments by exact context match (all dimensions must match) - fn filter_experiments_matching( - exp_data: &ExperimentData, - context: &Map, - ) -> ExperimentData { - let filtered_experiments = exp_data - .experiments - .iter() - .filter(|exp| apply(&exp.context, context)) - .cloned() - .collect(); - - let filtered_groups = exp_data - .experiment_groups - .iter() - .filter(|group| apply(&group.context, context)) - .cloned() - .collect(); - - ExperimentData::new(filtered_experiments, filtered_groups) - } - - /// Filter experiments by prefix - keep experiments that have variants - /// with override keys matching any of the given prefixes - fn filter_experiments_by_prefix( - exp_data: &ExperimentData, - prefixes: &[String], - ) -> ExperimentData { - let filtered_experiments = exp_data - .experiments - .iter() - .filter(|exp| { - exp.variants.iter().any(|variant| { - let overrides: Map = variant.overrides.clone().into(); - overrides.keys().any(|key| { - prefixes.iter().any(|prefix| key.starts_with(prefix)) - }) - }) - }) - .cloned() - .collect(); - - // Keep all groups - they reference experiments by ID - ExperimentData::new(filtered_experiments, exp_data.experiment_groups.clone()) - } -} - -#[async_trait] -impl SuperpositionDataSource for HttpDataSource { - async fn fetch_config(&self) -> Result { - let client = self.create_client(); - - info!("HttpDataSource: fetching config"); - - let response = client - .get_config() - .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id) - .send() - .await - .map_err(|e| { - SuperpositionError::NetworkError(format!("Failed to get config: {}", e)) - })?; - - let config = ConversionUtils::convert_get_config_response(&response)?; - Ok(ConfigData::new(config)) - } - - async fn fetch_filtered_config( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result { - let config_data = self.fetch_config().await?; - let mut config = config_data.config; - - if let Some(ctx) = context { - if !ctx.is_empty() { - config = config.filter_by_dimensions(ctx); - } - } - - if let Some(prefixes) = prefix_filter { - if !prefixes.is_empty() { - config = config.filter_by_prefix(&HashSet::from_iter(prefixes.iter().cloned())); - } - } - - Ok(ConfigData::new(config)) - } - - async fn fetch_active_experiments(&self) -> Result> { - let data = self.fetch_experiments_and_groups().await?; - Ok(Some(data)) - } - - async fn fetch_candidate_active_experiments( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result> { - let mut data = self.fetch_experiments_and_groups().await?; - - if let Some(ctx) = context { - if !ctx.is_empty() { - data = Self::filter_experiments_candidate(&data, ctx); - } - } - - if let Some(prefixes) = prefix_filter { - if !prefixes.is_empty() { - data = Self::filter_experiments_by_prefix(&data, prefixes); - } - } - - Ok(Some(data)) - } - - async fn fetch_matching_active_experiments( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result> { - let mut data = self.fetch_experiments_and_groups().await?; - - if let Some(ctx) = context { - if !ctx.is_empty() { - data = Self::filter_experiments_matching(&data, ctx); - } - } - - if let Some(prefixes) = prefix_filter { - if !prefixes.is_empty() { - data = Self::filter_experiments_by_prefix(&data, prefixes); - } - } - - Ok(Some(data)) - } - - fn supports_experiments(&self) -> bool { - true - } - - async fn close(&self) -> Result<()> { - Ok(()) - } -} -``` - -**Step 2: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles with no errors (may need minor adjustments for `partial_apply` / `apply` import paths) - -**Step 3: Commit** - -```bash -git add crates/superposition_provider/src/data_source/http.rs -git commit -m "feat: implement HttpDataSource for SuperpositionDataSource trait" -``` - ---- - -### Task 4: Implement `FileDataSource` - -**Files:** -- Modify: `crates/superposition_provider/src/data_source/file.rs` - -**Reference files:** -- `crates/superposition_core/src/toml.rs` (`parse_toml_config`) - -**Step 1: Implement `FileDataSource`** - -```rust -use std::collections::HashSet; -use std::path::PathBuf; - -use async_trait::async_trait; -use log::info; -use serde_json::{Map, Value}; -use superposition_core::toml::parse_toml_config; - -use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; -use crate::types::{Result, SuperpositionError}; - -/// File-based data source using TOML configuration files -/// -/// Reads configuration from a TOML file using `superposition_core::toml::parse_toml_config`. -/// Does not support experiments - all experiment methods return `Ok(None)`. -pub struct FileDataSource { - file_path: PathBuf, -} - -impl FileDataSource { - pub fn new(file_path: PathBuf) -> Self { - Self { file_path } - } -} - -#[async_trait] -impl SuperpositionDataSource for FileDataSource { - async fn fetch_config(&self) -> Result { - info!("FileDataSource: reading config from {:?}", self.file_path); - - let content = tokio::fs::read_to_string(&self.file_path) - .await - .map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to read config file {:?}: {}", - self.file_path, e - )) - })?; - - let config = parse_toml_config(&content).map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to parse TOML config from {:?}: {}", - self.file_path, e - )) - })?; - - Ok(ConfigData::new(config)) - } - - async fn fetch_filtered_config( - &self, - context: Option<&Map>, - prefix_filter: Option<&[String]>, - ) -> Result { - let config_data = self.fetch_config().await?; - let mut config = config_data.config; - - if let Some(ctx) = context { - if !ctx.is_empty() { - config = config.filter_by_dimensions(ctx); - } - } - - if let Some(prefixes) = prefix_filter { - if !prefixes.is_empty() { - config = config.filter_by_prefix(&HashSet::from_iter(prefixes.iter().cloned())); - } - } - - Ok(ConfigData::new(config)) - } - - async fn fetch_active_experiments(&self) -> Result> { - Ok(None) - } - - async fn fetch_candidate_active_experiments( - &self, - _context: Option<&Map>, - _prefix_filter: Option<&[String]>, - ) -> Result> { - Ok(None) - } - - async fn fetch_matching_active_experiments( - &self, - _context: Option<&Map>, - _prefix_filter: Option<&[String]>, - ) -> Result> { - Ok(None) - } - - fn supports_experiments(&self) -> bool { - false - } - - async fn close(&self) -> Result<()> { - Ok(()) - } -} -``` - -**Step 2: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles with no errors - -**Step 3: Commit** - -```bash -git add crates/superposition_provider/src/data_source/file.rs -git commit -m "feat: implement FileDataSource for SuperpositionDataSource trait" -``` - ---- - -### Task 5: Add `Manual` variant to `RefreshStrategy` - -**Files:** -- Modify: `crates/superposition_provider/src/types.rs` - -**Step 1: Add `Manual` variant to `RefreshStrategy` enum** - -Add to the existing `RefreshStrategy` enum in `types.rs`: - -```rust -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum RefreshStrategy { - Polling(PollingStrategy), - OnDemand(OnDemandStrategy), - Manual, -} -``` - -**Step 2: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles (existing match statements in `client.rs` will need a `Manual` arm - add a no-op arm if needed) - -**Step 3: Commit** - -```bash -git add crates/superposition_provider/src/types.rs crates/superposition_provider/src/client.rs -git commit -m "feat: add Manual variant to RefreshStrategy" -``` - ---- - -### Task 6: Implement `LocalResolutionProvider` - -**Files:** -- Create: `crates/superposition_provider/src/local_provider.rs` -- Modify: `crates/superposition_provider/src/lib.rs` - -**Reference files:** -- `crates/superposition_provider/src/provider.rs` (existing `SuperpositionProvider` for pattern reference) -- `crates/superposition_provider/src/client.rs` (existing refresh/polling logic) -- `crates/superposition_core/src/config.rs` (`eval_config`) -- `crates/superposition_core/src/experiment.rs` (`get_applicable_variants`) - -**Step 1: Create `local_provider.rs` with struct and construction/init/refresh/close** - -```rust -use std::collections::HashMap; -use std::sync::Arc; - -use async_trait::async_trait; -use log::{debug, error, info, warn}; -use open_feature::{ - provider::{FeatureProvider, ProviderMetadata, ProviderStatus, ResolutionDetails}, - EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, -}; -use serde_json::{Map, Value}; -use superposition_core::{eval_config, get_applicable_variants, MergeStrategy}; -use superposition_types::DimensionInfo; -use tokio::sync::RwLock; -use tokio::task::JoinHandle; -use tokio::time::{sleep, Duration}; - -use crate::data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; -use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; -use crate::types::*; -use crate::utils::ConversionUtils; - -/// Local (in-process) resolution provider -/// -/// Caches raw configuration and experiment data from a primary data source -/// (with optional fallback), and resolves configuration locally using -/// `superposition_core::eval_config`. -pub struct LocalResolutionProvider { - primary: Arc, - fallback: Option>, - refresh_strategy: RefreshStrategy, - cached_config: Arc>>, - cached_experiments: Arc>>, - polling_task: RwLock>>, - metadata: ProviderMetadata, - status: RwLock, -} - -impl LocalResolutionProvider { - pub fn new( - primary: Box, - fallback: Option>, - refresh_strategy: RefreshStrategy, - ) -> Self { - Self { - primary: Arc::from(primary), - fallback: fallback.map(Arc::from), - refresh_strategy, - cached_config: Arc::new(RwLock::new(None)), - cached_experiments: Arc::new(RwLock::new(None)), - polling_task: RwLock::new(None), - metadata: ProviderMetadata { - name: "LocalResolutionProvider".to_string(), - }, - status: RwLock::new(ProviderStatus::NotReady), - } - } - - /// Initialize the provider: fetch initial data and start refresh strategy - pub async fn init(&self) -> Result<()> { - info!("Initializing LocalResolutionProvider..."); - - // Try primary first - let config_result = self.primary.fetch_config().await; - let exp_result = self.primary.fetch_active_experiments().await; - - match config_result { - Ok(config_data) => { - let mut cached = self.cached_config.write().await; - *cached = Some(config_data); - info!("Config fetched from primary data source"); - } - Err(primary_err) => { - warn!("Primary data source failed: {}", primary_err); - // Try fallback - if let Some(fallback) = &self.fallback { - match fallback.fetch_config().await { - Ok(config_data) => { - let mut cached = self.cached_config.write().await; - *cached = Some(config_data); - info!("Config fetched from fallback data source"); - } - Err(fallback_err) => { - error!("Fallback data source also failed: {}", fallback_err); - return Err(SuperpositionError::ConfigError(format!( - "Both primary ({}) and fallback ({}) data sources failed", - primary_err, fallback_err - ))); - } - } - } else { - return Err(primary_err); - } - } - } - - // Handle experiments (best-effort, only if primary supports them) - match exp_result { - Ok(Some(exp_data)) => { - let mut cached = self.cached_experiments.write().await; - *cached = Some(exp_data); - info!("Experiments fetched from primary data source"); - } - Ok(None) => { - debug!("Primary data source does not support experiments"); - } - Err(e) => { - warn!("Failed to fetch experiments from primary: {}", e); - // Try fallback for experiments - if let Some(fallback) = &self.fallback { - if fallback.supports_experiments() { - match fallback.fetch_active_experiments().await { - Ok(Some(exp_data)) => { - let mut cached = self.cached_experiments.write().await; - *cached = Some(exp_data); - info!("Experiments fetched from fallback data source"); - } - _ => { - warn!("Fallback also failed to fetch experiments"); - } - } - } - } - } - } - - // Start refresh strategy - match &self.refresh_strategy { - RefreshStrategy::Polling(strategy) => { - info!("Starting polling with interval={}s", strategy.interval); - let task = self.start_polling(strategy.interval).await; - let mut polling_task = self.polling_task.write().await; - *polling_task = Some(task); - } - RefreshStrategy::OnDemand(strategy) => { - info!("Using on-demand strategy with ttl={}s", strategy.ttl); - } - RefreshStrategy::Manual => { - info!("Using manual refresh strategy"); - } - } - - let mut status = self.status.write().await; - *status = ProviderStatus::Ready; - - info!("LocalResolutionProvider initialized successfully"); - Ok(()) - } - - /// Manually refresh data from the primary data source - pub async fn refresh(&self) -> Result<()> { - info!("Manual refresh triggered"); - self.do_refresh().await - } - - /// Close the provider and clean up resources - pub async fn close(&self) -> Result<()> { - let mut polling_task = self.polling_task.write().await; - if let Some(task) = polling_task.take() { - task.abort(); - } - - self.primary.close().await?; - if let Some(fallback) = &self.fallback { - fallback.close().await?; - } - - let mut cached_config = self.cached_config.write().await; - *cached_config = None; - let mut cached_experiments = self.cached_experiments.write().await; - *cached_experiments = None; - - let mut status = self.status.write().await; - *status = ProviderStatus::NotReady; - - Ok(()) - } - - async fn do_refresh(&self) -> Result<()> { - // Fetch config - keep last known good on failure - match self.primary.fetch_config().await { - Ok(config_data) => { - let mut cached = self.cached_config.write().await; - *cached = Some(config_data); - debug!("Config refreshed from primary"); - } - Err(e) => { - warn!("Refresh failed for config, keeping last known good: {}", e); - } - } - - // Fetch experiments - keep last known good on failure - if self.primary.supports_experiments() { - match self.primary.fetch_active_experiments().await { - Ok(Some(exp_data)) => { - let mut cached = self.cached_experiments.write().await; - *cached = Some(exp_data); - debug!("Experiments refreshed from primary"); - } - Ok(None) => {} - Err(e) => { - warn!( - "Refresh failed for experiments, keeping last known good: {}", - e - ); - } - } - } - - Ok(()) - } - - async fn start_polling(&self, interval: u64) -> JoinHandle<()> { - let primary = self.primary.clone(); - let cached_config = self.cached_config.clone(); - let cached_experiments = self.cached_experiments.clone(); - - tokio::spawn(async move { - loop { - sleep(Duration::from_secs(interval)).await; - - match primary.fetch_config().await { - Ok(config_data) => { - let mut cached = cached_config.write().await; - *cached = Some(config_data); - debug!("Config updated via polling"); - } - Err(e) => { - error!("Polling config refresh failed: {}", e); - } - } - - if primary.supports_experiments() { - match primary.fetch_active_experiments().await { - Ok(Some(exp_data)) => { - let mut cached = cached_experiments.write().await; - *cached = Some(exp_data); - debug!("Experiments updated via polling"); - } - Ok(None) => {} - Err(e) => { - error!("Polling experiments refresh failed: {}", e); - } - } - } - } - }) - } - - async fn ensure_fresh_data(&self) -> Result<()> { - if let RefreshStrategy::OnDemand(strategy) = &self.refresh_strategy { - let should_refresh = { - let cached = self.cached_config.read().await; - match cached.as_ref() { - Some(data) => { - let elapsed = chrono::Utc::now() - data.fetched_at; - elapsed.num_seconds() > strategy.ttl as i64 - } - None => true, - } - }; - - if should_refresh { - debug!("On-demand TTL expired, refreshing"); - if let Err(e) = self.do_refresh().await { - if !strategy.use_stale_on_error.unwrap_or(false) { - return Err(e); - } - warn!("On-demand refresh failed, using stale data: {}", e); - } - } - } - Ok(()) - } - - fn get_context_from_evaluation_context( - evaluation_context: &EvaluationContext, - ) -> (Map, Option) { - let context = evaluation_context - .custom_fields - .iter() - .map(|(k, v)| { - ( - k.clone(), - ConversionUtils::convert_evaluation_context_value_to_serde_value(v), - ) - }) - .collect(); - - (context, evaluation_context.targeting_key.clone()) - } - - async fn get_dimensions_info(&self) -> HashMap { - let cached = self.cached_config.read().await; - cached - .as_ref() - .map(|d| d.config.dimensions.clone()) - .unwrap_or_default() - } - - async fn eval_with_context( - &self, - context: &EvaluationContext, - prefix_filter: Option<&[String]>, - ) -> Result> { - self.ensure_fresh_data().await?; - - let (mut query_data, targeting_key) = - Self::get_context_from_evaluation_context(context); - - let dimensions_info = self.get_dimensions_info().await; - - // Get experiment variants if available - let cached_experiments = self.cached_experiments.read().await; - if let Some(exp_data) = cached_experiments.as_ref() { - let variant_ids = get_applicable_variants( - &dimensions_info, - exp_data.experiments.clone(), - &exp_data.experiment_groups, - &query_data, - &targeting_key.unwrap_or_default(), - prefix_filter.map(|p| p.to_vec()), - ) - .map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to get applicable variants: {}", - e - )) - })?; - - query_data.insert( - "variantIds".to_string(), - Value::Array(variant_ids.into_iter().map(Value::String).collect()), - ); - } - drop(cached_experiments); - - // Evaluate config - let cached_config = self.cached_config.read().await; - match cached_config.as_ref() { - Some(config_data) => eval_config( - (*config_data.config.default_configs).clone(), - &config_data.config.contexts, - &config_data.config.overrides, - &config_data.config.dimensions, - &query_data, - MergeStrategy::MERGE, - prefix_filter.map(|p| p.to_vec()), - ) - .map_err(|e| { - SuperpositionError::ConfigError(format!("Failed to evaluate config: {}", e)) - }), - None => Err(SuperpositionError::ConfigError( - "No cached config available".into(), - )), - } - } -} -``` - -**Step 2: Implement `AllFeatureProvider` for `LocalResolutionProvider`** - -```rust -#[async_trait] -impl AllFeatureProvider for LocalResolutionProvider { - async fn resolve_all_features( - &self, - context: &EvaluationContext, - ) -> Result> { - self.eval_with_context(context, None).await - } - - async fn resolve_all_features_with_filter( - &self, - context: &EvaluationContext, - prefix_filter: Option<&[String]>, - ) -> Result> { - self.eval_with_context(context, prefix_filter).await - } -} -``` - -**Step 3: Implement `FeatureExperimentMeta` for `LocalResolutionProvider`** - -```rust -#[async_trait] -impl FeatureExperimentMeta for LocalResolutionProvider { - async fn get_applicable_variants( - &self, - context: &EvaluationContext, - ) -> Result> { - self.ensure_fresh_data().await?; - - let (query_data, targeting_key) = - Self::get_context_from_evaluation_context(context); - let dimensions_info = self.get_dimensions_info().await; - - let cached_experiments = self.cached_experiments.read().await; - match cached_experiments.as_ref() { - Some(exp_data) => get_applicable_variants( - &dimensions_info, - exp_data.experiments.clone(), - &exp_data.experiment_groups, - &query_data, - &targeting_key.unwrap_or_default(), - None, - ) - .map_err(|e| { - SuperpositionError::ConfigError(format!( - "Failed to get applicable variants: {}", - e - )) - }), - None => Ok(vec![]), - } - } -} -``` - -**Step 4: Implement `FeatureProvider` (OpenFeature) for `LocalResolutionProvider`** - -Follow the same pattern as `crates/superposition_provider/src/provider.rs`: - -```rust -#[async_trait] -impl FeatureProvider for LocalResolutionProvider { - async fn initialize(&mut self, _context: &EvaluationContext) { - info!("Initializing LocalResolutionProvider via OpenFeature..."); - { - let mut status = self.status.write().await; - *status = ProviderStatus::NotReady; - } - if (self.init().await).is_err() { - let mut status = self.status.write().await; - *status = ProviderStatus::Error; - return; - } - let mut status = self.status.write().await; - *status = ProviderStatus::Ready; - } - - async fn resolve_bool_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(bool_val) = value.as_bool() { - return Ok(ResolutionDetails::new(bool_val)); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found in configuration".to_string()), - }) - } - Err(e) => { - error!("Error evaluating boolean flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error evaluating flag: {}", e)), - }) - } - } - } - - async fn resolve_string_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(str_val) = value.as_str() { - return Ok(ResolutionDetails::new(str_val.to_owned())); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found in configuration".to_string()), - }) - } - Err(e) => { - error!("Error evaluating string flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error evaluating flag: {}", e)), - }) - } - } - } - - async fn resolve_int_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(int_val) = value.as_i64() { - return Ok(ResolutionDetails::new(int_val)); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found in configuration".to_string()), - }) - } - Err(e) => { - error!("Error evaluating integer flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error evaluating flag: {}", e)), - }) - } - } - } - - async fn resolve_float_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(float_val) = value.as_f64() { - return Ok(ResolutionDetails::new(float_val)); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found in configuration".to_string()), - }) - } - Err(e) => { - error!("Error evaluating float flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error evaluating flag: {}", e)), - }) - } - } - } - - async fn resolve_struct_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - match ConversionUtils::serde_value_to_struct_value(value) { - Ok(struct_value) => { - return Ok(ResolutionDetails::new(struct_value)); - } - Err(e) => { - return Err(EvaluationError { - code: EvaluationErrorCode::ParseError, - message: Some(format!("Failed to parse struct value: {}", e)), - }); - } - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found in configuration".to_string()), - }) - } - Err(e) => { - error!("Error evaluating struct flag {}: {}", flag_key, e); - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error evaluating flag: {}", e)), - }) - } - } - } - - fn metadata(&self) -> &ProviderMetadata { - &self.metadata - } - - fn status(&self) -> ProviderStatus { - match self.status.try_read() { - Ok(status) => match *status { - ProviderStatus::Ready => ProviderStatus::Ready, - ProviderStatus::Error => ProviderStatus::Error, - ProviderStatus::NotReady => ProviderStatus::NotReady, - ProviderStatus::STALE => ProviderStatus::STALE, - }, - Err(_) => ProviderStatus::NotReady, - } - } -} -``` - -**Step 5: Add module to `lib.rs`** - -Add `pub mod local_provider;` and re-export: `pub use local_provider::LocalResolutionProvider;` - -**Step 6: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles with no errors - -**Step 7: Commit** - -```bash -git add crates/superposition_provider/src/local_provider.rs crates/superposition_provider/src/lib.rs -git commit -m "feat: implement LocalResolutionProvider with primary/fallback and refresh strategies" -``` - ---- - -### Task 7: Implement `SuperpositionAPIProvider` (Remote Resolution) - -**Files:** -- Create: `crates/superposition_provider/src/remote_provider.rs` -- Modify: `crates/superposition_provider/src/lib.rs` - -**Step 1: Create `remote_provider.rs`** - -Note: This provider calls a resolve API endpoint that accepts context and returns already-resolved config. The exact SDK method for remote resolution needs to be verified against the `superposition_sdk` crate. If a dedicated resolve endpoint exists, use it. Otherwise, this provider can use `get_config` + local eval as a fallback (similar to LocalResolutionProvider but without caching raw data). - -```rust -use std::collections::HashMap; -use std::sync::Arc; -use std::time::{Duration, Instant}; - -use async_trait::async_trait; -use log::{debug, error, info}; -use open_feature::{ - provider::{FeatureProvider, ProviderMetadata, ProviderStatus, ResolutionDetails}, - EvaluationContext, EvaluationError, EvaluationErrorCode, EvaluationResult, StructValue, -}; -use serde_json::{Map, Value}; -use tokio::sync::RwLock; - -use crate::traits::{AllFeatureProvider, FeatureExperimentMeta}; -use crate::types::*; -use crate::utils::ConversionUtils; - -struct CacheEntry { - value: Map, - created_at: Instant, -} - -struct ResponseCache { - entries: HashMap, - max_entries: usize, - ttl: Duration, -} - -impl ResponseCache { - fn new(max_entries: usize, ttl: Duration) -> Self { - Self { - entries: HashMap::new(), - max_entries, - ttl, - } - } - - fn get(&self, key: &str) -> Option<&Map> { - self.entries.get(key).and_then(|entry| { - if entry.created_at.elapsed() < self.ttl { - Some(&entry.value) - } else { - None - } - }) - } - - fn put(&mut self, key: String, value: Map) { - // Evict expired entries if at capacity - if self.entries.len() >= self.max_entries { - self.entries - .retain(|_, entry| entry.created_at.elapsed() < self.ttl); - } - // If still at capacity, remove oldest - if self.entries.len() >= self.max_entries { - if let Some(oldest_key) = self - .entries - .iter() - .min_by_key(|(_, entry)| entry.created_at) - .map(|(k, _)| k.clone()) - { - self.entries.remove(&oldest_key); - } - } - self.entries.insert( - key, - CacheEntry { - value, - created_at: Instant::now(), - }, - ); - } - - fn cache_key(context: &EvaluationContext) -> String { - // Hash the context for cache key - let mut parts: Vec = Vec::new(); - if let Some(tk) = &context.targeting_key { - parts.push(format!("tk:{}", tk)); - } - let mut field_keys: Vec<&String> = context.custom_fields.keys().collect(); - field_keys.sort(); - for key in field_keys { - let value = &context.custom_fields[key]; - parts.push(format!( - "{}:{}", - key, - ConversionUtils::convert_evaluation_context_value_to_serde_value(value) - )); - } - parts.join("|") - } -} - -/// Remote resolution provider using the Superposition API -/// -/// Sends evaluation context over the network and receives resolved -/// configuration from the Superposition service. -pub struct SuperpositionAPIProvider { - options: SuperpositionOptions, - cache: Option>>, - metadata: ProviderMetadata, - status: RwLock, -} - -impl SuperpositionAPIProvider { - pub fn new(options: SuperpositionOptions) -> Self { - Self { - options, - cache: None, - metadata: ProviderMetadata { - name: "SuperpositionAPIProvider".to_string(), - }, - status: RwLock::new(ProviderStatus::Ready), - } - } - - pub fn with_cache(options: SuperpositionOptions, cache_options: CacheOptions) -> Self { - let cache = ResponseCache::new( - cache_options.size.unwrap_or(1000), - Duration::from_secs(cache_options.ttl.unwrap_or(300)), - ); - Self { - options, - cache: Some(Arc::new(RwLock::new(cache))), - metadata: ProviderMetadata { - name: "SuperpositionAPIProvider".to_string(), - }, - status: RwLock::new(ProviderStatus::Ready), - } - } - - fn create_client(&self) -> superposition_sdk::Client { - use superposition_sdk::{Client, Config as SdkConfig}; - - let sdk_config = SdkConfig::builder() - .endpoint_url(&self.options.endpoint) - .bearer_token(self.options.token.clone().into()) - .behavior_version_latest() - .build(); - - Client::from_conf(sdk_config) - } - - async fn resolve_remote( - &self, - context: &EvaluationContext, - prefix_filter: Option<&[String]>, - ) -> Result> { - // Check cache first - if let Some(cache) = &self.cache { - let cache_key = ResponseCache::cache_key(context); - let cache_read = cache.read().await; - if let Some(cached) = cache_read.get(&cache_key) { - debug!("Cache hit for context"); - let result = if let Some(prefixes) = prefix_filter { - cached - .iter() - .filter(|(k, _)| prefixes.iter().any(|p| k.starts_with(p))) - .map(|(k, v)| (k.clone(), v.clone())) - .collect() - } else { - cached.clone() - }; - return Ok(result); - } - drop(cache_read); - } - - let client = self.create_client(); - - let (query_data, targeting_key) = Self::get_context_from_evaluation_context(context); - - // Use the SDK resolve API - // Build query parameters from the context - let mut request = client - .get_resolved_config() - .workspace_id(&self.options.workspace_id) - .org_id(&self.options.org_id); - - // Add targeting key if present - if let Some(tk) = &targeting_key { - request = request.targeting_key(tk.as_str()); - } - - // Add context fields as query parameters - // The resolve API typically accepts context as a JSON body or query params - // Using the SDK's built-in method for passing context - for (key, value) in &query_data { - request = request.context(key.clone(), value.to_string()); - } - - if let Some(prefixes) = prefix_filter { - for prefix in prefixes { - request = request.filter_keys(prefix.clone()); - } - } - - let response = request.send().await.map_err(|e| { - SuperpositionError::NetworkError(format!("Failed to resolve config: {}", e)) - })?; - - // Convert response to Map - let config = ConversionUtils::convert_get_config_response(&response)?; - - // For remote resolution, the response should already be resolved - // We return the default_configs as the resolved values - let result: Map = (*config.default_configs).clone(); - - // Cache the result - if let Some(cache) = &self.cache { - let cache_key = ResponseCache::cache_key(context); - let mut cache_write = cache.write().await; - cache_write.put(cache_key, result.clone()); - } - - Ok(result) - } - - fn get_context_from_evaluation_context( - evaluation_context: &EvaluationContext, - ) -> (Map, Option) { - let context = evaluation_context - .custom_fields - .iter() - .map(|(k, v)| { - ( - k.clone(), - ConversionUtils::convert_evaluation_context_value_to_serde_value(v), - ) - }) - .collect(); - - (context, evaluation_context.targeting_key.clone()) - } -} - -#[async_trait] -impl AllFeatureProvider for SuperpositionAPIProvider { - async fn resolve_all_features( - &self, - context: &EvaluationContext, - ) -> Result> { - self.resolve_remote(context, None).await - } - - async fn resolve_all_features_with_filter( - &self, - context: &EvaluationContext, - prefix_filter: Option<&[String]>, - ) -> Result> { - self.resolve_remote(context, prefix_filter).await - } -} - -#[async_trait] -impl FeatureExperimentMeta for SuperpositionAPIProvider { - async fn get_applicable_variants( - &self, - _context: &EvaluationContext, - ) -> Result> { - // Remote resolution handles experiments server-side - // The resolved config already includes experiment results - // Return empty - variants are already applied in the resolved config - Ok(vec![]) - } -} - -#[async_trait] -impl FeatureProvider for SuperpositionAPIProvider { - async fn initialize(&mut self, _context: &EvaluationContext) { - let mut status = self.status.write().await; - *status = ProviderStatus::Ready; - } - - async fn resolve_bool_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(bool_val) = value.as_bool() { - return Ok(ResolutionDetails::new(bool_val)); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found".to_string()), - }) - } - Err(e) => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error: {}", e)), - }), - } - } - - async fn resolve_string_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(str_val) = value.as_str() { - return Ok(ResolutionDetails::new(str_val.to_owned())); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found".to_string()), - }) - } - Err(e) => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error: {}", e)), - }), - } - } - - async fn resolve_int_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(int_val) = value.as_i64() { - return Ok(ResolutionDetails::new(int_val)); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found".to_string()), - }) - } - Err(e) => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error: {}", e)), - }), - } - } - - async fn resolve_float_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - if let Some(float_val) = value.as_f64() { - return Ok(ResolutionDetails::new(float_val)); - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found".to_string()), - }) - } - Err(e) => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error: {}", e)), - }), - } - } - - async fn resolve_struct_value( - &self, - flag_key: &str, - evaluation_context: &EvaluationContext, - ) -> EvaluationResult> { - match self.resolve_all_features(evaluation_context).await { - Ok(config) => { - if let Some(value) = config.get(flag_key) { - match ConversionUtils::serde_value_to_struct_value(value) { - Ok(struct_value) => { - return Ok(ResolutionDetails::new(struct_value)); - } - Err(e) => { - return Err(EvaluationError { - code: EvaluationErrorCode::ParseError, - message: Some(format!("Failed to parse struct value: {}", e)), - }); - } - } - } - Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some("Flag not found".to_string()), - }) - } - Err(e) => Err(EvaluationError { - code: EvaluationErrorCode::FlagNotFound, - message: Some(format!("Error: {}", e)), - }), - } - } - - fn metadata(&self) -> &ProviderMetadata { - &self.metadata - } - - fn status(&self) -> ProviderStatus { - match self.status.try_read() { - Ok(status) => match *status { - ProviderStatus::Ready => ProviderStatus::Ready, - ProviderStatus::Error => ProviderStatus::Error, - ProviderStatus::NotReady => ProviderStatus::NotReady, - ProviderStatus::STALE => ProviderStatus::STALE, - }, - Err(_) => ProviderStatus::NotReady, - } - } -} -``` - -**Step 2: Add module to `lib.rs`** - -Add `pub mod remote_provider;` and re-export: `pub use remote_provider::SuperpositionAPIProvider;` - -**Step 3: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles (the `get_resolved_config` SDK method may need adjustment based on actual SDK API - check `superposition_sdk` for the correct method name and parameters) - -**Step 4: Commit** - -```bash -git add crates/superposition_provider/src/remote_provider.rs crates/superposition_provider/src/lib.rs -git commit -m "feat: implement SuperpositionAPIProvider for remote resolution" -``` - ---- - -### Task 8: Update `lib.rs` with final re-exports - -**Files:** -- Modify: `crates/superposition_provider/src/lib.rs` - -**Step 1: Update `lib.rs` to export all new modules** - -```rust -// Existing modules (kept for comparison) -pub mod client; -pub mod provider; -pub mod types; -pub mod utils; - -// New trait-based architecture -pub mod data_source; -pub mod local_provider; -pub mod remote_provider; -pub mod traits; - -// Re-exports - existing -pub use client::*; -pub use provider::*; -pub use types::*; - -// Re-exports - new -pub use data_source::{ConfigData, ExperimentData, SuperpositionDataSource}; -pub use local_provider::LocalResolutionProvider; -pub use remote_provider::SuperpositionAPIProvider; -pub use traits::*; - -pub use open_feature::{ - provider::{ProviderMetadata, ProviderStatus, ResolutionDetails}, - EvaluationContext, -}; -``` - -**Step 2: Verify it compiles** - -Run: `cargo check -p superposition_provider` -Expected: compiles with no errors - -**Step 3: Commit** - -```bash -git add crates/superposition_provider/src/lib.rs -git commit -m "feat: update lib.rs with re-exports for new trait-based architecture" -``` - ---- - -### Task 9: Create examples - -**Files:** -- Create: `crates/superposition_provider/examples/local_http_example.rs` -- Create: `crates/superposition_provider/examples/local_file_example.rs` -- Create: `crates/superposition_provider/examples/local_with_fallback_example.rs` - -**Step 1: Create `local_http_example.rs`** - -```rust -use open_feature::EvaluationContext; -use superposition_provider::{ - data_source::http::HttpDataSource, - local_provider::LocalResolutionProvider, - traits::{AllFeatureProvider, FeatureExperimentMeta}, - PollingStrategy, RefreshStrategy, SuperpositionOptions, -}; - -#[tokio::main] -async fn main() { - env_logger::init(); - - let http_source = HttpDataSource::new(SuperpositionOptions::new( - "http://localhost:8080".to_string(), - "token".to_string(), - "org1".to_string(), - "workspace1".to_string(), - )); - - let provider = LocalResolutionProvider::new( - Box::new(http_source), - None, - RefreshStrategy::Polling(PollingStrategy { - interval: 30, - timeout: Some(10), - }), - ); - provider.init().await.unwrap(); - - let context = EvaluationContext::default() - .with_targeting_key("user-123") - .with_custom_field("os", "android"); - - // AllFeatureProvider usage - let all_config = provider.resolve_all_features(&context).await.unwrap(); - println!("All config: {:?}", all_config); - - // FeatureExperimentMeta usage - let variants = provider.get_applicable_variants(&context).await.unwrap(); - println!("Variants: {:?}", variants); - - provider.close().await.unwrap(); -} -``` - -**Step 2: Create `local_file_example.rs`** - -```rust -use std::path::PathBuf; - -use open_feature::EvaluationContext; -use superposition_provider::{ - data_source::file::FileDataSource, - local_provider::LocalResolutionProvider, - traits::AllFeatureProvider, - OnDemandStrategy, RefreshStrategy, -}; - -#[tokio::main] -async fn main() { - env_logger::init(); - - let file_source = FileDataSource::new(PathBuf::from("./config.toml")); - - let provider = LocalResolutionProvider::new( - Box::new(file_source), - None, - RefreshStrategy::OnDemand(OnDemandStrategy { - ttl: 60, - ..Default::default() - }), - ); - provider.init().await.unwrap(); - - let context = EvaluationContext::default() - .with_custom_field("os", "linux"); - - let config = provider.resolve_all_features(&context).await.unwrap(); - println!("Config: {:?}", config); - - provider.close().await.unwrap(); -} -``` - -**Step 3: Create `local_with_fallback_example.rs`** - -```rust -use std::path::PathBuf; - -use open_feature::EvaluationContext; -use superposition_provider::{ - data_source::file::FileDataSource, - data_source::http::HttpDataSource, - local_provider::LocalResolutionProvider, - traits::{AllFeatureProvider, FeatureExperimentMeta}, - PollingStrategy, RefreshStrategy, SuperpositionOptions, -}; - -#[tokio::main] -async fn main() { - env_logger::init(); - - // Primary: HTTP data source - let http_source = HttpDataSource::new(SuperpositionOptions::new( - "http://localhost:8080".to_string(), - "token".to_string(), - "org1".to_string(), - "workspace1".to_string(), - )); - - // Fallback: TOML file data source - let file_source = FileDataSource::new(PathBuf::from("./config.toml")); - - let provider = LocalResolutionProvider::new( - Box::new(http_source), - Some(Box::new(file_source)), - RefreshStrategy::Polling(PollingStrategy { - interval: 30, - timeout: Some(10), - }), - ); - provider.init().await.unwrap(); - - let context = EvaluationContext::default() - .with_targeting_key("user-456") - .with_custom_field("os", "android") - .with_custom_field("app_version", "3.2.1"); - - // Bulk resolution - let all_config = provider.resolve_all_features(&context).await.unwrap(); - println!("All config: {:?}", all_config); - - // Filtered resolution - let filtered = provider - .resolve_all_features_with_filter( - &context, - Some(&["payment.".to_string(), "ui.".to_string()]), - ) - .await - .unwrap(); - println!("Filtered config: {:?}", filtered); - - // Experiment variants - let variants = provider.get_applicable_variants(&context).await.unwrap(); - println!("Variants: {:?}", variants); - - // Manual refresh - provider.refresh().await.unwrap(); - - provider.close().await.unwrap(); -} -``` - -**Step 4: Add `env_logger` dev-dependency to `Cargo.toml`** - -Add to `[dev-dependencies]` in `crates/superposition_provider/Cargo.toml`: -```toml -[dev-dependencies] -env_logger = "0.11" -``` - -**Step 5: Verify examples compile** - -Run: `cargo check -p superposition_provider --examples` -Expected: compiles with no errors - -**Step 6: Commit** - -```bash -git add crates/superposition_provider/examples/ crates/superposition_provider/Cargo.toml -git commit -m "feat: add examples for LocalResolutionProvider with HTTP, File, and fallback" -``` - ---- - -### Task 10: Final verification - -**Step 1: Run full crate check** - -Run: `cargo check -p superposition_provider` -Expected: compiles with no errors and no warnings - -**Step 2: Run existing tests** - -Run: `cargo test -p superposition_provider -- --skip test_rust_provider_integration` -Expected: existing unit tests pass - -**Step 3: Check examples compile** - -Run: `cargo check -p superposition_provider --examples` -Expected: compiles - -**Step 4: Run workspace check to ensure no regressions** - -Run: `cargo check --workspace` -Expected: no compilation errors in any crate - -**Step 5: Commit any final fixes** - -```bash -git add -A -git commit -m "fix: final adjustments for configuration resolver implementation" -```