@ -1,14 +1,17 @@
'use strict'
'use strict'
var utils = require ( './utils' )
var utils = require ( './utils' )
var noop = utils . noop
var assign = utils . assign
var assign = utils . assign
var isFunction = utils . isFunction
var isRegExp = utils . isRegExp
var isString = utils . isString
var isString = utils . isString
var noop = utils . noop
function RouteNode ( options ) {
function RouteNode ( options ) {
options = options || { }
options = options || { }
this . _children = Object . create ( null )
this . _children = Object . create ( null )
this . _regExs = Object . create ( null )
this . _regExs = Object . create ( null )
this . _funcs = Object . create ( null )
}
}
assign ( RouteNode . prototype , {
assign ( RouteNode . prototype , {
@ -29,8 +32,10 @@ assign(RouteNode.prototype, {
if ( isString ( part ) ) {
if ( isString ( part ) ) {
node = this . _children [ part ]
node = this . _children [ part ]
} else {
} else if ( isRegExp ( part ) ) {
this . _regExs [ part ] = part
this . _regExs [ part ] = part
} else if ( isFunction ( part ) ) {
this . _funcs [ part ] = part
}
}
if ( node == null ) {
if ( node == null ) {
@ -53,45 +58,57 @@ assign(RouteNode.prototype, {
return childNode . get ( parts , args , done )
return childNode . get ( parts , args , done )
} else {
} else {
var results = this . _getRegexChild ( part )
var results = this . _getRegexChild ( part )
if ( results && results . node ) {
return results . node . get ( parts , args . concat ( results . args ) , done )
} else {
results = this . _getFunctionChild ( part )
if ( results && results . node ) {
if ( results && results . node ) {
return results . node . get ( parts , args . concat ( results . args ) , done )
return results . node . get ( parts , args . concat ( results . args ) , done )
} else {
} else {
return done ( new Error ( 'not found' ) )
return done ( new Error ( 'not found' ) )
}
}
}
}
}
} ,
} ,
_getRegexChild : function _getRegexChild ( part ) {
_getRegexChild : function _getRegexChild ( part ) {
var childKey = null
var args = [ ]
var self = this
var self = this
Object . keys ( this . _regExs ) . forEach ( function checkRegex ( key ) {
return Object . keys ( this . _regExs ) . reduce ( function checkRegex ( memo , key ) {
if ( childKey ) {
if ( memo ) {
return
return memo
}
}
var regex = self . _regExs [ key ]
var regex = self . _regExs [ key ]
var results = regex . exec ( part )
var results = regex . exec ( part )
var lastIndex = null
if ( ! results ) {
if ( results ) {
return null
childKey = key
}
}
var lastIndex = null
var args = [ ]
while ( results && results . index !== lastIndex ) {
while ( results && results . index !== lastIndex ) {
args = args . concat ( results [ 0 ] )
args = args . concat ( results [ 0 ] )
lastIndex = results . index
lastIndex = results . index
results = regex . exec ( part )
results = regex . exec ( part )
}
}
} )
return { args : args , key : key , node : self . _children [ key ] }
} , null )
} ,
if ( childKey ) {
_getFunctionChild : function _getFunctionChild ( part ) {
return {
var self = this
args : args ,
return Object . keys ( self . _funcs ) . reduce ( function checkFunc ( memo , key ) {
key : childKey ,
if ( memo ) {
node : this . _children [ childKey ]
return memo
}
}
var func = self . _funcs [ key ]
var result = func ( part )
if ( result ) {
return { args : [ result ] , key : key , node : self . _children [ key ] }
} else {
} else {
return null
return null
}
}
} , null )
}
}
} )
} )