TM-ValidationUtility.psm1

using namespace System.IO
using namespace System.Management.Automation

Add-Type -ErrorAction Stop -TypeDefinition @'
using System;
using System.IO;
using System.Management.Automation;
using System.Text.RegularExpressions;
namespace Validation {
 
    #region Exceptions
 
    public class PathNotFound : IOException {
        public PathNotFound() :base() { }
        public PathNotFound(string message) :base(message) { }
    }
 
    public class PathFound : IOException {
        public PathFound() :base() { }
        public PathFound(string message) :base(message) { }
    }
 
    public class InvalidFormat : Exception {
        public InvalidFormat() :base() { }
        public InvalidFormat(string message) :base(message) { }
    }
 
    #endregion Exceptions
 
    #region ValidatePathExistsAttribute
 
    public enum PathType {
        File,
        Folder,
        Any,
        None
    }
 
    public class ValidatePathExistsAttribute : ValidateArgumentsAttribute {
        private PathType _pathType = PathType.Any;
 
        public ValidatePathExistsAttribute() { }
        public ValidatePathExistsAttribute(PathType pathType ) { _pathType = pathType ; }
 
        protected override void Validate(object obj, EngineIntrinsics engineIntrinsics) {
            string path = string.Empty;
            if (obj is FileSystemInfo) {
                path = ((FileSystemInfo)obj).FullName;
            } else {
                path = obj.ToString( ) ?? string.Empty;
            }
 
            // Check if path exists.
            bool fileExists = File.Exists(path);
            bool directoryExists = Directory.Exists(path);
 
            // Build Exception Message String
            string msg = (
                (_pathType != PathType.Any && _pathType != PathType.None)
                    ? "Path"
                    : Enum.GetName(typeof(PathType), _pathType
            ) +
            '"' + path + '"' +
            (
                (_pathType == PathType.None)
                    ? "already exists!"
                    : "does not exist!")
            );
 
            // Validate path
            if (string.IsNullOrWhiteSpace(path)) {
                throw new ArgumentNullException("Argument cannot be null or whitespace");
            } else if (
                (_pathType == PathType.Any) &&
                (fileExists == false) &&
                (directoryExists == false)
            ) {
                throw new PathNotFound(msg);
            } else if (_pathType == PathType.Folder && directoryExists == false) {
                throw new DirectoryNotFoundException(msg);
            } else if (_pathType == PathType.File && fileExists == false) {
                throw new FileNotFoundException(msg);
            } else if (_pathType == PathType.None && (fileExists || directoryExists)) {
                throw new PathFound(msg);
            }
        }
    }
 
    #endregion ValidatePathExistsAttribute
 
    public class ValidateIPv4FormatAttribute : ValidateArgumentsAttribute {
        private static Regex _regex = new Regex(@"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
 
        public ValidateIPv4FormatAttribute() { }
 
        protected override void Validate(object obj, EngineIntrinsics engineIntrinsics) {
            if ((obj is string) == false) {
                throw new InvalidOperationException("Cannot validate non-string arguments.");
            } else if (string.IsNullOrWhiteSpace(obj.ToString())) {
                throw new ArgumentNullException("Argument cannot be null or whitespace");
            } else if (_regex.IsMatch(obj.ToString()) == false) {
                throw new InvalidFormat(string.Format("Invalid format for '{0]'. Does not match Gist Uri format.", obj));
            }
        }
    }
 
    public class ValidateGistUriFormatAttribute : ValidateArgumentsAttribute {
        private static Regex _regex = new Regex(@"^(https://gist\.github\.com/[[a-zA-Z0-9-_]+|https://api\.github\.com/gists)/[a-zA-Z0-9]{32}$");
 
        public ValidateGistUriFormatAttribute() { }
 
        protected override void Validate(object obj, EngineIntrinsics engineIntrinsics) {
            if ((obj is string) == false) {
                throw new InvalidOperationException("Cannot validate non-string arguments.");
            } else if (string.IsNullOrWhiteSpace(obj.ToString())) {
                throw new ArgumentNullException("Argument cannot be null or whitespace");
            } else if (_regex.IsMatch(obj.ToString()) == false) {
                throw new InvalidFormat(string.Format("Invalid format for '{0]'. Does not match Gist Uri format.", obj));
            }
        }
    }
}
'@