in src/PSRule/Common/JsonConverters.cs [401:486]
private IResource MapResource(JsonReader reader, JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.StartObject || !reader.Read())
{
throw new PipelineSerializationException(PSRuleResources.ReadJsonFailed);
}
IResource result = null;
string apiVersion = null;
string kind = null;
ResourceMetadata metadata = null;
CommentMetadata comment = null;
while (reader.TokenType != JsonToken.EndObject)
{
if (reader.TokenType == JsonToken.PropertyName)
{
var propertyName = reader.Value.ToString();
// Read apiVersion
if (TryApiVersion(reader: reader, propertyName: propertyName, apiVersion: out var apiVersionValue))
{
apiVersion = apiVersionValue;
}
// Read kind
else if (TryKind(reader: reader, propertyName: propertyName, kind: out var kindValue))
{
kind = kindValue;
}
// Read metadata
else if (TryMetadata(
reader: reader,
serializer: serializer,
propertyName: propertyName,
metadata: out var metadataValue))
{
metadata = metadataValue;
}
// Try Spec
else if (kind != null && TrySpec(
reader: reader,
serializer: serializer,
propertyName: propertyName,
apiVersion: apiVersion,
kind: kind,
metadata: metadata,
comment: comment,
spec: out var specValue))
{
result = specValue;
// Break out of loop if result is populated
// Needed so we don't read more than we have to
if (result != null && reader.TokenType == JsonToken.EndObject)
{
break;
}
}
else
{
reader.Skip();
}
}
else if (reader.TokenType == JsonToken.Comment)
{
var commentLine = reader.Value.ToString().TrimStart();
if (commentLine.Length > FIELD_SYNOPSIS.Length && commentLine.StartsWith(FIELD_SYNOPSIS))
{
comment = new CommentMetadata
{
Synopsis = commentLine.Substring(FIELD_SYNOPSIS.Length)
};
}
}
reader.Read();
}
return result;
}