package tc.oc.time; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.time.Duration; /** * An annotation that can represent time periods. * * Useful for nesting in other annotations e.g. * <p> * {@code @Delay(interval = @Time(seconds = 5)) } * <p> * Use the inner {@link convertTo} class to convert the annotation to other types: * <p> * {@code Time.to.duration(annotation) } */ @Retention(RetentionPolicy.RUNTIME) public @interface Time { long ticks()default 0; long milliseconds()default 0; int seconds()default 0; int minutes()default 0; int hours()default 0; int days()default 0; class convertTo { public static long milliseconds(Time span) { return span.milliseconds() + 50 * ( span.ticks() + 20 * ( span.seconds() + 60 * ( span.minutes() + 60 * ( span.hours() + 24 * span.days() ) ) ) ); } public static Duration duration(Time span) { return Duration.ofMillis(milliseconds(span)); } } }