Guia — IStepCodeEmitter

Caminho rápido opcional de compile-time para um step: em vez do fallback genérico dentro de um pipeline gerado (busca no registro + configuração como JsonNode, igual ao caminho interpretado), o gerador emite C# direto para esse step.

Nenhum step é obrigado a implementar isto. Um step sem IStepCodeEmitter continua funcionando, sem modificação, dentro de um pipeline gerado — isso é uma decisão de produto, não um detalhe de implementação: extensibilidade nunca é bloqueada por performance.

Exemplo mínimo

using System.Text.Json.Nodes;
using Pipevine.Abstractions.CodeGen;

// Ao lado de EchoStepFactory : IStepFactory, [Step("acme.echo")]
public sealed class EchoStepEmitter : IStepCodeEmitter
{
    public void Emit(StepEmitContext context)
    {
        var message = context.Config["message"]?.GetValue<string>()
            ?? throw new InvalidOperationException("'acme.echo' requer 'message'.");

        // Escreva C# válido em context.Writer que constrói um valor IStep-compatível e o
        // atribui a context.ResultVariableName. O gerador injeta esse trecho diretamente no
        // método do pipeline compilado.
        context.Writer.AppendLine(
            $"var {context.ResultVariableName} = new global::Acme.Extension.EchoStep({System.Text.Json.JsonSerializer.Serialize(message)});");
    }
}

StepEmitContext carrega Type/Id/Config (a mesma forma opaca que um IStepFactory em runtime recebe) mais Writer (onde acrescentar as instruções C# geradas) e ResultVariableName (o nome da variável local que o código gerado precisa atribuir).

Quando vale a pena

Só quando o custo do fallback genérico (reflection/busca em dicionário por chamada) importa de verdade para o seu step — a maioria não precisa. Meça antes de implementar.

Para onde ir daqui