| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 
 | # # ## ### ##### ######## ############# ######################
## Verify DISCOVER credit card number
#
## Reference
##	http://wiki.cdyne.com/wiki/index.php?title=Credit_Card_Verification
# # ## ### ##### ######## ############# ######################
# The code below implements the interface of a snit validation type,
# making it directly usable with snit's -type option in option
# specifications.
# # ## ### ##### ######## ############# ######################
## Requisites
package require Tcl 8.5
package require snit
package require valtype::luhn
package require valtype::common
namespace eval ::valtype::creditcard::discover {
    namespace import ::valtype::common::*
}
# # ## ### ##### ######## ############# ######################
## Implementation
snit::type ::valtype::creditcard::discover {
    #-------------------------------------------------------------------
    # Type Methods
    typemethod validate {value} {
	if {[string length $value] != 16} {
	    badlength {CREDITCARD DISCOVER} 16 "CREDITCARD DISCOVER number"
	} elseif {![string match 6011* $value] &&
		  ![string match 65* $value]} {
	    badprefix {CREDITCARD DISCOVER} {6011 65} "CREDITCARD DISCOVER number"
	}
	return [valtype::luhn validate $value {CREDITCARD DISCOVER}]
    }
    typemethod checkdigit {value} {
	if {[string length $value] != 15} {
	    badlength {CREDITCARD DISCOVER} 15 "CREDITCARD DISCOVER number without checkdigit"
	} elseif {![string match 6011* $value] &&
		  ![string match 65* $value]} {
	    badprefix {CREDITCARD DISCOVER} {6011 65} "CREDITCARD DISCOVER number without checkdigit"
	}
	return [valtype::luhn checkdigit $value {CREDITCARD DISCOVER}]
    }
    #-------------------------------------------------------------------
    # Constructor
    # None needed; no options
    #-------------------------------------------------------------------
    # Public Methods
    method validate {value} {
        $type validate $value
    }
}
# # ## ### ##### ######## ############# ######################
## Ready
package provide valtype::creditcard::discover 1
 |