Compare updated template evaluator (#4092)

This commit is contained in:
eric sciple
2025-11-07 14:18:52 -06:00
committed by GitHub
parent 53d69ff441
commit b5b7986cd6
188 changed files with 27222 additions and 4 deletions

View File

@@ -0,0 +1,76 @@
#nullable disable // Consider removing in the future to minimize likelihood of NullReferenceException; refer https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references
using System;
using GitHub.Actions.Expressions.Data;
using GitHub.Actions.WorkflowParser.ObjectTemplating.Tokens;
namespace GitHub.Actions.WorkflowParser.Conversion
{
internal static class TemplateTokenExtensions
{
public static ArrayExpressionData ToExpressionData(this SequenceToken sequence)
{
var token = sequence as TemplateToken;
var expressionData = token.ToExpressionData();
return expressionData.AssertArray("converted sequence token");
}
public static DictionaryExpressionData ToExpressionData(this MappingToken mapping)
{
var token = mapping as TemplateToken;
var expressionData = token.ToExpressionData();
return expressionData.AssertDictionary("converted mapping token");
}
public static ExpressionData ToExpressionData(this TemplateToken token)
{
switch (token.Type)
{
case TokenType.Mapping:
var mapping = token as MappingToken;
var dictionary = new DictionaryExpressionData();
if (mapping.Count > 0)
{
foreach (var pair in mapping)
{
var keyLiteral = pair.Key.AssertString("dictionary context data key");
var key = keyLiteral.Value;
var value = pair.Value.ToExpressionData();
dictionary.Add(key, value);
}
}
return dictionary;
case TokenType.Sequence:
var sequence = token as SequenceToken;
var array = new ArrayExpressionData();
if (sequence.Count > 0)
{
foreach (var item in sequence)
{
array.Add(item.ToExpressionData());
}
}
return array;
case TokenType.Null:
return null;
case TokenType.Boolean:
var boolean = token as BooleanToken;
return new BooleanExpressionData(boolean.Value);
case TokenType.Number:
var number = token as NumberToken;
return new NumberExpressionData(number.Value);
case TokenType.String:
var stringToken = token as StringToken;
return new StringExpressionData(stringToken.Value);
default:
throw new NotSupportedException($"Unexpected {nameof(TemplateToken)} type '{token.Type}'");
}
}
}
}