class CronPredicateProvider extends env.predicates.PredicateProvider
constructor: (@framework, @config) ->
env.logger.info "the time is: #{@getTime()}"
return
getTime: -> new Date()
parsePredicate: (input, context) ->
modifier = null
parseDateResults = null
dateMatch = null
dateDetected = no
dateString = null
fullMatch = null
nextInput = null
exprTokens = null
theTime = @getTime()
onDateStringMatch = ( (m, match) =>
possibleDateString = match.trim()
parseDateResults = chrono.parse(possibleDateString, theTime)
if parseDateResults.length > 0 and parseDateResults[0].index is 0
dateDetected = yes
fullMatch = m.getFullMatch()
dateString = possibleDateString
nextInput = m.getRemainingInput()
return m
)
onDateStringExprMatch = ( (m, tokens) =>
exprTokens = tokens
dateDetected = yes
fullMatch = m.getFullMatch()
nextInput = m.getRemainingInput()
return m
)
hadPrefix = false
M(input, context)
.match(['its ', 'it is '], optional: yes, (m, match) => hadPrefix = yes)
.match(['before ', 'after '], optional: yes, (m, match) =>
modifier = match.trim(); hadPrefix = yes
)
.or([
( (m) => m.match(/^(.+?)($| for .*| and .*| or .*|\).*|\].*)/, onDateStringMatch) ),
( (m) =>
if hadPrefix then m.matchStringWithVars(onDateStringExprMatch)
else M(null, context)
),
( (m) =>
if hadPrefix then m.matchVariable( (m, v) => onDateStringExprMatch(m, [v]) )
else M(null, context)
)
])
if dateDetected
if dateString?
if parseDateResults.length is 0
context?.addError("Could not parse date: \"#{dateMatch}\"")
return null
else if parseDateResults.length > 1
context?.addError("Multiple dates given: \"#{dateMatch}\"")
return null
parseResult = parseDateResults[0]
if modifier in ['after', 'before'] and parseResult.end?
context?.addError("You can't give a date range when using \"#{modifier}\"")
unless modifier?
if parseResult.end?
modifier = 'range'
else
modifier = 'exact'
else
assert Array.isArray exprTokens
unless modifier?
modifier = 'exact'
assert fullMatch?
assert nextInput?
return {
token: fullMatch
nextInput: nextInput
predicateHandler: (
if dateString? then new StringCronPredicateHandler(this, modifier, dateString)
else new ExprCronPredicateHandler(this, modifier, exprTokens)
)
}
else return null
class BaseCronPredicateHandler extends env.predicates.PredicateHandler
constructor: (@provider, @modifier) -> #nop
_createJobs: (dateString) ->
parseResult = @_reparseDateString(dateString)
{second, minute, hour, day, month, dayOfWeek} = @_parseDateToCronFormat(parseResult.start)
@jobs = []
switch @modifier
when 'exact'
@jobs.push new CronJob(
cronTime: "#{second} #{minute} #{hour} #{day} #{month} #{dayOfWeek}"
onTick: => @emit "change", 'event'
start: false
)
when 'before'
Dependencies