DSInternals/Src/DSInternals.PowerShell/Utils/ValidateHexStringAttribute.cs
2015-12-26 23:44:43 +01:00

54 lines
1.7 KiB
C#

namespace DSInternals.PowerShell
{
using DSInternals.Common;
using System;
using System.Management.Automation;
using System.Text.RegularExpressions;
[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field)]
public sealed class ValidateHexStringAttribute : ValidateEnumeratedArgumentsAttribute
{
private const string HexPattern = @"^[0-9a-fA-F]+$";
private const int CharsPerByte = 2;
public ValidateHexStringAttribute()
{
}
public ValidateHexStringAttribute(uint requiredByteCount)
{
// Set properties:
this.RequiredByteCount = requiredByteCount;
}
public uint? RequiredByteCount
{
get;
private set;
}
protected override void ValidateElement(object input)
{
string hexString = input as string;
Validator.AssertNotNull(hexString, "input");
int length = hexString.Length;
bool isDivisible = length % CharsPerByte == 0;
bool isHex = Regex.IsMatch(hexString, HexPattern);
if(!isHex || !isDivisible)
{
// TODO: Extract as a resource
throw new ValidationMetadataException("The string must be in hexadecimal format.");
}
int byteCount = length / CharsPerByte;
if (this.RequiredByteCount.HasValue && byteCount != this.RequiredByteCount)
{
// TODO: Extract as resource
string message = String.Format("The size of the binary value must be {0} bytes.", this.RequiredByteCount);
throw new ValidationMetadataException(message);
}
}
}
}