in src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs [342:518]
private FeatureFlag ParseFeatureFlag(string settingKey, string settingValue)
{
var featureFlag = new FeatureFlag();
var reader = new Utf8JsonReader(System.Text.Encoding.UTF8.GetBytes(settingValue));
try
{
if (reader.Read() && reader.TokenType != JsonTokenType.StartObject)
{
throw new FormatException(string.Format(ErrorMessages.FeatureFlagInvalidFormat, settingKey));
}
while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
{
if (reader.TokenType != JsonTokenType.PropertyName)
{
continue;
}
string propertyName = reader.GetString();
switch (propertyName)
{
case FeatureManagementConstants.Id:
{
if (reader.Read() && reader.TokenType == JsonTokenType.String)
{
featureFlag.Id = reader.GetString();
}
else if (reader.TokenType != JsonTokenType.Null)
{
throw CreateFeatureFlagFormatException(
FeatureManagementConstants.Id,
settingKey,
reader.TokenType.ToString(),
JsonTokenType.String.ToString());
}
break;
}
case FeatureManagementConstants.Enabled:
{
if (reader.Read() && (reader.TokenType == JsonTokenType.False || reader.TokenType == JsonTokenType.True))
{
featureFlag.Enabled = reader.GetBoolean();
}
else if (reader.TokenType == JsonTokenType.String && bool.TryParse(reader.GetString(), out bool enabled))
{
featureFlag.Enabled = enabled;
}
else
{
throw CreateFeatureFlagFormatException(
FeatureManagementConstants.Enabled,
settingKey,
reader.TokenType.ToString(),
$"{JsonTokenType.True}' or '{JsonTokenType.False}");
}
break;
}
case FeatureManagementConstants.Conditions:
{
if (reader.Read() && reader.TokenType == JsonTokenType.StartObject)
{
featureFlag.Conditions = ParseFeatureConditions(ref reader, settingKey);
}
else if (reader.TokenType != JsonTokenType.Null)
{
throw CreateFeatureFlagFormatException(
FeatureManagementConstants.Conditions,
settingKey,
reader.TokenType.ToString(),
JsonTokenType.StartObject.ToString());
}
break;
}
case FeatureManagementConstants.Allocation:
{
if (reader.Read() && reader.TokenType == JsonTokenType.StartObject)
{
featureFlag.Allocation = ParseFeatureAllocation(ref reader, settingKey);
}
else if (reader.TokenType != JsonTokenType.Null)
{
throw CreateFeatureFlagFormatException(
FeatureManagementConstants.Allocation,
settingKey,
reader.TokenType.ToString(),
JsonTokenType.StartObject.ToString());
}
break;
}
case FeatureManagementConstants.Variants:
{
if (reader.Read() && reader.TokenType == JsonTokenType.StartArray)
{
List<FeatureVariant> variants = new List<FeatureVariant>();
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
{
int i = 0;
if (reader.TokenType == JsonTokenType.StartObject)
{
FeatureVariant featureVariant = ParseFeatureVariant(ref reader, settingKey);
if (featureVariant.Name != null)
{
variants.Add(featureVariant);
}
}
else if (reader.TokenType != JsonTokenType.Null)
{
throw CreateFeatureFlagFormatException(
$"{FeatureManagementConstants.Variants}[{i}]",
settingKey,
reader.TokenType.ToString(),
JsonTokenType.StartObject.ToString());
}
i++;
}
featureFlag.Variants = variants;
}
else if (reader.TokenType != JsonTokenType.Null)
{
throw CreateFeatureFlagFormatException(
FeatureManagementConstants.Variants,
settingKey,
reader.TokenType.ToString(),
JsonTokenType.StartArray.ToString());
}
break;
}
case FeatureManagementConstants.Telemetry:
{
if (reader.Read() && reader.TokenType == JsonTokenType.StartObject)
{
featureFlag.Telemetry = ParseFeatureTelemetry(ref reader, settingKey);
}
else if (reader.TokenType != JsonTokenType.Null)
{
throw CreateFeatureFlagFormatException(
FeatureManagementConstants.Telemetry,
settingKey,
reader.TokenType.ToString(),
JsonTokenType.StartObject.ToString());
}
break;
}
default:
reader.Skip();
break;
}
}
}
catch (JsonException e)
{
throw new FormatException(settingKey, e);
}
return featureFlag;
}