package com.supaham.commons.utils; import com.google.common.base.Preconditions; import com.supaham.commons.exceptions.DurationParseException; import java.time.Duration; import java.util.Random; import javax.annotation.Nonnull; /** * Utility methods for working with {@link Duration} instances. This class contains methods such as * {@link #parseDuration(CharSequence)}, {@link #toString(Duration, boolean)} and more. * * @since 0.1 */ public class DurationUtils { /** * Parses a {@link CharSequence} into a {@link Duration} using {@link * TimeUtils#parseDurationMs(CharSequence)}. In short, 1d2h3m4s is valid, whereas 1x is not. * <pre> * DurationUtils.parseDuration("1s") is <b>valid</b> * DurationUtils.parseDuration("1m1s") is <b>valid</b> * DurationUtils.parseDuration("1h1m1s") is <b>valid</b> * DurationUtils.parseDuration("1d1h1m1s") is <b>valid</b> * DurationUtils.parseDuration("1d1h1m1s1x") is <b>valid</b> * DurationUtils.parseDuration("1x") is <b>invalid</b> * </pre> * * @param text text to parse * * @return the {@link Duration} * * @throws DurationParseException thrown if the text failed to parse * @see TimeUtils#parseDuration(CharSequence) */ public static Duration parseDuration(@Nonnull CharSequence text) throws DurationParseException { return Duration.ofMillis(TimeUtils.parseDurationMs(text)); } /** * Converts a {@link Duration} into a {@link String}. <br /> The following examples are * demonstrated for a Duration with 3725 seconds: * <pre> * DurationUtils.toString(duration, true) = 1h2m5s * DurationUtils.toString(duration, false) = 1 hour 2 minutes 5 seconds * </pre> * * @param duration duration to convert * @param simple whether the string should be simple or pretty. If true, simple, the string can * be passed later to {@link #parseDuration(CharSequence)} for parsing into a {@link Duration} * once again. * * @return the string of the {@code duration} * * @see TimeUtils#toString(long, boolean) */ public static String toString(@Nonnull Duration duration, boolean simple) { return TimeUtils.toString(duration.getSeconds(), simple); } /** * Returns a random duration between two given {@link Duration} instances. * * @param d1 first duration * @param d2 second duration * * @return a pseudorandom duration * * @see #randomDuration(Random, Duration, Duration) */ public static Duration randomDuration(@Nonnull Duration d1, @Nonnull Duration d2) { return randomDuration(RandomUtils.getRandom(), d1, d2); } /** * Returns a random duration between two given {@link Duration} instances. * * @param random random instance to use * @param d1 first duration * @param d2 second duration * * @return a pseudorandom duration */ public static Duration randomDuration(@Nonnull Random random, @Nonnull Duration d1, @Nonnull Duration d2) { Preconditions.checkNotNull(d1, "first duration cannot be null"); Preconditions.checkNotNull(d2, "second duration cannot be null"); long diff = Math.abs(d1.toMillis() - d2.toMillis()); return Duration.ofMillis(RandomUtils.nextLong(random, diff)); } private DurationUtils() {} }