using System; using System.ComponentModel; using System.Runtime.Serialization; using Newtonsoft.Json; namespace GitHub.DistributedTask.Pipelines { [DataContract] [EditorBrowsable(EditorBrowsableState.Never)] public enum ActionSourceType { [DataMember] Repository = 1, [DataMember] ContainerRegistry = 2, [DataMember] Script = 3 } [DataContract] [KnownType(typeof(ContainerRegistryReference))] [KnownType(typeof(RepositoryPathReference))] [KnownType(typeof(ScriptReference))] [JsonConverter(typeof(ActionStepDefinitionReferenceConverter))] [EditorBrowsable(EditorBrowsableState.Never)] public abstract class ActionStepDefinitionReference { [DataMember(EmitDefaultValue = false)] public abstract ActionSourceType Type { get; } public abstract ActionStepDefinitionReference Clone(); } [EditorBrowsable(EditorBrowsableState.Never)] public class ContainerRegistryReference : ActionStepDefinitionReference { [JsonConstructor] public ContainerRegistryReference() { } private ContainerRegistryReference(ContainerRegistryReference referenceToClone) { this.Image = referenceToClone.Image; } [DataMember(EmitDefaultValue = false)] public override ActionSourceType Type => ActionSourceType.ContainerRegistry; /// /// Container image /// [DataMember(EmitDefaultValue = false)] public string Image { get; set; } public override ActionStepDefinitionReference Clone() { return new ContainerRegistryReference(this); } } [EditorBrowsable(EditorBrowsableState.Never)] public class RepositoryPathReference : ActionStepDefinitionReference { [JsonConstructor] public RepositoryPathReference() { } private RepositoryPathReference(RepositoryPathReference referenceToClone) { this.Name = referenceToClone.Name; this.Ref = referenceToClone.Ref; this.RepositoryType = referenceToClone.RepositoryType; this.Path = referenceToClone.Path; } [DataMember(EmitDefaultValue = false)] public override ActionSourceType Type => ActionSourceType.Repository; /// /// Repository name /// [DataMember(EmitDefaultValue = false)] public string Name { get; set; } /// /// Repository ref, branch/tag/commit /// [DataMember(EmitDefaultValue = false)] public string Ref { get; set; } /// /// Repository type, github/AzureRepo/etc /// [DataMember(EmitDefaultValue = false)] public string RepositoryType { get; set; } /// /// Path to action entry point directory /// [DataMember(EmitDefaultValue = false)] public string Path { get; set; } public override ActionStepDefinitionReference Clone() { return new RepositoryPathReference(this); } } [EditorBrowsable(EditorBrowsableState.Never)] public class ScriptReference : ActionStepDefinitionReference { [JsonConstructor] public ScriptReference() { } private ScriptReference(ScriptReference referenceToClone) { } [DataMember(EmitDefaultValue = false)] public override ActionSourceType Type => ActionSourceType.Script; public override ActionStepDefinitionReference Clone() { return new ScriptReference(this); } } }