2013-02-17 19:19:38 +00:00
using System ;
using System.Diagnostics ;
2013-05-24 23:40:40 +00:00
using System.IO ;
2013-02-17 19:19:38 +00:00
using System.Linq ;
using System.Text.RegularExpressions ;
using NzbDrone.Common.EnsureThat.Resources ;
namespace NzbDrone.Common.EnsureThat
{
[DebuggerStepThrough]
public static class EnsureStringExtensions
{
[DebuggerStepThrough]
public static Param < string > IsNotNullOrWhiteSpace ( this Param < string > param )
{
if ( string . IsNullOrWhiteSpace ( param . Value ) )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotNullOrWhiteSpace ) ;
return param ;
}
[DebuggerStepThrough]
public static Param < string > IsNotNullOrEmpty ( this Param < string > param )
{
if ( string . IsNullOrEmpty ( param . Value ) )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotNullOrEmpty ) ;
return param ;
}
[DebuggerStepThrough]
public static Param < string > HasLengthBetween ( this Param < string > param , int minLength , int maxLength )
{
if ( string . IsNullOrEmpty ( param . Value ) )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotNullOrEmpty ) ;
var length = param . Value . Length ;
if ( length < minLength )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotInRange_ToShort . Inject ( minLength , maxLength , length ) ) ;
if ( length > maxLength )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotInRange_ToLong . Inject ( minLength , maxLength , length ) ) ;
return param ;
}
[DebuggerStepThrough]
public static Param < string > IsLongerThan ( this Param < string > param , int minLength )
{
if ( string . IsNullOrEmpty ( param . Value ) )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotNullOrEmpty ) ;
var length = param . Value . Length ;
if ( length < minLength )
throw ExceptionFactory . CreateForParamValidation ( param . Name , "The string is not long enough. Must be at least '{0}' but was '{1}' characters long." . Inject ( minLength , length ) ) ;
return param ;
}
[DebuggerStepThrough]
public static Param < string > Matches ( this Param < string > param , string match )
{
return Matches ( param , new Regex ( match ) ) ;
}
[DebuggerStepThrough]
public static Param < string > Matches ( this Param < string > param , Regex match )
{
if ( ! match . IsMatch ( param . Value ) )
{
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_NoMatch . Inject ( param . Value , match ) ) ;
}
return param ;
}
[DebuggerStepThrough]
public static Param < string > IsRelativePath ( this Param < string > param )
{
if ( string . IsNullOrWhiteSpace ( param . Value ) )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotNullOrWhiteSpace ) ;
if ( ! param . Value . EndsWith ( "\\" ) )
{
throw ExceptionFactory . CreateForParamValidation ( param . Name , string . Format ( "value [{0}] is not a valid relative path. relative paths must end with \\" , param . Value ) ) ;
}
if ( param . Value . Length > 1 & & param . Value . StartsWith ( "\\" ) )
{
throw ExceptionFactory . CreateForParamValidation ( param . Name , string . Format ( "value [{0}] is not a valid relative path. relative paths can not start with \\" , param . Value ) ) ;
}
2013-05-24 22:18:37 +00:00
return param ;
}
private static readonly Regex windowsInvalidPathRegex = new Regex ( @"[/,*,<,>,"",|]" , RegexOptions . Compiled | RegexOptions . IgnoreCase ) ;
private static readonly Regex windowsPathRegex = new Regex ( @"^[a-z]:\\" , RegexOptions . Compiled | RegexOptions . IgnoreCase ) ;
[DebuggerStepThrough]
public static Param < string > IsValidPath ( this Param < string > param )
{
if ( string . IsNullOrWhiteSpace ( param . Value ) )
throw ExceptionFactory . CreateForParamValidation ( param . Name , ExceptionMessages . EnsureExtensions_IsNotNullOrWhiteSpace ) ;
if ( EnvironmentProvider . IsLinux )
{
2013-05-24 23:40:40 +00:00
if ( ! param . Value . StartsWith ( Path . DirectorySeparatorChar . ToString ( ) ) )
2013-05-24 22:18:37 +00:00
{
2013-05-24 23:40:40 +00:00
throw ExceptionFactory . CreateForParamValidation ( param . Name , string . Format ( "value [{0}] is not a valid *nix path. paths must start with /" , param . Value ) ) ;
2013-05-24 22:18:37 +00:00
}
}
else
{
if ( windowsInvalidPathRegex . IsMatch ( param . Value ) )
{
throw ExceptionFactory . CreateForParamValidation ( param . Name , string . Format ( "value [{0}] is not a valid Windows path. It contains invalid characters" , param . Value ) ) ;
}
//Network path
2013-05-24 23:40:40 +00:00
if ( param . Value . StartsWith ( Path . DirectorySeparatorChar . ToString ( ) ) ) return param ;
2013-05-24 22:18:37 +00:00
if ( ! windowsPathRegex . IsMatch ( param . Value ) )
{
throw ExceptionFactory . CreateForParamValidation ( param . Name , string . Format ( "value [{0}] is not a valid Windows path. paths must be a full path eg. C:\\Windows" , param . Value ) ) ;
}
}
2013-02-17 19:19:38 +00:00
return param ;
}
}
}