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
- Visão geral de extensibilidade
IStep— o ponto de extensão que este complementa.