Skip to content

Commit 1a06935

Browse files
committed
USe full proprty path for missing value exception
1 parent 4b6c41a commit 1a06935

File tree

6 files changed

+81
-35
lines changed

6 files changed

+81
-35
lines changed

src/main/java/com/coditory/quark/config/Config.java

+21
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,27 @@ default AuditableConfig auditable() {
9191
return AuditableConfig.of(this);
9292
}
9393

94+
@NotNull
95+
default <T> T mapSubConfig(@NotNull String path, @NotNull Function<Config, T> configMapper) {
96+
Config subconfig = this.getSubConfig(path);
97+
return configMapper.apply(subconfig);
98+
}
99+
100+
@Nullable
101+
default <T> T mapSubConfigOrNull(@NotNull String path, @NotNull Function<Config, T> configMapper) {
102+
Config subconfig = this.getSubConfigOrNull(path);
103+
if (subconfig == null) {
104+
return null;
105+
}
106+
return configMapper.apply(subconfig);
107+
}
108+
109+
@NotNull
110+
default <T> T mapSubConfigOrEmpty(@NotNull String path, @NotNull Function<Config, T> configMapper) {
111+
Config subconfig = this.getSubConfigOrEmpty(path);
112+
return configMapper.apply(subconfig);
113+
}
114+
94115
default <T> T mapAuditableSubConfigOrNull(@NotNull String path, @NotNull Function<AuditableConfig, T> configMapper) {
95116
Config subconfig = this.getSubConfigOrNull(path);
96117
if (subconfig == null) {

src/main/java/com/coditory/quark/config/ConfigGetters.java

+36-33
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import static com.coditory.quark.config.Preconditions.expectNonNull;
1818

1919
interface ConfigGetters {
20+
@NotNull
21+
String getPath();
22+
2023
@NotNull
2124
<T> Optional<T> getAsOptional(@NotNull Class<T> type, @NotNull String path);
2225

@@ -28,7 +31,7 @@ default <T> T get(@NotNull Class<T> type, @NotNull String path) {
2831
expectNonNull(type, "type");
2932
expectNonNull(path, "path");
3033
return getAsOptional(type, path)
31-
.orElseThrow(() -> missingConfigValueForPath(path));
34+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
3235
}
3336

3437
@Nullable
@@ -51,7 +54,7 @@ default <T> List<T> getList(Class<T> type, String path) {
5154
expectNonNull(type, "type");
5255
expectNonNull(path, "path");
5356
return getListAsOptional(type, path)
54-
.orElseThrow(() -> missingConfigValueForPath(path));
57+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
5558
}
5659

5760
@Nullable
@@ -83,7 +86,7 @@ default Optional<String> getStringAsOptional(@NotNull String path) {
8386
default String getString(@NotNull String path) {
8487
expectNonNull(path, "path");
8588
return getStringAsOptional(path)
86-
.orElseThrow(() -> missingConfigValueForPath(path));
89+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
8790
}
8891

8992
@Nullable
@@ -111,7 +114,7 @@ default Optional<Object> getObjectAsOptional(@NotNull String path) {
111114
default Object getObject(@NotNull String path) {
112115
expectNonNull(path, "path");
113116
return getObjectAsOptional(path)
114-
.orElseThrow(() -> missingConfigValueForPath(path));
117+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
115118
}
116119

117120
@Nullable
@@ -139,7 +142,7 @@ default Optional<Boolean> getBooleanAsOptional(@NotNull String path) {
139142
default Boolean getBoolean(@NotNull String path) {
140143
expectNonNull(path, "path");
141144
return getBooleanAsOptional(path)
142-
.orElseThrow(() -> missingConfigValueForPath(path));
145+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
143146
}
144147

145148
@Nullable
@@ -167,7 +170,7 @@ default Optional<Short> getShortAsOptional(@NotNull String path) {
167170
default Short getShort(@NotNull String path) {
168171
expectNonNull(path, "path");
169172
return getShortAsOptional(path)
170-
.orElseThrow(() -> missingConfigValueForPath(path));
173+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
171174
}
172175

173176
@Nullable
@@ -195,7 +198,7 @@ default Optional<Byte> getByteAsOptional(@NotNull String path) {
195198
default Byte getByte(@NotNull String path) {
196199
expectNonNull(path, "path");
197200
return getByteAsOptional(path)
198-
.orElseThrow(() -> missingConfigValueForPath(path));
201+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
199202
}
200203

201204
@Nullable
@@ -223,7 +226,7 @@ default Optional<Integer> getIntegerAsOptional(@NotNull String path) {
223226
default Integer getInteger(@NotNull String path) {
224227
expectNonNull(path, "path");
225228
return getIntegerAsOptional(path)
226-
.orElseThrow(() -> missingConfigValueForPath(path));
229+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
227230
}
228231

229232
@Nullable
@@ -251,7 +254,7 @@ default Optional<Long> getLongAsOptional(@NotNull String path) {
251254
default Long getLong(@NotNull String path) {
252255
expectNonNull(path, "path");
253256
return getLongAsOptional(path)
254-
.orElseThrow(() -> missingConfigValueForPath(path));
257+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
255258
}
256259

257260
@Nullable
@@ -279,7 +282,7 @@ default Optional<Float> getFloatAsOptional(@NotNull String path) {
279282
default Float getFloat(@NotNull String path) {
280283
expectNonNull(path, "path");
281284
return getFloatAsOptional(path)
282-
.orElseThrow(() -> missingConfigValueForPath(path));
285+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
283286
}
284287

285288
@Nullable
@@ -307,7 +310,7 @@ default Optional<Double> getDoubleAsOptional(@NotNull String path) {
307310
default Double getDouble(@NotNull String path) {
308311
expectNonNull(path, "path");
309312
return getDoubleAsOptional(path)
310-
.orElseThrow(() -> missingConfigValueForPath(path));
313+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
311314
}
312315

313316
@Nullable
@@ -335,7 +338,7 @@ default Optional<BigDecimal> getBigDecimalAsOptional(@NotNull String path) {
335338
default BigDecimal getBigDecimal(@NotNull String path) {
336339
expectNonNull(path, "path");
337340
return getBigDecimalAsOptional(path)
338-
.orElseThrow(() -> missingConfigValueForPath(path));
341+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
339342
}
340343

341344
@Nullable
@@ -363,7 +366,7 @@ default Optional<Instant> getInstantAsOptional(@NotNull String path) {
363366
default Instant getInstant(@NotNull String path) {
364367
expectNonNull(path, "path");
365368
return getInstantAsOptional(path)
366-
.orElseThrow(() -> missingConfigValueForPath(path));
369+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
367370
}
368371

369372
@Nullable
@@ -391,7 +394,7 @@ default Optional<ZonedDateTime> getZonedDateTimeAsOptional(@NotNull String path)
391394
default ZonedDateTime getZonedDateTime(@NotNull String path) {
392395
expectNonNull(path, "path");
393396
return getZonedDateTimeAsOptional(path)
394-
.orElseThrow(() -> missingConfigValueForPath(path));
397+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
395398
}
396399

397400
@Nullable
@@ -419,7 +422,7 @@ default Optional<Duration> getDurationAsOptional(@NotNull String path) {
419422
default Duration getDuration(@NotNull String path) {
420423
expectNonNull(path, "path");
421424
return getDurationAsOptional(path)
422-
.orElseThrow(() -> missingConfigValueForPath(path));
425+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
423426
}
424427

425428
@Nullable
@@ -447,7 +450,7 @@ default Optional<Locale> getLocaleAsOptional(@NotNull String path) {
447450
default Locale getLocale(@NotNull String path) {
448451
expectNonNull(path, "path");
449452
return getLocaleAsOptional(path)
450-
.orElseThrow(() -> missingConfigValueForPath(path));
453+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
451454
}
452455

453456
@Nullable
@@ -475,7 +478,7 @@ default Optional<Currency> getCurrencyAsOptional(@NotNull String path) {
475478
default Currency getCurrency(@NotNull String path) {
476479
expectNonNull(path, "path");
477480
return getCurrencyAsOptional(path)
478-
.orElseThrow(() -> missingConfigValueForPath(path));
481+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
479482
}
480483

481484
@Nullable
@@ -505,7 +508,7 @@ default Optional<List<String>> getStringListAsOptional(@NotNull String path) {
505508
default List<String> getStringList(@NotNull String path) {
506509
expectNonNull(path, "path");
507510
return getStringListAsOptional(path)
508-
.orElseThrow(() -> missingConfigValueForPath(path));
511+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
509512
}
510513

511514
@Nullable
@@ -539,7 +542,7 @@ default Optional<List<Object>> getObjectListAsOptional(@NotNull String path) {
539542
default List<Object> getObjectList(@NotNull String path) {
540543
expectNonNull(path, "path");
541544
return getObjectListAsOptional(path)
542-
.orElseThrow(() -> missingConfigValueForPath(path));
545+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
543546
}
544547

545548
@Nullable
@@ -567,7 +570,7 @@ default Optional<List<Boolean>> getBooleanListAsOptional(@NotNull String path) {
567570
default List<Boolean> getBooleanList(@NotNull String path) {
568571
expectNonNull(path, "path");
569572
return getBooleanListAsOptional(path)
570-
.orElseThrow(() -> missingConfigValueForPath(path));
573+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
571574
}
572575

573576
@Nullable
@@ -595,7 +598,7 @@ default Optional<List<Short>> getShortListAsOptional(@NotNull String path) {
595598
default List<Short> getShortList(@NotNull String path) {
596599
expectNonNull(path, "path");
597600
return getShortListAsOptional(path)
598-
.orElseThrow(() -> missingConfigValueForPath(path));
601+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
599602
}
600603

601604
@Nullable
@@ -623,7 +626,7 @@ default Optional<List<Byte>> getByteListAsOptional(@NotNull String path) {
623626
default List<Byte> getByteList(@NotNull String path) {
624627
expectNonNull(path, "path");
625628
return getByteListAsOptional(path)
626-
.orElseThrow(() -> missingConfigValueForPath(path));
629+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
627630
}
628631

629632
@Nullable
@@ -651,7 +654,7 @@ default Optional<List<Integer>> getIntegerListAsOptional(@NotNull String path) {
651654
default List<Integer> getIntegerList(@NotNull String path) {
652655
expectNonNull(path, "path");
653656
return getIntegerListAsOptional(path)
654-
.orElseThrow(() -> missingConfigValueForPath(path));
657+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
655658
}
656659

657660
@Nullable
@@ -679,7 +682,7 @@ default Optional<List<Long>> getLongListAsOptional(@NotNull String path) {
679682
default List<Long> getLongList(@NotNull String path) {
680683
expectNonNull(path, "path");
681684
return getLongListAsOptional(path)
682-
.orElseThrow(() -> missingConfigValueForPath(path));
685+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
683686
}
684687

685688
@Nullable
@@ -707,7 +710,7 @@ default Optional<List<Float>> getFloatListAsOptional(@NotNull String path) {
707710
default List<Float> getFloatList(@NotNull String path) {
708711
expectNonNull(path, "path");
709712
return getFloatListAsOptional(path)
710-
.orElseThrow(() -> missingConfigValueForPath(path));
713+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
711714
}
712715

713716
@Nullable
@@ -735,7 +738,7 @@ default Optional<List<Double>> getDoubleListAsOptional(@NotNull String path) {
735738
default List<Double> getDoubleList(@NotNull String path) {
736739
expectNonNull(path, "path");
737740
return getDoubleListAsOptional(path)
738-
.orElseThrow(() -> missingConfigValueForPath(path));
741+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
739742
}
740743

741744
@Nullable
@@ -763,7 +766,7 @@ default Optional<List<BigDecimal>> getBigDecimalListAsOptional(@NotNull String p
763766
default List<BigDecimal> getBigDecimalList(@NotNull String path) {
764767
expectNonNull(path, "path");
765768
return getBigDecimalListAsOptional(path)
766-
.orElseThrow(() -> missingConfigValueForPath(path));
769+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
767770
}
768771

769772
@Nullable
@@ -791,7 +794,7 @@ default Optional<List<Instant>> getInstantListAsOptional(@NotNull String path) {
791794
default List<Instant> getInstantList(@NotNull String path) {
792795
expectNonNull(path, "path");
793796
return getInstantListAsOptional(path)
794-
.orElseThrow(() -> missingConfigValueForPath(path));
797+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
795798
}
796799

797800
@Nullable
@@ -819,7 +822,7 @@ default Optional<List<ZonedDateTime>> getZonedDateTimeListAsOptional(@NotNull St
819822
default List<ZonedDateTime> getZonedDateTimeList(@NotNull String path) {
820823
expectNonNull(path, "path");
821824
return getZonedDateTimeListAsOptional(path)
822-
.orElseThrow(() -> missingConfigValueForPath(path));
825+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
823826
}
824827

825828
@Nullable
@@ -847,7 +850,7 @@ default Optional<List<Duration>> getDurationListAsOptional(@NotNull String path)
847850
default List<Duration> getDurationList(@NotNull String path) {
848851
expectNonNull(path, "path");
849852
return getDurationListAsOptional(path)
850-
.orElseThrow(() -> missingConfigValueForPath(path));
853+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
851854
}
852855

853856
@Nullable
@@ -875,7 +878,7 @@ default Optional<List<Locale>> getLocaleListAsOptional(@NotNull String path) {
875878
default List<Locale> getLocaleList(@NotNull String path) {
876879
expectNonNull(path, "path");
877880
return getLocaleListAsOptional(path)
878-
.orElseThrow(() -> missingConfigValueForPath(path));
881+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
879882
}
880883

881884
@Nullable
@@ -903,7 +906,7 @@ default Optional<List<Currency>> getCurrencyListAsOptional(@NotNull String path)
903906
default List<Currency> getCurrencyList(@NotNull String path) {
904907
expectNonNull(path, "path");
905908
return getCurrencyListAsOptional(path)
906-
.orElseThrow(() -> missingConfigValueForPath(path));
909+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
907910
}
908911

909912
@Nullable
@@ -931,7 +934,7 @@ default Optional<List<Config>> getSubConfigListAsOptional(@NotNull String path)
931934
default List<Config> getSubConfigList(@NotNull String path) {
932935
expectNonNull(path, "path");
933936
return getSubConfigListAsOptional(path)
934-
.orElseThrow(() -> missingConfigValueForPath(path));
937+
.orElseThrow(() -> missingConfigValueForPath(getPath(), path));
935938
}
936939

937940
@NotNull

src/main/java/com/coditory/quark/config/MissingConfigValueException.java

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ public static MissingConfigValueException missingConfigValueForPath(String path)
55
return new MissingConfigValueException("Missing config value for path: " + path);
66
}
77

8+
public static MissingConfigValueException missingConfigValueForPath(String parentPath, String path) {
9+
String joined = Path.parse(parentPath).add(path).toString();
10+
return missingConfigValueForPath(joined);
11+
}
12+
813
public MissingConfigValueException(String message) {
914
super(message);
1015
}

src/main/java/com/coditory/quark/config/ResolvableConfig.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private Optional<List<Config>> extractSubConfigListAsOptional(@NotNull String pa
111111
public Config getSubConfig(@NotNull String path) {
112112
expectNonBlank(path, "path");
113113
return getSubConfigAsOptional(path)
114-
.orElseThrow(() -> missingConfigValueForPath(path));
114+
.orElseThrow(() -> missingConfigValueForPath(this.getPath(), path));
115115
}
116116

117117
@NotNull

src/test/groovy/com/coditory/quark/config/AuditableConfigSpec.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class AuditableConfigSpec extends Specification {
172172
noExceptionThrown()
173173
}
174174

175-
def "should reason two auditable subconfigs"() {
175+
def "should recognize nested auditable subconfigs"() {
176176
given:
177177
Config config = Config.of(
178178
a: "A",

src/test/groovy/com/coditory/quark/config/SubConfigSpec.groovy

+17
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,21 @@ class SubConfigSpec extends Specification {
8282
list.get(1).getString("x") == "X2"
8383
list.get(1).getString("y") == "Y2"
8484
}
85+
86+
def "should prefix missing property from from subconfig"() {
87+
given:
88+
Config config = Config.of(
89+
a: "A",
90+
b: [
91+
c: "C"
92+
])
93+
when:
94+
config.mapAuditableSubConfig("b") {
95+
it.getString("c")
96+
it.getString("d")
97+
}
98+
then:
99+
MissingConfigValueException e = thrown(MissingConfigValueException)
100+
e.message == "Missing config value for path: b.d"
101+
}
85102
}

0 commit comments

Comments
 (0)