package com.googlecode.totallylazy.time;
import com.googlecode.totallylazy.functions.Function1;
import com.googlecode.totallylazy.Sequence;
import java.text.DateFormat;
import java.util.Date;
import static com.googlecode.totallylazy.functions.Callables.callThrows;
import static com.googlecode.totallylazy.Sequences.sequence;
public class DateFormatConverter implements DateConverter {
private final Sequence<DateFormat> formats;
public DateFormatConverter(String... formats) {
this(sequence(formats).map(asDateFormat()));
}
public static Function1<? super String, DateFormat> asDateFormat() {
return Dates::format;
}
public Sequence<DateFormat> formats() {
return formats;
}
public DateFormatConverter(DateFormat... formats) {
this(sequence(formats));
}
public DateFormatConverter(Iterable<DateFormat> formats) {
this.formats = sequence(formats);
if (this.formats.isEmpty()) {
throw new IllegalArgumentException("No format specified");
}
}
public static DateFormatConverter defaultConverter() {
return new DateFormatConverter(Dates.RFC3339().formats().join(sequence(Dates.RFC822(), Dates.javaUtilDateToString(), Dates.LEXICAL(), Dates.APACHE())));
}
public String format(final Date value) {
return formats.head().format(value);
}
public Date parse(final String value) {
return formats.tryPick(parseToDate(value).optional()).
getOrElse(callThrows(new IllegalArgumentException("Invalid date string: " + value), Date.class));
}
public static Function1<DateFormat, Date> parseToDate(final String value) {
return dateFormat -> dateFormat.parse(value);
}
}