Skip to content

Commit 1d70f4e

Browse files
Add Property class
1 parent 13bb8bf commit 1d70f4e

File tree

3 files changed

+53
-21
lines changed

3 files changed

+53
-21
lines changed

core/src/main/java/io/github/almightysatan/jaskl/ObjectMapper.java

+38-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.jetbrains.annotations.Unmodifiable;
2525

2626
import java.util.Map;
27+
import java.util.Objects;
2728

2829
public interface ObjectMapper<T> {
2930

@@ -33,5 +34,41 @@ public interface ObjectMapper<T> {
3334

3435
@NotNull Class<T> getObjectClass();
3536

36-
@Unmodifiable @NotNull Map<@NotNull String, @NotNull Type<?>> getProperties();
37+
@NotNull Property<?> @NotNull [] getProperties();
38+
39+
interface Property<T> {
40+
41+
@NotNull String getKey();
42+
43+
@NotNull Type<T> getType();
44+
45+
boolean isOptional();
46+
47+
static <T> Property<T> of(@NotNull String key, @NotNull Type<T> type, boolean optional) {
48+
Objects.requireNonNull(key);
49+
Objects.requireNonNull(type);
50+
if (key.isEmpty())
51+
throw new IllegalArgumentException("Empty key");
52+
return new Property<T>() {
53+
@Override
54+
public @NotNull String getKey() {
55+
return key;
56+
}
57+
58+
@Override
59+
public @NotNull Type<T> getType() {
60+
return type;
61+
}
62+
63+
@Override
64+
public boolean isOptional() {
65+
return optional;
66+
}
67+
};
68+
}
69+
70+
static <T> Property<T> of(@NotNull String key, @NotNull Type<T> type) {
71+
return of(key, type, false);
72+
}
73+
}
3774
}

core/src/main/java/io/github/almightysatan/jaskl/Type.java

+11-14
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,12 @@ public interface Type<T> {
328328
@SuppressWarnings("unchecked")
329329
static <T> @NotNull Type<T> custom(@NotNull ObjectMapper<T> objectMapper) {
330330
Objects.requireNonNull(objectMapper);
331-
@NotNull Map<@NotNull String, @NotNull Type<?>> properties = objectMapper.getProperties();
332-
Objects.requireNonNull(properties);
331+
Map<String, ObjectMapper.Property<?>> properties = new HashMap<>();
332+
for (ObjectMapper.Property<?> property : objectMapper.getProperties())
333+
if (properties.put(property.getKey(), ObjectMapper.Property.of(property.getKey(), property.getType(), property.isOptional())) != null)
334+
throw new IllegalArgumentException("Duplicate key: " + property.getKey());
333335
if (properties.isEmpty())
334-
throw new IllegalArgumentException("properties should not be empty");
336+
throw new IllegalArgumentException("Properties should not be empty");
335337
return new Type<T>() {
336338
@Override
337339
public @NotNull T toEntryType(@NotNull Object value) throws InvalidTypeException, ValidationException {
@@ -343,8 +345,8 @@ public interface Type<T> {
343345
Map<String, Object> newMap = new HashMap<>();
344346
for (Map.Entry<?, ?> entry : mapValue.entrySet()) {
345347
String key = STRING.toEntryType(entry.getKey());
346-
Type<?> type = this.getType(key);
347-
newMap.put(key, type.toEntryType(entry.getValue()));
348+
ObjectMapper.Property<?> property = properties.get(key);
349+
newMap.put(key, property.getType().toEntryType(entry.getValue()));
348350
}
349351

350352
return objectMapper.createInstance(Collections.unmodifiableMap(newMap));
@@ -353,18 +355,13 @@ public interface Type<T> {
353355
@Override
354356
public @NotNull Object toWritable(@NotNull T value, @NotNull Function<@NotNull Object, @NotNull Object> keyPreprocessor) throws InvalidTypeException {
355357
Map<Object, Object> newMap = new HashMap<>();
356-
for (Map.Entry<String, Object> entry : objectMapper.readValues(value).entrySet())
357-
newMap.put(keyPreprocessor.apply(STRING.toWritable(entry.getKey(), keyPreprocessor)), this.getType(entry.getKey()).toWritable(entry.getValue(), keyPreprocessor));
358+
for (Map.Entry<String, Object> entry : objectMapper.readValues(value).entrySet()) {
359+
ObjectMapper.Property<Object> property = (ObjectMapper.Property<Object>) properties.get(entry.getKey());
360+
newMap.put(keyPreprocessor.apply(STRING.toWritable(entry.getKey(), keyPreprocessor)), property.getType().toWritable(entry.getValue(), keyPreprocessor));
361+
}
358362

359363
return Collections.unmodifiableMap(newMap);
360364
}
361-
362-
private <U> Type<U> getType(String key) {
363-
Type<U> type = (Type<U>) properties.get(key);
364-
if (type == null)
365-
throw new InvalidTypeException(key, properties.keySet());
366-
return type;
367-
}
368365
};
369366
}
370367
}

core/src/testFixtures/java/io/github/almightysatan/jaskl/test/ConfigTest.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -500,12 +500,10 @@ public void testCustom() throws IOException {
500500
}
501501

502502
@Override
503-
public @NotNull Map<@NotNull String, @NotNull Type<?>> getProperties() {
504-
Map<String, Type<?>> properties = new HashMap<>();
505-
properties.put("exampleString", Type.STRING);
506-
properties.put("exampleInt", Type.INTEGER);
507-
properties.put("exampleEnum", Type.enumType(ExampleEnum.class));
508-
return Collections.unmodifiableMap(properties);
503+
public @NotNull Property<?> @NotNull [] getProperties() {
504+
return new Property[]{Property.of("exampleString", Type.STRING),
505+
Property.of("exampleInt", Type.INTEGER),
506+
Property.of("exampleEnum", Type.enumType(ExampleEnum.class))};
509507
}
510508
};
511509
Config config0 = this.createTestConfig();

0 commit comments

Comments
 (0)