2020-11-21 08:58:19 +00:00
|
|
|
package dev.inmo.krontab
|
2019-10-05 05:09:22 +00:00
|
|
|
|
2020-11-21 08:58:19 +00:00
|
|
|
import dev.inmo.krontab.internal.*
|
2021-04-09 18:28:08 +00:00
|
|
|
import dev.inmo.krontab.utils.Minutes
|
2019-10-05 05:09:22 +00:00
|
|
|
|
2020-08-22 15:42:47 +00:00
|
|
|
/**
|
|
|
|
* @see createSimpleScheduler
|
|
|
|
* @see buildSchedule
|
|
|
|
*/
|
|
|
|
typealias KrontabTemplate = String
|
|
|
|
|
2023-06-20 04:25:15 +00:00
|
|
|
inline fun KrontabTemplate.krontabConfig() = KrontabConfig(this)
|
2020-06-03 16:04:05 +00:00
|
|
|
|
2023-06-20 04:12:32 +00:00
|
|
|
/**
|
|
|
|
* Parse [incoming] string and adapt according to next format: "* * * * *" where order of things:
|
|
|
|
*
|
|
|
|
* * **seconds**
|
|
|
|
* * **minutes**
|
|
|
|
* * **hours**
|
|
|
|
* * **dayOfMonth**
|
|
|
|
* * **month**
|
|
|
|
* * **year** (optional)
|
|
|
|
* * **offset** (optional) (can be placed anywhere after month) (must be marked with `o` at the end, for example: 60o == +01:00)
|
|
|
|
* * **dayOfWeek** (optional) (can be placed anywhere after month)
|
|
|
|
* * **milliseconds** (optional) (can be placed anywhere after month) (must be marked with `ms` at the end, for example: 500ms; 100-200ms)
|
|
|
|
*
|
|
|
|
* And each one (except of offsets) have next format:
|
|
|
|
*
|
|
|
|
* `{number}[,{number},...]` or `*`
|
|
|
|
*
|
|
|
|
* and {number} here is one of
|
|
|
|
*
|
|
|
|
* * {int}-{int}
|
|
|
|
* * {int}/{int}
|
|
|
|
* * */{int}
|
|
|
|
* * {int}
|
|
|
|
* * F
|
|
|
|
* * L
|
|
|
|
*
|
|
|
|
* Week days must be marked with `w` at the end, and starts with 0 which means Sunday. For example, 0w == Sunday. With
|
|
|
|
* weeks you can use syntax like with any number like seconds, for example: 0-2w means Sunday-Tuesday
|
|
|
|
*
|
|
|
|
* Additional info about ranges can be found in follow accordance:
|
|
|
|
*
|
|
|
|
* * Seconds ranges can be found in [secondsRange]
|
|
|
|
* * Minutes ranges can be found in [minutesRange]
|
|
|
|
* * Hours ranges can be found in [hoursRange]
|
|
|
|
* * Days of month ranges can be found in [dayOfMonthRange]
|
|
|
|
* * Months ranges can be found in [monthRange]
|
|
|
|
* * Years ranges can be found in [yearRange] (in fact - any [Int])
|
|
|
|
* * WeekDay (timezone) ranges can be found in [dayOfWeekRange]
|
|
|
|
* * Milliseconds ranges can be found in [millisecondsRange]
|
|
|
|
*
|
|
|
|
* Examples:
|
|
|
|
*
|
|
|
|
* * "0/5 * * * *" for every five seconds triggering
|
|
|
|
* * "0/5,L * * * *" for every five seconds triggering and on 59 second
|
|
|
|
* * "0/15 30 * * *" for every 15th seconds in a half of each hour
|
|
|
|
* * "0/15 30 * * * 500ms" for every 15th seconds in a half of each hour when milliseconds equal to 500
|
|
|
|
* * "1 2 3 F,4,L 5" for triggering in near first second of second minute of third hour of first, fifth and last days of may
|
|
|
|
* * "1 2 3 F,4,L 5 60o" for triggering in near first second of second minute of third hour of first, fifth and last days of may with timezone UTC+01:00
|
|
|
|
* * "1 2 3 F,4,L 5 60o 0-2w" for triggering in near first second of second minute of third hour of first, fifth and last days of may in case if it will be in Sunday-Tuesday week days with timezone UTC+01:00
|
|
|
|
* * "1 2 3 F,4,L 5 2021" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year
|
|
|
|
* * "1 2 3 F,4,L 5 2021 60o" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year with timezone UTC+01:00
|
|
|
|
* * "1 2 3 F,4,L 5 2021 60o 0-2w" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year if it will be in Sunday-Tuesday week days with timezone UTC+01:00
|
|
|
|
* * "1 2 3 F,4,L 5 2021 60o 0-2w 500ms" for triggering in near first second of second minute of third hour of first, fifth and last days of may of 2021st year if it will be in Sunday-Tuesday week days with timezone UTC+01:00 when milliseconds will be equal to 500
|
|
|
|
*
|
|
|
|
* @return In case when offset parameter is absent in [incoming] will be used [createSimpleScheduler] method and
|
|
|
|
* returned [CronDateTimeScheduler]. In case when offset parameter there is in [incoming] [KrontabTemplate] will be used
|
|
|
|
* [createKronSchedulerWithOffset] and returned [CronDateTimeSchedulerTz]
|
|
|
|
*
|
|
|
|
* @see dev.inmo.krontab.internal.createKronScheduler
|
|
|
|
* @see KrontabConfig.scheduler
|
|
|
|
*/
|
|
|
|
fun createSimpleScheduler(
|
|
|
|
incoming: KrontabTemplate
|
|
|
|
): KronScheduler = KrontabConfig(incoming).scheduler()
|
|
|
|
|
2021-04-09 18:28:08 +00:00
|
|
|
fun createSimpleScheduler(
|
|
|
|
incoming: KrontabTemplate,
|
|
|
|
defaultOffset: Minutes
|
2023-06-20 04:12:32 +00:00
|
|
|
): KronSchedulerTz = KrontabConfig(incoming).scheduler(defaultOffset)
|
2021-04-09 18:28:08 +00:00
|
|
|
|
2020-06-03 16:04:05 +00:00
|
|
|
/**
|
2020-07-24 08:18:18 +00:00
|
|
|
* Shortcut for [createSimpleScheduler]
|
2020-06-03 16:04:05 +00:00
|
|
|
*/
|
2020-08-22 15:42:47 +00:00
|
|
|
fun buildSchedule(incoming: KrontabTemplate): KronScheduler = createSimpleScheduler(incoming)
|
2021-04-09 18:28:08 +00:00
|
|
|
/**
|
|
|
|
* Shortcut for [createSimpleScheduler]
|
|
|
|
*/
|
|
|
|
fun buildSchedule(incoming: KrontabTemplate, defaultOffset: Minutes): KronSchedulerTz = createSimpleScheduler(incoming, defaultOffset)
|
2020-08-22 15:42:47 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Shortcut for [buildSchedule]
|
|
|
|
*/
|
2021-01-02 15:35:08 +00:00
|
|
|
fun KrontabTemplate.toSchedule(): KronScheduler = buildSchedule(this)
|
2021-04-09 18:28:08 +00:00
|
|
|
/**
|
|
|
|
* Shortcut for [buildSchedule]
|
|
|
|
*/
|
|
|
|
fun KrontabTemplate.toSchedule(defaultOffset: Minutes): KronSchedulerTz = buildSchedule(this, defaultOffset)
|
2021-01-02 15:35:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Shortcut for [buildSchedule]
|
|
|
|
*/
|
2021-04-09 18:28:08 +00:00
|
|
|
fun KrontabTemplate.toKronScheduler(): KronScheduler = buildSchedule(this)
|
|
|
|
/**
|
|
|
|
* Shortcut for [buildSchedule]
|
|
|
|
*/
|
2021-04-24 12:33:37 +00:00
|
|
|
fun KrontabTemplate.toKronScheduler(defaultOffset: Minutes): KronSchedulerTz = buildSchedule(this, defaultOffset)
|