88 lines
2.2 KiB
Nim
88 lines
2.2 KiB
Nim
import std/cmdline
|
|
import std/parseopt
|
|
import std/strutils
|
|
|
|
type TimeOrTicks = object
|
|
isTime: bool
|
|
isTicks: bool
|
|
|
|
type Time = object
|
|
seconds: int = 0
|
|
minutes: int = 0
|
|
hours: int = 0
|
|
days: int = 0
|
|
|
|
proc convertToTicks(time: var Time): int =
|
|
time.hours += time.days * 24
|
|
time.minutes += time.hours * 60
|
|
time.seconds += time.minutes * 60
|
|
|
|
time.seconds * 20
|
|
|
|
proc convertToTime(ticks: var int): Time =
|
|
# Note that here div is used for integer division specifically
|
|
const secondsInHour = 3600
|
|
|
|
ticks = ticks div 20
|
|
var days = ticks div (24 * secondsInHour)
|
|
|
|
ticks = ticks mod (24 * secondsInHour)
|
|
var hours = ticks div secondsInHour
|
|
|
|
ticks = ticks mod secondsInHour
|
|
var minutes = ticks div 60
|
|
|
|
ticks = ticks mod 60
|
|
var seconds = ticks
|
|
|
|
Time(seconds: seconds, minutes: minutes, hours: hours, days: days)
|
|
|
|
when isMainModule:
|
|
var params = commandLineParams()
|
|
var p = initOptParser(params)
|
|
|
|
var check = TimeOrTicks()
|
|
var time = Time()
|
|
var ticks = 0
|
|
|
|
while true:
|
|
p.next()
|
|
case p.kind
|
|
of cmdEnd: break
|
|
of cmdArgument: continue
|
|
of cmdShortOption, cmdLongOption:
|
|
case p.key
|
|
of "t":
|
|
if check.isTime:
|
|
quit("Cannot convert ticks while converting time")
|
|
ticks = parseInt(p.val)
|
|
check.isTicks = true
|
|
of "s":
|
|
if check.isTicks:
|
|
quit("Cannot convert time while converting ticks")
|
|
time.seconds = parseInt(p.val)
|
|
check.isTime = true
|
|
of "m":
|
|
if check.isTicks:
|
|
quit("Cannot convert time while converting ticks")
|
|
time.minutes = parseInt(p.val)
|
|
check.isTime = true
|
|
of "h":
|
|
if check.isTicks:
|
|
quit("Cannot convert time while converting ticks")
|
|
time.hours = parseInt(p.val)
|
|
check.isTime = true
|
|
of "d":
|
|
if check.isTicks:
|
|
quit("Cannot convert time while converting ticks")
|
|
time.days = parseInt(p.val)
|
|
check.isTime = true
|
|
|
|
if check.isTime:
|
|
var result = convertToTicks(time)
|
|
echo "Ticks: ", result
|
|
else:
|
|
var result = convertToTime(ticks)
|
|
echo "Days: ", result.days, "\nHours: ", result.hours, "\nMinutes: ", result.minutes, "\nSeconds: ", result.seconds
|
|
|