Files
runner/src/Sdk/Expressions/Data/NumberExpressionData.cs
2025-11-07 20:18:52 +00:00

79 lines
2.1 KiB
C#

using System;
using System.Globalization;
using System.Runtime.Serialization;
using GitHub.Actions.Expressions.Sdk;
using Newtonsoft.Json.Linq;
namespace GitHub.Actions.Expressions.Data
{
[DataContract]
public sealed class NumberExpressionData : ExpressionData, INumber
{
public NumberExpressionData(Double value)
: base(ExpressionDataType.Number)
{
m_value = value;
}
public Double Value
{
get
{
return m_value;
}
}
public override ExpressionData Clone()
{
return new NumberExpressionData(m_value);
}
public override JToken ToJToken()
{
if (Double.IsNaN(m_value) || m_value == Double.PositiveInfinity || m_value == Double.NegativeInfinity)
{
return (JToken)m_value;
}
var floored = Math.Floor(m_value);
if (m_value == floored && m_value <= (Double)Int32.MaxValue && m_value >= (Double)Int32.MinValue)
{
var flooredInt = (Int32)floored;
return (JToken)flooredInt;
}
else if (m_value == floored && m_value <= (Double)Int64.MaxValue && m_value >= (Double)Int64.MinValue)
{
var flooredInt = (Int64)floored;
return (JToken)flooredInt;
}
else
{
return (JToken)m_value;
}
}
public override String ToString()
{
return m_value.ToString("G15", CultureInfo.InvariantCulture);
}
Double INumber.GetNumber()
{
return Value;
}
public static implicit operator Double(NumberExpressionData data)
{
return data.Value;
}
public static implicit operator NumberExpressionData(Double data)
{
return new NumberExpressionData(data);
}
[DataMember(Name = "n", EmitDefaultValue = false)]
private Double m_value;
}
}