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)
}