Files
runner/src/Sdk/DTPipelines/Pipelines/StepConverter.cs
2019-12-16 17:05:26 -05:00

75 lines
2.1 KiB
C#

using System;
using System.Reflection;
using GitHub.Services.WebApi;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace GitHub.DistributedTask.Pipelines
{
internal sealed class StepConverter : VssSecureJsonConverter
{
public override bool CanWrite
{
get
{
return false;
}
}
public override bool CanConvert(Type objectType)
{
return typeof(Step).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
}
public override object ReadJson(
JsonReader reader,
Type objectType,
Object existingValue,
JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.StartObject)
{
return null;
}
JObject value = JObject.Load(reader);
if (value.TryGetValue("Type", StringComparison.OrdinalIgnoreCase, out JToken stepTypeValue))
{
StepType stepType;
if (stepTypeValue.Type == JTokenType.Integer)
{
stepType = (StepType)(Int32)stepTypeValue;
}
else if (stepTypeValue.Type != JTokenType.String || !Enum.TryParse((String)stepTypeValue, true, out stepType))
{
return null;
}
Step stepObject = null;
switch (stepType)
{
case StepType.Action:
stepObject = new ActionStep();
break;
}
using (var objectReader = value.CreateReader())
{
serializer.Populate(objectReader, stepObject);
}
return stepObject;
}
else
{
return null;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}