using System.Collections.Immutable; using System.Linq; using System.Text; using Just.Railway.SourceGen.Executors.ResultExtensions.MainExtensions; using Microsoft.CodeAnalysis; namespace Just.Railway.SourceGen.Executors.ResultExtensions.ValueTaskExtensions; internal class ResultValueTaskAppendExecutor : ResultAppendExecutor { protected override string NamespaceName => "Just.Railway.ValueTaskExtensions"; protected override string PartialClassName => "ResultValueTaskExtensions"; protected override void GenerateHelperMethods(StringBuilder sb) { sb.AppendLine(""" private static IEnumerable GetBottom(ResultState r1, ResultState r2, string firstArg = "result", string secondArg = "next") { if (r1 == ResultState.Bottom) yield return firstArg; if (r2 == ResultState.Bottom) yield return secondArg; } """); } protected override void GenerateMethodsForArgCount(StringBuilder sb, int argCount) { var templateArgNames = Enumerable.Range(1, argCount) .Select(i => $"T{i}") .ToImmutableArray(); string resultTypeDef = GenerateResultTypeDef(templateArgNames); string resultValueExpansion = GenerateResultValueExpansion(templateArgNames); sb.AppendLine($"#region {resultTypeDef}"); GenerateAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion); if (argCount < Constants.MaxResultTupleSize) { GenerateExpandedAsyncMethods("ValueTask", "ValueTask", sb, templateArgNames, resultTypeDef, resultValueExpansion); } sb.AppendLine("#endregion"); } }