using System.Globalization; namespace FileFlows.BasicNodes.Helpers; /// /// Helper for math operations /// public class MathHelper { /// /// Checks if the comparison string represents a mathematical operation. /// /// The comparison string to check. /// True if the comparison is a mathematical operation, otherwise false. public static bool IsMathOperation(string comparison) { // Check if the comparison string starts with <=, <, >, >=, ==, or = return new[] { "<=", "<", ">", ">=", "==", "=" }.Any(comparison.StartsWith); } /// /// Tests if a math operation is true /// /// The value to apply the operation to. /// The operation string representing the mathematical operation. /// True if the mathematical operation is successful, otherwise false. public static bool IsTrue(string value, string operation) { // This is a basic example; you may need to handle different operators switch (operation[..2]) { case "<=": return Convert.ToDouble(value) <= Convert.ToDouble(AdjustComparisonValue(operation[2..].Trim())); case ">=": return Convert.ToDouble(value) >= Convert.ToDouble(AdjustComparisonValue(operation[2..].Trim())); case "==": return Math.Abs(Convert.ToDouble(value) - Convert.ToDouble(AdjustComparisonValue(operation[2..].Trim()))) < 0.05f; case "!=": case "<>": return Math.Abs(Convert.ToDouble(value) - Convert.ToDouble(AdjustComparisonValue(operation[2..].Trim()))) > 0.05f; } switch (operation[..1]) { case "<": return Convert.ToDouble(value) < Convert.ToDouble(AdjustComparisonValue(operation[1..].Trim())); case ">": return Convert.ToDouble(value) > Convert.ToDouble(AdjustComparisonValue(operation[1..].Trim())); case "=": return Math.Abs(Convert.ToDouble(value) - Convert.ToDouble(AdjustComparisonValue(operation[1..].Trim()))) < 0.05f; } return false; } /// /// Adjusts the comparison string by handling common mistakes in units and converting them into full numbers. /// /// The original comparison string to be adjusted. /// The adjusted comparison string with corrected units or the original comparison if no adjustments are made. private static string AdjustComparisonValue(string comparisonValue) { if (string.IsNullOrWhiteSpace(comparisonValue)) return string.Empty; string adjustedComparison = comparisonValue.ToLower().Trim(); // Handle common mistakes in units if (adjustedComparison.EndsWith("mbps")) { // Make an educated guess for Mbps to kbps conversion return adjustedComparison[..^4] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_000_000) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("kbps")) { // Make an educated guess for kbps to bps conversion return adjustedComparison[..^4] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_000) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("kb")) { return adjustedComparison[..^2] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_000 ) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("mb")) { return adjustedComparison[..^2] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_000_000 ) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("gb")) { return adjustedComparison[..^2] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_000_000_000 ) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("tb")) { return adjustedComparison[..^2] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_000_000_000_000) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("kib")) { return adjustedComparison[..^3] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_024 ) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("mib")) { return adjustedComparison[..^3] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_048_576 ) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("gib")) { return adjustedComparison[..^3] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_099_511_627_776 ) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } if (adjustedComparison.EndsWith("tib")) { return adjustedComparison[..^3] switch { { } value when double.TryParse(value, out var numericValue) => (numericValue * 1_000_000_000_000) .ToString(CultureInfo.InvariantCulture), _ => comparisonValue }; } return comparisonValue; } }