//
// CLValidation.m
// ceol
//
// Created by Ben McRedmond on 24/05/2009.
// Copyright 2009 Ben McRedmond. All rights reserved.
//
#import <stdarg.h>
#import "CLValidation.h"
NSString * const CLValidateAlpha
= @"validateAlpha:";
NSString * const CLValidateAlphaSpaces
= @"validateAlphaSpaces:";
NSString * const CLValidateAlphaNumeric
= @"validateAlphanumeric:";
NSString * const CLValidateAlphaNumericDash
= @"validateAlphanumericDash:";
NSString * const CLValidateNotEmpty
= @"validateNotEmpty:";
NSString * const CLValidateEmail
= @"validateEmail:";
@implementation CLValidation
- (id) init {
self = [super init];
if(self)
{
[self generalInit];
errorStrings
= [[NSDictionary alloc
] initWithObjectsAndKeys
:
@"Letters only", CLValidateAlpha,
@"Letters and Spaces Only", CLValidateAlphaSpaces,
@"Letters and Numbers Only", CLValidateAlphaNumeric,
@"Letters, Numbers and Dashes Only", CLValidateAlphaNumericDash,
@"Can't be empty", CLValidateNotEmpty,
@"Invalid Email Address", CLValidateEmail, nil];
}
return self;
}
self = [super init];
if(self)
{
[self generalInit];
errorStrings = errors;
}
return self;
}
- (id) generalInit {
}
- (void) dealloc {
[errorTable release];
[errorStrings release];
[super dealloc];
}
va_list arguments;
while(nextRule)
{
[self validateRule:nextRule candidate:object tag:tag];
}
return [tempErrors autorelease];
}
- (NSMutableArray *) validateObjectWithRulesAndParamaters
: (id) object tag
: (NSString *) tag rules
: (id) firstRule, ... NS_REQUIRES_NIL_TERMINATION
{
id *nextObject = firstRule;
va_list arguments;
while(nextObject)
{
[self validateRuleWithParamater
:nextObject candidate
:object tag
:tag paramater
:va_arg(arguments,
id)];
nextObject
= va_arg(arguments,
id);
}
return [tempErrors autorelease];
}
- (void) validateRule
: (NSString * const) rule candidate
: (id) candidate tag
: (NSString *) tag
{
[self validateRuleWithParamter:rule candidate: canddiate tag:tag paramater:nil];
}
- (void) validateRuleWithParamter
: (NSString * const) rule candidate
: (id) candidate tag
: (NSString *) tag paramater
: (id) paramater
{
SEL selector = NSSelectorFromString(rule);
BOOL isValid = [self performSelector:selector withObject:candidate];
[self modifyErrorTable:tag method:rule isValid:isValid];
if(!isValid) [tempErrors addObject:[errorStrings objectForKey:rule]];
}
- (void) modifyErrorTable
: (NSString *) tag method
: (NSString * const) method isValid
: (BOOL) isValid
{
// Check whether there's an entry already in the error table
if([errorTable objectForKey:tag] == nil)
// Update the 'table'
[[errorTable objectForKey
:tag
] setObject
:[NSNumber numberWithBool
:isValid
] forKey
:method
];
}
- (int) errorCount {
int errors = 0;
// The only objects in our table should be mutable dictionaries
while((value = [enumerator nextObject]))
{
innerEnumerator = [value objectEnumerator];
while((innerValue = [innerEnumerator nextObject]))
{
if(![innerValue boolValue]) ++errors;
}
}
return errors;
}
- (int) errorCountForTag
: (NSString *) tag
{
int errors = 0;
NSEnumerator *enumerator
= [[errorTable objectForKey
:tag
] objectEnumerator
];
while((value = [enumerator nextObject]))
{
if(![value boolValue]) ++errors;
}
return errors;
}
// ======================
// = Validation Methods =
// ======================
- (BOOL) validateAlpha
: (NSString *) toValidate
{
return [self validateStringInCharacterSet
:toValidate characterSet
:[NSCharacterSet letterCharacterSet
]];
}
- (BOOL) validateAlphaSpaces
: (NSString *) toValidate
{
[characterSet addCharactersInString:@" "];
return [self validateStringInCharacterSet:toValidate characterSet:characterSet];
}
- (BOOL) validateAlphanumeric
: (NSString *) toValidate
{
return [self validateStringInCharacterSet
:toValidate characterSet
:[NSCharacterSet alphanumericCharacterSet
]];
}
- (BOOL) validateAlphanumericDash
: (NSString *) toValidate
{
[characterSet addCharactersInString:@"-_."];
return [self validateStringInCharacterSet:toValidate characterSet:characterSet];
}
// Since we invert the character set if it is == NSNotFound then it is in the character set.
return ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) ? NO : YES;
}
- (BOOL) validateNotEmpty
: (NSString *) toValidate
{
return ([toValidate length] == 0) ? NO : YES;
}
- (BOOL) validateEmail
: (NSString *) toValidate
{
NSString *emailRegex
= @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
return [emailTest evaluateWithObject:toValidate];
}
@end