Przeglądaj źródła

draft: datetime writer

Ranides Atterwim 11 miesięcy temu
rodzic
commit
9962417fcc

+ 1 - 0
assira.commons/src/main/java/net/ranides/assira/time/ZonedDate.java

@@ -311,6 +311,7 @@ public class ZonedDate implements Comparable<ZonedDate>, Temporal, ZonedRange {
         return date.getLong(field);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public  <R> R query(TemporalQuery<R> query) {
         if (query == TemporalQueries.zone() || query == TemporalQueries.zoneId()) {

+ 3 - 0
assira.commons/src/main/java/net/ranides/assira/time/ZonedTime.java

@@ -334,12 +334,15 @@ public class ZonedTime implements Comparable<ZonedTime>, Temporal {
         return time + " [" + zone + "]";
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public  <R> R query(TemporalQuery<R> query) {
         if (query == TemporalQueries.zone() || query == TemporalQueries.zoneId()) {
+            //noinspection unchecked
             return (R) getZone();
         }
         else if (query == TemporalQueries.precision()) {
+            //noinspection unchecked
             return (R)ChronoUnit.NANOS;
         }
         return query.queryFrom(time);

+ 19 - 15
assira.commons/src/main/java/net/ranides/assira/time/format/DateTimeReader.java

@@ -88,7 +88,7 @@ public class DateTimeReader {
 
     public static final DateTimeReader TIME = new DateTimeReader(TIME_PARSER);
 
-    private final DateTimeReader parent;
+    private final DateTimeReader fallback;
 
     private final DateTimeFormatter parser;
 
@@ -106,16 +106,20 @@ public class DateTimeReader {
         this(null, format, null, null);
     }
 
+    public DateTimeReader withFallback(DateTimeReader fallback) {
+        return new DateTimeReader(fallback, parser, sourceZone, targetZone);
+    }
+
     public DateTimeReader withFormat(String newFormat) {
         return new DateTimeReader(DateTimeFormatter.ofPattern(newFormat));
     }
 
     public DateTimeReader withFormat(DateTimeFormatter newFormat) {
-        return new DateTimeReader(null, newFormat, sourceZone, targetZone);
+        return new DateTimeReader(fallback, newFormat, sourceZone, targetZone);
     }
 
     public DateTimeReader withLocale(Locale newLocale) {
-        return new DateTimeReader(parent, parser.withLocale(newLocale), sourceZone, targetZone);
+        return new DateTimeReader(fallback, parser.withLocale(newLocale), sourceZone, targetZone);
     }
 
     public DateTimeReader withLocale(String newLocale) {
@@ -127,7 +131,7 @@ public class DateTimeReader {
     }
 
     public DateTimeReader withZone(ZoneId newZone) {
-        return new DateTimeReader(parent, parser, newZone, newZone);
+        return new DateTimeReader(fallback, parser, newZone, newZone);
     }
 
     public DateTimeReader withZone(String newZone) {
@@ -135,11 +139,11 @@ public class DateTimeReader {
     }
 
     public DateTimeReader withoutZone() {
-        return new DateTimeReader(parent, parser, null, null);
+        return new DateTimeReader(fallback, parser, null, null);
     }
 
     public DateTimeReader withSourceZone(ZoneId newZone) {
-        return new DateTimeReader(parent, parser, newZone, targetZone);
+        return new DateTimeReader(fallback, parser, newZone, targetZone);
     }
 
     public DateTimeReader withSourceZone(String newZone) {
@@ -147,11 +151,11 @@ public class DateTimeReader {
     }
 
     public DateTimeReader withoutSourceZone() {
-        return new DateTimeReader(parent, parser, null, targetZone);
+        return new DateTimeReader(fallback, parser, null, targetZone);
     }
 
     public DateTimeReader withTargetZone(ZoneId newZone) {
-        return new DateTimeReader(parent, parser, sourceZone, newZone);
+        return new DateTimeReader(fallback, parser, sourceZone, newZone);
     }
 
     public DateTimeReader withTargetZone(String newZone) {
@@ -159,7 +163,7 @@ public class DateTimeReader {
     }
 
     public DateTimeReader withoutTargetZone() {
-        return new DateTimeReader(parent, parser, sourceZone, null);
+        return new DateTimeReader(fallback, parser, sourceZone, null);
     }
 
     public ZonedDateTime parse(String input) {
@@ -169,8 +173,8 @@ public class DateTimeReader {
         try {
             return newDateTime(parser.parse(input, v -> v));
         } catch (DateTimeParseException e) {
-            if(parent != null) {
-                return parent.parse(input);
+            if(fallback != null) {
+                return fallback.parse(input);
             }
             throw e;
         }
@@ -183,8 +187,8 @@ public class DateTimeReader {
         try {
             return newDate(parser.parse(input, v -> v));
         } catch (DateTimeParseException e) {
-            if(parent != null) {
-                return parent.parseDate(input);
+            if(fallback != null) {
+                return fallback.parseDate(input);
             }
             throw e;
         }
@@ -197,8 +201,8 @@ public class DateTimeReader {
         try {
             return newTime(parser.parse(input, v -> v));
         } catch (DateTimeParseException e) {
-            if(parent != null) {
-                return parent.parseTime(input);
+            if(fallback != null) {
+                return fallback.parseTime(input);
             }
             throw e;
         }

+ 25 - 39
assira.commons/src/main/java/net/ranides/assira/time/format/DateTimeWriter.java

@@ -2,7 +2,6 @@ package net.ranides.assira.time.format;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
-import lombok.Getter;
 
 import java.time.LocalDate;
 import java.time.LocalTime;
@@ -26,47 +25,44 @@ public class DateTimeWriter {
 
     public static final DateTimeWriter TIME = new DateTimeWriter(DateTimeFormatter.ofPattern("HH:mm:ss"));
 
+    private final DateTimeWriter fallback;
 
     private final DateTimeFormatter printer;
 
-    @Getter
-    private final Locale locale;
-
-    @Getter
-    private final ZoneId targetZone;
-
-    // @todo chain
-
     public DateTimeWriter(DateTimeFormatter printer) {
-        this(printer, null, null);
+        this(null, printer);
     }
 
     public DateTimeWriter(String pattern) {
         this(DateTimeFormatter.ofPattern(pattern));
     }
 
+    public DateTimeWriter withFallback(DateTimeWriter fallback) {
+        return new DateTimeWriter(fallback, printer);
+    }
+
     public DateTimeWriter withFormat(String newFormat) {
         return new DateTimeWriter(DateTimeFormatter.ofPattern(newFormat));
     }
 
     public DateTimeWriter withFormat(DateTimeFormatter newFormat) {
-        return new DateTimeWriter(newFormat, locale, targetZone);
+        return new DateTimeWriter(fallback, newFormat);
     }
 
     public DateTimeWriter withLocale(Locale newLocale) {
-        return new DateTimeWriter(printer, newLocale, targetZone);
-    }
-
-    public DateTimeWriter withoutLocale() {
-        return new DateTimeWriter(printer, null, targetZone);
+        return new DateTimeWriter(fallback, printer.withLocale(newLocale));
     }
 
     public DateTimeWriter withLocale(String newLocale) {
         return withLocale(Locale.forLanguageTag(newLocale));
     }
 
+    public DateTimeWriter withoutLocale() {
+        return withLocale(Locale.getDefault(Locale.Category.FORMAT));
+    }
+
     public DateTimeWriter withZone(ZoneId newZone) {
-        return new DateTimeWriter(printer, locale, newZone);
+        return new DateTimeWriter(fallback, printer.withZone(newZone));
     }
 
     public DateTimeWriter withZone(String newZone) {
@@ -74,44 +70,34 @@ public class DateTimeWriter {
     }
 
     public DateTimeWriter withoutZone() {
-        return new DateTimeWriter(printer, locale, null);
-    }
-
-    public DateTimeWriter withoutTargetZone() {
-        return new DateTimeWriter(printer, locale, null);
+        return new DateTimeWriter(fallback, printer.withZone(null));
     }
 
     public DateTimeWriter withTargetZone(ZoneId newZone) {
-        return new DateTimeWriter(printer, locale, newZone);
+        return withZone(newZone);
     }
 
     public DateTimeWriter withTargetZone(String newZone) {
-        return withTargetZone(ZoneId.of(newZone));
+        return withZone(newZone);
+    }
+
+    public DateTimeWriter withoutTargetZone() {
+        return withoutZone();
     }
 
     public String format(Temporal input) {
-        return printFormatter().format(input);
+        return printer.format(input);
     }
 
     public String formatDate(Temporal input) {
-        // @todo validate zone conversion, test
-        return printFormatter().format(input.with(LocalTime.MIN));
+        return printer.format(input.with(LocalTime.MIN));
     }
 
     public String formatTime(Temporal input) {
-        // @todo validate zone conversion, test
-        return printFormatter().format(input.with(LocalDate.ofEpochDay(0)));
+        return printer.format(input.with(LocalDate.ofEpochDay(0)));
     }
 
-    private DateTimeFormatter printFormatter() {
-        DateTimeFormatter fmt = printer;
-        if(locale != null) {
-            fmt = fmt.withLocale(locale);
-        }
-        if(targetZone != null) {
-            fmt = fmt.withZone(targetZone);
-        }
-        return fmt;
+    public ZoneId getTargetZone() {
+        return printer.getZone();
     }
-
 }