diff --git a/CHANGELIST.md b/CHANGELIST.md
index e9e5e56a..da404177 100644
--- a/CHANGELIST.md
+++ b/CHANGELIST.md
@@ -30,6 +30,7 @@
- Add unused inputs to Aaru
- Add self-formatting to Input types
- Handle issue with old .NET
+- Let inputs read equal-separated values
### 3.2.4 (2024-11-24)
diff --git a/MPF.ExecutionContexts.Test/InputTests.cs b/MPF.ExecutionContexts.Test/InputTests.cs
index cd722e16..3529e77d 100644
--- a/MPF.ExecutionContexts.Test/InputTests.cs
+++ b/MPF.ExecutionContexts.Test/InputTests.cs
@@ -46,9 +46,13 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, true)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, true)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "true" }, 0, true, true)]
[InlineData("flag", true, new string[] { "flag", "false" }, 0, true, false)]
+ [InlineData("flag", true, new string[] { "flag=true" }, 0, true, true)]
+ [InlineData("flag", true, new string[] { "flag=false" }, 0, true, false)]
public void BooleanInputTest(string name, bool required, string[] parts, int index, bool success, bool? expected)
{
BooleanInput input = new BooleanInput(name, required);
@@ -77,9 +81,13 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, sbyte.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, sbyte.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (sbyte)1)]
[InlineData("flag", true, new string[] { "flag", "-1" }, 0, true, (sbyte)-1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (sbyte)1)]
+ [InlineData("flag", true, new string[] { "flag=-1" }, 0, true, (sbyte)-1)]
public void Int8InputTest(string name, bool required, string[] parts, int index, bool success, sbyte? expected)
{
Int8Input input = new Int8Input(name, required);
@@ -108,8 +116,11 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, byte.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, byte.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (byte)1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (byte)1)]
public void UInt8InputTest(string name, bool required, string[] parts, int index, bool success, byte? expected)
{
UInt8Input input = new UInt8Input(name, required);
@@ -138,9 +149,13 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, short.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, short.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (short)1)]
[InlineData("flag", true, new string[] { "flag", "-1" }, 0, true, (short)-1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (short)1)]
+ [InlineData("flag", true, new string[] { "flag=-1" }, 0, true, (short)-1)]
public void Int16InputTest(string name, bool required, string[] parts, int index, bool success, short? expected)
{
Int16Input input = new Int16Input(name, required);
@@ -169,8 +184,11 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, ushort.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, ushort.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (ushort)1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (ushort)1)]
public void UInt16InputTest(string name, bool required, string[] parts, int index, bool success, ushort? expected)
{
UInt16Input input = new UInt16Input(name, required);
@@ -199,9 +217,13 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, int.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, int.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (int)1)]
[InlineData("flag", true, new string[] { "flag", "-1" }, 0, true, (int)-1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (int)1)]
+ [InlineData("flag", true, new string[] { "flag=-1" }, 0, true, (int)-1)]
public void Int32InputTest(string name, bool required, string[] parts, int index, bool success, int? expected)
{
Int32Input input = new Int32Input(name, required);
@@ -230,8 +252,11 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, uint.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, uint.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (uint)1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (uint)1)]
public void UInt32InputTest(string name, bool required, string[] parts, int index, bool success, uint? expected)
{
UInt32Input input = new UInt32Input(name, required);
@@ -260,9 +285,13 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, long.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, long.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (long)1)]
[InlineData("flag", true, new string[] { "flag", "-1" }, 0, true, (long)-1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (long)1)]
+ [InlineData("flag", true, new string[] { "flag=-1" }, 0, true, (long)-1)]
public void Int64InputTest(string name, bool required, string[] parts, int index, bool success, long? expected)
{
Int64Input input = new Int64Input(name, required);
@@ -291,8 +320,11 @@ namespace MPF.ExecutionContexts.Test
// Valid name, invalid following
[InlineData("flag", true, new string[] { "flag", "invalid" }, 0, false, null)]
[InlineData("flag", false, new string[] { "flag", "invalid" }, 0, true, ulong.MinValue)]
+ [InlineData("flag", true, new string[] { "flag=invalid" }, 0, false, null)]
+ [InlineData("flag", false, new string[] { "flag=invalid" }, 0, true, ulong.MinValue)]
// Valid name, valid following
[InlineData("flag", true, new string[] { "flag", "1" }, 0, true, (ulong)1)]
+ [InlineData("flag", true, new string[] { "flag=1" }, 0, true, (ulong)1)]
public void UInt64InputTest(string name, bool required, string[] parts, int index, bool success, ulong? expected)
{
UInt64Input input = new UInt64Input(name, required);
@@ -320,6 +352,7 @@ namespace MPF.ExecutionContexts.Test
[InlineData("flag", false, new string[] { "flag" }, 0, true, "")]
// Valid name, following
[InlineData("flag", true, new string[] { "flag", "value" }, 0, true, "value")]
+ [InlineData("flag", true, new string[] { "flag=value" }, 0, true, "value")]
public void StringInputTest(string name, bool required, string[] parts, int index, bool success, string? expected)
{
StringInput input = new StringInput(name, required);
@@ -331,46 +364,6 @@ namespace MPF.ExecutionContexts.Test
#endregion
- #region DoesExist
-
- [Fact]
- public void DoesExist_Empty_False()
- {
- string[] parts = [];
- int index = 0;
- bool actual = Input.DoesExist(parts, index);
- Assert.False(actual);
- }
-
- [Fact]
- public void DoesExist_Negative_False()
- {
- string[] parts = ["item"];
- int index = -1;
- bool actual = Input.DoesExist(parts, index);
- Assert.False(actual);
- }
-
- [Fact]
- public void DoesExist_Greater_False()
- {
- string[] parts = ["item"];
- int index = 1;
- bool actual = Input.DoesExist(parts, index);
- Assert.False(actual);
- }
-
- [Fact]
- public void DoesExist_Valid_True()
- {
- string[] parts = ["item"];
- int index = 0;
- bool actual = Input.DoesExist(parts, index);
- Assert.True(actual);
- }
-
- #endregion
-
#region ExtractFactorFromValue
[Theory]
diff --git a/MPF.ExecutionContexts/Data/BooleanInput.cs b/MPF.ExecutionContexts/Data/BooleanInput.cs
index 7e149d87..cf9b99eb 100644
--- a/MPF.ExecutionContexts/Data/BooleanInput.cs
+++ b/MPF.ExecutionContexts/Data/BooleanInput.cs
@@ -59,33 +59,58 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
- Value = _required ? null : true;
- return !_required;
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : true;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (!bool.TryParse(parts[index + 1], out bool value))
+ {
+ Value = _required ? null : true;
+ return !_required;
+ }
+
+ index++;
+ Value = value;
+ return true;
}
- // If the next value is valid
- if (!bool.TryParse(parts[index + 1], out bool value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- Value = _required ? null : true;
- return !_required;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : true;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (!bool.TryParse(val, out bool value))
+ {
+ Value = _required ? null : true;
+ return !_required;
+ }
+
+ Value = value;
+ return true;
}
- index++;
- return value;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/FlagInput.cs b/MPF.ExecutionContexts/Data/FlagInput.cs
index 3b599ab4..5c6fa5ce 100644
--- a/MPF.ExecutionContexts/Data/FlagInput.cs
+++ b/MPF.ExecutionContexts/Data/FlagInput.cs
@@ -50,19 +50,17 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
// Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
+ {
+ Value = true;
+ return true;
+ }
- Value = true;
- return true;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/Input.cs b/MPF.ExecutionContexts/Data/Input.cs
index d7da252c..24e1e99a 100644
--- a/MPF.ExecutionContexts/Data/Input.cs
+++ b/MPF.ExecutionContexts/Data/Input.cs
@@ -91,15 +91,6 @@ namespace MPF.ExecutionContexts.Data
#region Helpers
- ///
- /// Returns whether or not the selected item exists
- ///
- /// Parts array to be referenced
- /// Current index
- /// True if the next item exists, false otherwise
- internal static bool DoesExist(string[] parts, int index)
- => index >= 0 && index < parts.Length;
-
///
/// Get the trimmed value and multiplication factor from a value
///
diff --git a/MPF.ExecutionContexts/Data/Int16Input.cs b/MPF.ExecutionContexts/Data/Int16Input.cs
index 8d8f2f6a..cf01fcad 100644
--- a/MPF.ExecutionContexts/Data/Int16Input.cs
+++ b/MPF.ExecutionContexts/Data/Int16Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : short.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out short? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : short.MinValue;
return !_required;
}
- // If the next value is valid
- if (short.TryParse(parts[index + 1], out short value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : short.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out short? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : short.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out short? output)
+ {
+ // If the next value is valid
+ if (short.TryParse(str, out short value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (short.TryParse(baseVal, out value))
{
- index++;
- Value = (short)(value * factor);
+ output = (short)(value * factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (short.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (short)(value * factor);
+ output = (short)(value * factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : short.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/Int32Input.cs b/MPF.ExecutionContexts/Data/Int32Input.cs
index 8c0ab0b2..93c14c92 100644
--- a/MPF.ExecutionContexts/Data/Int32Input.cs
+++ b/MPF.ExecutionContexts/Data/Int32Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : int.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out int? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : int.MinValue;
return !_required;
}
- // If the next value is valid
- if (int.TryParse(parts[index + 1], out int value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : int.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out int? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : int.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out int? output)
+ {
+ // If the next value is valid
+ if (int.TryParse(str, out int value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (int.TryParse(baseVal, out value))
{
- index++;
- Value = (int)(value * factor);
+ output = (int)(value * factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (int.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (int)(value * factor);
+ output = (int)(value * factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : int.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/Int64Input.cs b/MPF.ExecutionContexts/Data/Int64Input.cs
index bc4ee687..65ec4260 100644
--- a/MPF.ExecutionContexts/Data/Int64Input.cs
+++ b/MPF.ExecutionContexts/Data/Int64Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : long.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out long? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : long.MinValue;
return !_required;
}
- // If the next value is valid
- if (long.TryParse(parts[index + 1], out long value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : long.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out long? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : long.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out long? output)
+ {
+ // If the next value is valid
+ if (long.TryParse(str, out long value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (long.TryParse(baseVal, out value))
{
- index++;
- Value = (long)(value * factor);
+ output = (long)(value * factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (long.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (long)(value * factor);
+ output = (long)(value * factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : long.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/Int8Input.cs b/MPF.ExecutionContexts/Data/Int8Input.cs
index 539f2272..f37e81d5 100644
--- a/MPF.ExecutionContexts/Data/Int8Input.cs
+++ b/MPF.ExecutionContexts/Data/Int8Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : sbyte.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out sbyte? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : sbyte.MinValue;
return !_required;
}
- // If the next value is valid
- if (sbyte.TryParse(parts[index + 1], out sbyte value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : sbyte.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out sbyte? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : sbyte.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out sbyte? output)
+ {
+ // If the next value is valid
+ if (sbyte.TryParse(str, out sbyte value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (sbyte.TryParse(baseVal, out value))
{
- index++;
- Value = (sbyte)(value * factor);
+ output = (sbyte)(value * factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (sbyte.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (sbyte)(value * factor);
+ output = (sbyte)(value * factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : sbyte.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/StringInput.cs b/MPF.ExecutionContexts/Data/StringInput.cs
index 93623a02..f68fcf7b 100644
--- a/MPF.ExecutionContexts/Data/StringInput.cs
+++ b/MPF.ExecutionContexts/Data/StringInput.cs
@@ -67,27 +67,44 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
- Value = _required ? null : string.Empty;
- return !_required;
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : string.Empty;
+ return !_required;
+ }
+
+ index++;
+ Value = parts[index];
+ return true;
}
- index++;
- Value = parts[index];
- return true;
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
+ {
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : string.Empty;
+ return !_required;
+ }
+
+ Value = val;
+ return true;
+ }
+
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/UInt16Input.cs b/MPF.ExecutionContexts/Data/UInt16Input.cs
index 0fda65cd..873da452 100644
--- a/MPF.ExecutionContexts/Data/UInt16Input.cs
+++ b/MPF.ExecutionContexts/Data/UInt16Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : ushort.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out ushort? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : ushort.MinValue;
return !_required;
}
- // If the next value is valid
- if (ushort.TryParse(parts[index + 1], out ushort value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : ushort.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out ushort? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : ushort.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out ushort? output)
+ {
+ // If the next value is valid
+ if (ushort.TryParse(str, out ushort value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (ushort.TryParse(baseVal, out value))
{
- index++;
- Value = (ushort)(value * factor);
+ output = (ushort)(value * factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (ushort.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (ushort)(value * factor);
+ output = (ushort)(value * factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : ushort.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/UInt32Input.cs b/MPF.ExecutionContexts/Data/UInt32Input.cs
index f94f0ecd..521c700a 100644
--- a/MPF.ExecutionContexts/Data/UInt32Input.cs
+++ b/MPF.ExecutionContexts/Data/UInt32Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : uint.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out uint? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : uint.MinValue;
return !_required;
}
- // If the next value is valid
- if (uint.TryParse(parts[index + 1], out uint value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : uint.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out uint? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : uint.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out uint? output)
+ {
+ // If the next value is valid
+ if (uint.TryParse(str, out uint value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (uint.TryParse(baseVal, out value))
{
- index++;
- Value = (uint)(value * factor);
+ output = (uint)(value * factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (uint.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (uint)(value * factor);
+ output = (uint)(value * factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : uint.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/UInt64Input.cs b/MPF.ExecutionContexts/Data/UInt64Input.cs
index ba282faa..a7ad8922 100644
--- a/MPF.ExecutionContexts/Data/UInt64Input.cs
+++ b/MPF.ExecutionContexts/Data/UInt64Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : ulong.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out ulong? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : ulong.MinValue;
return !_required;
}
- // If the next value is valid
- if (ulong.TryParse(parts[index + 1], out ulong value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : ulong.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out ulong? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : ulong.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out ulong? output)
+ {
+ // If the next value is valid
+ if (ulong.TryParse(str, out ulong value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (ulong.TryParse(baseVal, out value))
{
- index++;
- Value = (ulong)(value * (ulong)factor);
+ output = (ulong)(value * (ulong)factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (ulong.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (ulong)(value * (ulong)factor);
+ output = (ulong)(value * (ulong)factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : ulong.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/MPF.ExecutionContexts/Data/UInt8Input.cs b/MPF.ExecutionContexts/Data/UInt8Input.cs
index d0b8c495..af64b7ca 100644
--- a/MPF.ExecutionContexts/Data/UInt8Input.cs
+++ b/MPF.ExecutionContexts/Data/UInt8Input.cs
@@ -68,38 +68,79 @@ namespace MPF.ExecutionContexts.Data
public override bool Process(string[] parts, ref int index)
{
// Check the parts array
- if (parts.Length == 0)
- return false;
-
- // Check the index
if (index < 0 || index >= parts.Length)
return false;
- // Check the name
- if (parts[index] != Name && (_longName != null && parts[index] != _longName))
- return false;
-
- // Ensure the value exists
- if (!DoesExist(parts, index + 1))
+ // Check for space-separated
+ if (parts[index] == Name || (_longName != null && parts[index] == _longName))
{
+ // Ensure the value exists
+ if (index + 1 >= parts.Length)
+ {
+ Value = _required ? null : byte.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(parts[index + 1], out byte? value) && value != null)
+ {
+ index++;
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
Value = _required ? null : byte.MinValue;
return !_required;
}
- // If the next value is valid
- if (byte.TryParse(parts[index + 1], out byte value))
+ // Check for equal separated
+ if (parts[index].StartsWith($"{Name}=") || (_longName != null && parts[index].StartsWith($"{_longName}=")))
{
- index++;
- Value = value;
+ // Split the string, using the first equal sign as the separator
+ string[] tempSplit = parts[index].Split('=');
+ string key = tempSplit[0];
+ string val = string.Join("=", tempSplit, 1, tempSplit.Length - 1);
+
+ // Ensure the value exists
+ if (string.IsNullOrEmpty(val))
+ {
+ Value = _required ? null : byte.MinValue;
+ return !_required;
+ }
+
+ // If the next value is valid
+ if (ParseValue(val, out byte? value) && value != null)
+ {
+ Value = value;
+ return true;
+ }
+
+ // Return value based on required flag
+ Value = _required ? null : byte.MinValue;
+ return !_required;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Parse a value from a string
+ ///
+ private static bool ParseValue(string str, out byte? output)
+ {
+ // If the next value is valid
+ if (byte.TryParse(str, out byte value))
+ {
+ output = value;
return true;
}
// Try to process as a formatted string
- string baseVal = ExtractFactorFromValue(parts[index + 1], out long factor);
+ string baseVal = ExtractFactorFromValue(str, out long factor);
if (byte.TryParse(baseVal, out value))
{
- index++;
- Value = (byte)(value * factor);
+ output = (byte)(value * factor);
return true;
}
@@ -107,14 +148,13 @@ namespace MPF.ExecutionContexts.Data
string hexValue = RemoveHexIdentifier(baseVal);
if (byte.TryParse(hexValue, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out value))
{
- index++;
- Value = (byte)(value * factor);
+ output = (byte)(value * factor);
return true;
}
- // Return value based on required flag
- Value = _required ? null : byte.MinValue;
- return !_required;
+ // The value could not be parsed
+ output = null;
+ return false;
}
}
}
\ No newline at end of file