Files
runner/src/Sdk/DTPipelines/Pipelines/ActionStepDefinitionReferenceConverter.cs
2019-10-10 00:52:42 -04:00

83 lines
2.5 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 ActionStepDefinitionReferenceConverter : 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 actionTypeValue))
{
ActionSourceType actionType;
if (actionTypeValue.Type == JTokenType.Integer)
{
actionType = (ActionSourceType)(Int32)actionTypeValue;
}
else if (actionTypeValue.Type != JTokenType.String || !Enum.TryParse((String)actionTypeValue, true, out actionType))
{
return null;
}
ActionStepDefinitionReference reference = null;
switch (actionType)
{
case ActionSourceType.Repository:
reference = new RepositoryPathReference();
break;
case ActionSourceType.ContainerRegistry:
reference = new ContainerRegistryReference();
break;
case ActionSourceType.Script:
reference = new ScriptReference();
break;
}
using (var objectReader = value.CreateReader())
{
serializer.Populate(objectReader, reference);
}
return reference;
}
else
{
return null;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}