internal static void WriteStep()

in src/Agent.Listener/DistributedTask.Pipelines/Yaml/TypeConverters/ConverterUtil.steps.cs [342:550]


        internal static void WriteStep(IEmitter emitter, IStep step, Boolean noBootstrap = false)
        {
            if (!noBootstrap)
            {
                emitter.Emit(new MappingStart());
            }

            if (step is StepsTemplateReference)
            {
                var reference = step as StepsTemplateReference;
                if (!noBootstrap)
                {
                    emitter.Emit(new Scalar(YamlConstants.Template));
                    emitter.Emit(new Scalar(reference.Name));

                    if (reference.Parameters != null && reference.Parameters.Count > 0)
                    {
                        emitter.Emit(new Scalar(YamlConstants.Parameters));
                        WriteMapping(emitter, reference.Parameters);
                    }
                }

                if (reference.StepOverrides != null && reference.StepOverrides.Count > 0)
                {
                    emitter.Emit(new Scalar(YamlConstants.Steps));
                    WriteStepOverrides(emitter, reference.StepOverrides);
                }
            }
            else if (step is StepGroup)
            {
                var group = step as StepGroup;
                emitter.Emit(new Scalar(YamlConstants.Group));
                emitter.Emit(new Scalar(group.Name));
                if (group.Steps != null && group.Steps.Count > 0)
                {
                    emitter.Emit(new Scalar(YamlConstants.Steps));
                    WriteSteps(emitter, group.Steps.Cast<IStep>().ToList());
                }
            }
            else if (step is TaskStep)
            {
                var task = step as TaskStep;
                if (String.Equals(task.Reference.Name, "CmdLine", StringComparison.OrdinalIgnoreCase) &&
                    String.Equals(task.Reference.Version, "2", StringComparison.Ordinal) &&
                    task.Inputs != null)
                {
                    emitter.Emit(new Scalar(YamlConstants.Script));
                    String script;
                    task.Inputs.TryGetValue("script", out script);
                    emitter.Emit(new Scalar(script ?? String.Empty));
                    WriteTaskPreInputProperties(emitter, task);

                    String failOnStderr;
                    if (task.Inputs.TryGetValue("failOnStderr", out failOnStderr)
                        && !String.IsNullOrEmpty(failOnStderr))
                    {
                        emitter.Emit(new Scalar(YamlConstants.FailOnStderr));
                        emitter.Emit(new Scalar(failOnStderr));
                    }

                    String workingDirectory;
                    if (task.Inputs.TryGetValue("workingDirectory", out workingDirectory) &&
                        !String.IsNullOrEmpty(workingDirectory))
                    {
                        emitter.Emit(new Scalar(YamlConstants.WorkingDirectory));
                        emitter.Emit(new Scalar(workingDirectory));
                    }

                    WriteTaskPostInputProperties(emitter, task);
                }
                else if (String.Equals(task.Reference.Name, "Bash", StringComparison.OrdinalIgnoreCase) &&
                    String.Equals(task.Reference.Version, "3", StringComparison.Ordinal) &&
                    task.Inputs != null &&
                    task.Inputs.ContainsKey("targetType") &&
                    String.Equals(task.Inputs["targetType"], "inline", StringComparison.OrdinalIgnoreCase))
                {
                    emitter.Emit(new Scalar(YamlConstants.Bash));
                    String script;
                    task.Inputs.TryGetValue("script", out script);
                    emitter.Emit(new Scalar(script ?? String.Empty));
                    WriteTaskPreInputProperties(emitter, task);

                    String failOnStderr;
                    if (task.Inputs.TryGetValue("failOnStderr", out failOnStderr)
                        && !String.IsNullOrEmpty(failOnStderr))
                    {
                        emitter.Emit(new Scalar(YamlConstants.FailOnStderr));
                        emitter.Emit(new Scalar(failOnStderr));
                    }

                    String workingDirectory;
                    if (task.Inputs.TryGetValue("workingDirectory", out workingDirectory) &&
                        !String.IsNullOrEmpty(workingDirectory))
                    {
                        emitter.Emit(new Scalar(YamlConstants.WorkingDirectory));
                        emitter.Emit(new Scalar(workingDirectory));
                    }

                    WriteTaskPostInputProperties(emitter, task);
                }
                else if (String.Equals(task.Reference.Name, "PowerShell", StringComparison.OrdinalIgnoreCase) &&
                    String.Equals(task.Reference.Version, "2", StringComparison.Ordinal) &&
                    task.Inputs != null &&
                    task.Inputs.ContainsKey("targetType") &&
                    String.Equals(task.Inputs["targetType"], "inline", StringComparison.OrdinalIgnoreCase))
                {
                    emitter.Emit(new Scalar(YamlConstants.PowerShell));
                    String script;
                    task.Inputs.TryGetValue("script", out script);
                    emitter.Emit(new Scalar(script ?? String.Empty));
                    WriteTaskPreInputProperties(emitter, task);

                    String errorActionPreference;
                    if (task.Inputs.TryGetValue("errorActionPreference", out errorActionPreference)
                        && !String.IsNullOrEmpty(errorActionPreference))
                    {
                        emitter.Emit(new Scalar(YamlConstants.ErrorActionPreference));
                        emitter.Emit(new Scalar(errorActionPreference));
                    }

                    String failOnStderr;
                    if (task.Inputs.TryGetValue("failOnStderr", out failOnStderr)
                        && !String.IsNullOrEmpty(failOnStderr))
                    {
                        emitter.Emit(new Scalar(YamlConstants.FailOnStderr));
                        emitter.Emit(new Scalar(failOnStderr));
                    }

                    String ignoreLASTEXITCODE;
                    if (task.Inputs.TryGetValue("ignoreLASTEXITCODE", out ignoreLASTEXITCODE)
                        && !String.IsNullOrEmpty(ignoreLASTEXITCODE))
                    {
                        emitter.Emit(new Scalar(YamlConstants.IgnoreLASTEXITCODE));
                        emitter.Emit(new Scalar(ignoreLASTEXITCODE));
                    }

                    String workingDirectory;
                    if (task.Inputs.TryGetValue("workingDirectory", out workingDirectory) &&
                        !String.IsNullOrEmpty(workingDirectory))
                    {
                        emitter.Emit(new Scalar(YamlConstants.WorkingDirectory));
                        emitter.Emit(new Scalar(workingDirectory));
                    }

                    WriteTaskPostInputProperties(emitter, task);
                }
                else
                {
                    emitter.Emit(new Scalar(YamlConstants.Task));
                    if (String.IsNullOrEmpty(task.Reference.Version))
                    {
                        emitter.Emit(new Scalar(task.Reference.Name));
                    }
                    else
                    {
                        emitter.Emit(new Scalar($"{task.Reference.Name}@{task.Reference.Version}"));
                    }

                    WriteTaskPreInputProperties(emitter, task);
                    if (task.Inputs != null && task.Inputs.Count > 0)
                    {
                        emitter.Emit(new Scalar(YamlConstants.Inputs));
                        WriteMapping(emitter, task.Inputs);
                    }

                    WriteTaskPostInputProperties(emitter, task);
                }
            }
            else if (step is CheckoutStep)
            {
                var checkoutStep = step as CheckoutStep;
                emitter.Emit(new Scalar(YamlConstants.Checkout));
                if (String.Equals(checkoutStep.Name, YamlConstants.None, StringComparison.OrdinalIgnoreCase))
                {
                    emitter.Emit(new Scalar(YamlConstants.None));
                }
                else if (String.Equals(checkoutStep.Name, YamlConstants.Self, StringComparison.OrdinalIgnoreCase))
                {
                    emitter.Emit(new Scalar(YamlConstants.Self));
                    if (!String.IsNullOrEmpty(checkoutStep.Clean))
                    {
                        emitter.Emit(new Scalar(YamlConstants.Clean));
                        emitter.Emit(new Scalar(checkoutStep.Clean));
                    }

                    if (!String.IsNullOrEmpty(checkoutStep.FetchDepth))
                    {
                        emitter.Emit(new Scalar(YamlConstants.FetchDepth));
                        emitter.Emit(new Scalar(checkoutStep.FetchDepth));
                    }

                    if (!String.IsNullOrEmpty(checkoutStep.Lfs))
                    {
                        emitter.Emit(new Scalar(YamlConstants.Lfs));
                        emitter.Emit(new Scalar(checkoutStep.Lfs));
                    }
                }
                else
                {
                    // Should not reach here.
                    throw new NotSupportedException($"Unexpected checkout step resource name: '{checkoutStep.Name}'");
                }
            }

            if (!noBootstrap)
            {
                emitter.Emit(new MappingEnd());
            }
        }