func()

in pkg/confidence/confidence.go [206:256]


func (e Confidence) ResolveFlag(ctx context.Context, flag string, defaultValue interface{}, expectedKind reflect.Kind) InterfaceResolutionDetail {
	flagName, propertyPath := splitFlagString(flag)

	requestFlagName := fmt.Sprintf("flags/%s", flagName)
	resp, err := e.ResolveClient.SendResolveRequest(ctx,
		ResolveRequest{ClientSecret: e.Config.APIKey,
			Flags: []string{requestFlagName}, Apply: true, EvaluationContext: e.contextMap,
			Sdk: sdk{Id: SDK_ID, Version: SDK_VERSION}})

	if err != nil {
		slog.Warn("Error in resolving flag", "flag", flag, "error", err)
		return processResolveError(err, defaultValue)
	}
	key := url.QueryEscape(e.Config.APIKey)
	flagEncoded := url.QueryEscape(flagName)
	json, err := json.Marshal(e.GetContext())
	if err == nil {
		jsonContextEncoded := url.QueryEscape(string(json))
		e.Logger.Debug("See resolves for " + flagName + " in Confidence: https://app.confidence.spotify.com/flags/resolver-test?client-key=" + key + "&flag=flags/" + flagEncoded + "&context=" + jsonContextEncoded)
	}
	if len(resp.ResolvedFlags) == 0 {
		slog.Debug("Flag not found", "flag", flag)
		return InterfaceResolutionDetail{
			Value: defaultValue,
			ResolutionDetail: ResolutionDetail{
				Variant:      "",
				Reason:       ErrorReason,
				ErrorCode:    FlagNotFoundCode,
				ErrorMessage: "Flag not found",
				FlagMetadata: nil,
			},
		}
	}

	resolvedFlag := resp.ResolvedFlags[0]
	if resolvedFlag.Flag != requestFlagName {
		slog.Warn("Unexpected flag from remote", "flag", resolvedFlag.Flag)
		return InterfaceResolutionDetail{
			Value: defaultValue,
			ResolutionDetail: ResolutionDetail{
				Variant:      "",
				Reason:       ErrorReason,
				ErrorCode:    FlagNotFoundCode,
				ErrorMessage: fmt.Sprintf("unexpected flag '%s' from remote", strings.TrimPrefix(resolvedFlag.Flag, "flags/")),
				FlagMetadata: nil,
			},
		}
	}

	return processResolvedFlag(resolvedFlag, defaultValue, expectedKind, propertyPath)
}