-
Notifications
You must be signed in to change notification settings - Fork 869
Description
I think it would be very useful to have a duration type natively in toml. It's a thing I use a lot in my web service configs, for cache TTL or timeouts. Right now I resort to using integers and making the key include the resolution (e.g. timeout_ms
, ttl_hours
). This has a couple of disadvantages:
- Requires extra code every time to be converted to actual language specific duration type.
- If the resolution chosen was wrong you have at least one of these problems:
- You have to change the key, resulting in backwards incompatibility
- You have to add zeros, which decreases readability
- You have to do calculations. e.g. if have
ttl_hours
and want 9 days you need have to enter216
. Which makes it (at least to me) not obvious when quickly looking at the config.
I would propose the following basic and IMHO natural syntax (inspired by go duration parsing/formatting):
day = 1d
hour = 1h
minute = 1m
second = 1s
milli = 1ms
micro1 = 1µs # U+00B5 = micro symbol
micro2 = 1μs # U+03BC = Greek letter mu
nano = 1ns
# allows floats
micro3 = 0.1ms
# allows combining
two_and_a_half_hours = 2h30m
# not advised but possible
five_seconds = 2s3s
# can be negative
minus_one_seconds = -1s
# allows underscores
hundred_thousand_hours = 100_000h
This notably doesn't include months and years because they can differ in duration and are quite easily approximated in days. I'm also fine with the following changes:
- Taking out/changing the
µ
for micro seconds. I think it's fine to use0.1ms
in most cases, so it's not strictly needed. I mainly put it in because Go duration parsing and formatting allows/uses it as well. - I'm fine with adding a prefix to make differentiation with numbers easier. For instance
D
which would result inD2h30m
. - Removing the duplication possibility for
2s3s
. Again I mainly put this in because the Go duration parsing allows it.
I really hope this is considered for inclusion as it would be really useful to me and my colleagues. (Much more so than the already supported datetime type, which I've never had an actual use for in a config).
PS. I created a modified fork https://github.com/pelletier/go-toml that supports this: https://github.com/JelteF/go-toml (see the last couple of commits)