krontab/src/commonMain/kotlin/com/insanusmokrassar/krontab/CronDateTimeScheduler.kt

62 lines
2.4 KiB
Kotlin
Raw Normal View History

package com.insanusmokrassar.krontab
2019-10-05 05:09:22 +00:00
import com.insanusmokrassar.krontab.internal.*
import com.insanusmokrassar.krontab.internal.CronDateTime
import com.insanusmokrassar.krontab.internal.parseDaysOfMonth
import com.insanusmokrassar.krontab.internal.parseHours
import com.insanusmokrassar.krontab.internal.parseMinutes
import com.insanusmokrassar.krontab.internal.parseMonths
import com.insanusmokrassar.krontab.internal.parseSeconds
import com.insanusmokrassar.krontab.internal.toNearDateTime
2019-10-05 05:09:22 +00:00
import com.soywiz.klock.DateTime
import kotlinx.coroutines.delay
2019-10-05 10:29:59 +00:00
data class CronDateTimeScheduler internal constructor(
2019-10-05 05:09:22 +00:00
internal val cronDateTimes: List<CronDateTime>
)
2019-10-05 10:29:59 +00:00
fun CronDateTimeScheduler.next(relatively: DateTime = DateTime.now()): DateTime {
2019-10-05 05:09:22 +00:00
return cronDateTimes.map { it.toNearDateTime(relatively) }.min() ?: anyCronDateTime.toNearDateTime(relatively)
}
2019-10-05 10:29:59 +00:00
suspend fun CronDateTimeScheduler.doInLoop(block: suspend () -> Boolean) {
2019-10-05 05:09:22 +00:00
do {
delay(next().unixMillisLong - DateTime.now().unixMillisLong)
} while (block())
}
2019-10-05 10:40:51 +00:00
fun createCronDateTimeScheduler(incoming: String): CronDateTimeScheduler {
val (secondsSource, minutesSource, hoursSource, dayOfMonthSource, monthSource) = incoming.split(" ")
val secondsParsed = parseSeconds(secondsSource)
val minutesParsed = parseMinutes(minutesSource)
val hoursParsed = parseHours(hoursSource)
val dayOfMonthParsed = parseDaysOfMonth(dayOfMonthSource)
val monthParsed = parseMonths(monthSource)
val resultCronDateTimes = mutableListOf(CronDateTime())
secondsParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte ->
previousCronDateTime.copy(seconds = currentTime)
}
minutesParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte ->
previousCronDateTime.copy(minutes = currentTime)
}
hoursParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte ->
previousCronDateTime.copy(hours = currentTime)
}
dayOfMonthParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte ->
previousCronDateTime.copy(dayOfMonth = currentTime)
}
monthParsed ?.fillWith(resultCronDateTimes) { previousCronDateTime: CronDateTime, currentTime: Byte ->
previousCronDateTime.copy(month = currentTime)
}
return CronDateTimeScheduler(resultCronDateTimes.toList())
}