Files
runner/src/Sdk/WorkflowParser/Conversion/TemplateTokenExtensions.cs
2025-11-07 20:18:52 +00:00

77 lines
2.9 KiB
C#

#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}'");
}
}
}
}