Skip to content

Commit 4f80e9a

Browse files
authored
Merge pull request #5 from ditschedev/feature/temporal_fields
feature: temporal fields
2 parents b81ac60 + b19807b commit 4f80e9a

File tree

14 files changed

+428
-5
lines changed

14 files changed

+428
-5
lines changed

.DS_Store

6 KB
Binary file not shown.

src/main/java/dev/ditsche/validator/rule/builder/ArrayElementRuleBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public ArrayElementRuleBuilder size(int min, int max) {
6767
}
6868

6969
@Override
70-
public RuleBuilder custom(Rule rule) {
70+
public ArrayElementRuleBuilder custom(Rule rule) {
7171
this.children.add(rule);
7272
return this;
7373
}

src/main/java/dev/ditsche/validator/rule/builder/ArrayRuleBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public ArrayRuleBuilder optional() {
7171
}
7272

7373
@Override
74-
public RuleBuilder custom(Rule rule) {
74+
public ArrayRuleBuilder custom(Rule rule) {
7575
this.rules.add(rule);
7676
return this;
7777
}

src/main/java/dev/ditsche/validator/rule/builder/BooleanRuleBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public BooleanRuleBuilder isFalse() {
3333
}
3434

3535
@Override
36-
public RuleBuilder custom(Rule rule) {
36+
public BooleanRuleBuilder custom(Rule rule) {
3737
this.rules.add(rule);
3838
return this;
3939
}

src/main/java/dev/ditsche/validator/rule/builder/NumberRuleBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public NumberRuleBuilder defaultValue(Number number) {
4646
}
4747

4848
@Override
49-
public RuleBuilder custom(Rule rule) {
49+
public NumberRuleBuilder custom(Rule rule) {
5050
this.rules.add(rule);
5151
return this;
5252
}

src/main/java/dev/ditsche/validator/rule/builder/Rules.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ public static ArrayRuleBuilder array(String field) {
2525
return new ArrayRuleBuilder(field);
2626
}
2727

28+
public static TemporalRuleBuilder temporal(String field) {
29+
return new TemporalRuleBuilder(field);
30+
}
31+
2832
}

src/main/java/dev/ditsche/validator/rule/builder/StringRuleBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public StringRuleBuilder optional() {
9292
}
9393

9494
@Override
95-
public RuleBuilder custom(Rule rule) {
95+
public StringRuleBuilder custom(Rule rule) {
9696
this.rules.add(rule);
9797
return this;
9898
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package dev.ditsche.validator.rule.builder;
2+
3+
import dev.ditsche.validator.rule.Rule;
4+
import dev.ditsche.validator.rule.ruleset.AfterRule;
5+
import dev.ditsche.validator.rule.ruleset.BeforeRule;
6+
import dev.ditsche.validator.rule.ruleset.RequiredRule;
7+
import dev.ditsche.validator.rule.ruleset.TemporalRule;
8+
import dev.ditsche.validator.validation.Validatable;
9+
import dev.ditsche.validator.validation.ValidationField;
10+
11+
import java.sql.Timestamp;
12+
import java.time.LocalDate;
13+
import java.time.LocalDateTime;
14+
import java.time.LocalTime;
15+
import java.util.Date;
16+
import java.util.LinkedList;
17+
18+
public class TemporalRuleBuilder extends RuleBuilder {
19+
20+
private final String field;
21+
22+
private boolean optional = false;
23+
24+
TemporalRuleBuilder(String field) {
25+
this.field = field;
26+
this.rules = new LinkedList<>();
27+
this.rules.add(new TemporalRule());
28+
}
29+
30+
public TemporalRuleBuilder optional() {
31+
this.optional = true;
32+
return this;
33+
}
34+
35+
public TemporalRuleBuilder future() {
36+
this.rules.add(new AfterRule());
37+
return this;
38+
}
39+
40+
public TemporalRuleBuilder past() {
41+
this.rules.add(new BeforeRule());
42+
return this;
43+
}
44+
45+
public TemporalRuleBuilder after(LocalDateTime now) {
46+
this.rules.add(new AfterRule(now));
47+
return this;
48+
}
49+
50+
public TemporalRuleBuilder after(LocalDate now) {
51+
this.rules.add(new AfterRule(now));
52+
return this;
53+
}
54+
55+
public TemporalRuleBuilder after(LocalTime now) {
56+
this.rules.add(new AfterRule(now));
57+
return this;
58+
}
59+
60+
public TemporalRuleBuilder after(Timestamp now) {
61+
this.rules.add(new AfterRule(now));
62+
return this;
63+
}
64+
65+
public TemporalRuleBuilder after(Date now) {
66+
this.rules.add(new AfterRule(now));
67+
return this;
68+
}
69+
70+
public TemporalRuleBuilder before(LocalDateTime now) {
71+
this.rules.add(new BeforeRule(now));
72+
return this;
73+
}
74+
75+
public TemporalRuleBuilder before(LocalDate now) {
76+
this.rules.add(new BeforeRule(now));
77+
return this;
78+
}
79+
80+
public TemporalRuleBuilder before(LocalTime now) {
81+
this.rules.add(new BeforeRule(now));
82+
return this;
83+
}
84+
85+
public TemporalRuleBuilder before(Timestamp now) {
86+
this.rules.add(new BeforeRule(now));
87+
return this;
88+
}
89+
90+
public TemporalRuleBuilder before(Date now) {
91+
this.rules.add(new BeforeRule(now));
92+
return this;
93+
}
94+
95+
public TemporalRuleBuilder required() {
96+
this.rules.add(new RequiredRule());
97+
return this;
98+
}
99+
100+
@Override
101+
public TemporalRuleBuilder custom(Rule rule) {
102+
this.rules.add(rule);
103+
return this;
104+
}
105+
106+
@Override
107+
public Validatable build() {
108+
return new ValidationField(this.field, this.rules, this.optional);
109+
}
110+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package dev.ditsche.validator.rule.ruleset;
2+
3+
import dev.ditsche.validator.rule.Rule;
4+
import dev.ditsche.validator.rule.RuleResult;
5+
6+
import java.sql.Timestamp;
7+
import java.time.LocalDate;
8+
import java.time.LocalDateTime;
9+
import java.time.LocalTime;
10+
import java.time.format.DateTimeFormatter;
11+
import java.util.Date;
12+
13+
public class AfterRule implements Rule {
14+
15+
private final LocalDateTime relative;
16+
17+
public AfterRule() {
18+
this(LocalDateTime.now());
19+
}
20+
21+
public AfterRule(Date date) {
22+
this(new Timestamp(date.getTime()));
23+
}
24+
25+
public AfterRule(Timestamp date) {
26+
this(date.toLocalDateTime());
27+
}
28+
29+
public AfterRule(LocalDate now) {
30+
this(LocalDateTime.of(now, LocalTime.MIN));
31+
}
32+
33+
public AfterRule(LocalTime now) {
34+
this(LocalDateTime.of(LocalDate.MIN, now));
35+
}
36+
37+
public AfterRule(LocalDateTime now) {
38+
relative = now;
39+
}
40+
41+
@Override
42+
public RuleResult test(Object value) {
43+
44+
if(value instanceof Date) {
45+
return RuleResult.passes(((Date) value).after(Timestamp.valueOf(relative)));
46+
}
47+
48+
if(value instanceof LocalDateTime) {
49+
LocalDateTime dt = (LocalDateTime) value;
50+
return RuleResult.passes(dt.isAfter(relative));
51+
}
52+
if(value instanceof LocalDate) {
53+
LocalDate dt = (LocalDate) value;
54+
return RuleResult.passes(dt.isAfter(relative.toLocalDate()));
55+
}
56+
if(value instanceof LocalTime) {
57+
LocalTime dt = (LocalTime) value;
58+
return RuleResult.passes(dt.isAfter(relative.toLocalTime()));
59+
}
60+
61+
return RuleResult.reject();
62+
}
63+
64+
@Override
65+
public String message(String field) {
66+
return String.format("The field \"%s\" needs to be after %s", field, relative.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
67+
}
68+
69+
@Override
70+
public String getType() {
71+
return RULE_TYPE_PREFIX + "temporal.future";
72+
}
73+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package dev.ditsche.validator.rule.ruleset;
2+
3+
import dev.ditsche.validator.rule.Rule;
4+
import dev.ditsche.validator.rule.RuleResult;
5+
6+
import java.sql.Timestamp;
7+
import java.time.LocalDate;
8+
import java.time.LocalDateTime;
9+
import java.time.LocalTime;
10+
import java.time.format.DateTimeFormatter;
11+
import java.util.Date;
12+
13+
public class BeforeRule implements Rule {
14+
15+
private final LocalDateTime relative;
16+
17+
public BeforeRule() {
18+
this(LocalDateTime.now());
19+
}
20+
21+
public BeforeRule(Date date) {
22+
this(new Timestamp(date.getTime()));
23+
}
24+
25+
public BeforeRule(Timestamp date) {
26+
this(date.toLocalDateTime());
27+
}
28+
29+
public BeforeRule(LocalDate now) {
30+
this(LocalDateTime.of(now, LocalTime.MIN));
31+
}
32+
33+
public BeforeRule(LocalTime now) {
34+
this(LocalDateTime.of(LocalDate.MIN, now));
35+
}
36+
37+
public BeforeRule(LocalDateTime now) {
38+
relative = now;
39+
}
40+
41+
@Override
42+
public RuleResult test(Object value) {
43+
44+
if(value instanceof Date) {
45+
return RuleResult.passes(((Date) value).before(Timestamp.valueOf(relative)));
46+
}
47+
48+
if(value instanceof LocalDateTime) {
49+
LocalDateTime dt = (LocalDateTime) value;
50+
return RuleResult.passes(dt.isBefore(relative));
51+
}
52+
if(value instanceof LocalDate) {
53+
LocalDate dt = (LocalDate) value;
54+
return RuleResult.passes(dt.isBefore(relative.toLocalDate()));
55+
}
56+
if(value instanceof LocalTime) {
57+
LocalTime dt = (LocalTime) value;
58+
return RuleResult.passes(dt.isBefore(relative.toLocalTime()));
59+
}
60+
61+
return RuleResult.reject();
62+
}
63+
64+
@Override
65+
public String message(String field) {
66+
return String.format("The field \"%s\" needs to be before %s", field, relative.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
67+
}
68+
69+
@Override
70+
public String getType() {
71+
return RULE_TYPE_PREFIX + "temporal.past";
72+
}
73+
}

0 commit comments

Comments
 (0)