Skip to content

Commit 83f99e0

Browse files
committed
Add ConfigDataParsedDuration annotation for loading parsed durations
Introduces the ConfigDataParsedDuration annotation to facilitate loading duration values from configuration files. Supports string-based durations (e.g., "5m", "1h", "30s") and allows for optional fallback paths and default time units.
1 parent 81306df commit 83f99e0

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

SimpleAPI/src/main/java/com/bencodez/simpleapi/file/annotation/AnnotationHandler.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
import java.util.HashSet;
66
import java.util.List;
77
import java.util.Set;
8+
import java.util.concurrent.TimeUnit;
89

910
import org.bukkit.configuration.ConfigurationSection;
1011

12+
import com.bencodez.simpleapi.time.ParsedDuration;
13+
1114
public class AnnotationHandler {
1215

1316
public AnnotationHandler() {
@@ -89,7 +92,7 @@ public void load(ConfigurationSection config, Object classToLoad) {
8992

9093
field.set(classToLoad, value);
9194
}
92-
95+
9396
ConfigDataLong longAnnotation = field.getAnnotation(ConfigDataLong.class);
9497
if (longAnnotation != null) {
9598
long defaultValue = longAnnotation.defaultValue();
@@ -230,6 +233,40 @@ public void load(ConfigurationSection config, Object classToLoad) {
230233
field.set(classToLoad, value);
231234
}
232235

236+
ConfigDataParsedDuration durationAnnotation = field.getAnnotation(ConfigDataParsedDuration.class);
237+
if (durationAnnotation != null) {
238+
239+
String defaultValue = durationAnnotation.defaultValue();
240+
241+
if (defaultValue.isEmpty()) {
242+
try {
243+
Object v = field.get(classToLoad);
244+
if (v != null) {
245+
defaultValue = v.toString();
246+
}
247+
} catch (Exception e) {
248+
249+
}
250+
}
251+
252+
String value = "";
253+
254+
if (!durationAnnotation.secondPath().isEmpty()) {
255+
value = config.getString(durationAnnotation.path(),
256+
config.getString(durationAnnotation.secondPath(), defaultValue));
257+
} else {
258+
value = config.getString(durationAnnotation.path(), defaultValue);
259+
}
260+
261+
try {
262+
// Assumes ParsedDuration has a constructor or static parse method
263+
Object parsedDuration = ParsedDuration.parse(value, durationAnnotation.defaultTimeUnit());
264+
field.set(classToLoad, parsedDuration);
265+
} catch (Exception e) {
266+
e.printStackTrace();
267+
}
268+
}
269+
233270
} catch (Exception e) {
234271
e.printStackTrace();
235272
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.bencodez.simpleapi.file.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Inherited;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
import java.util.concurrent.TimeUnit;
9+
10+
/**
11+
* Annotation for loading ParsedDuration values from config.
12+
* Supports string-based durations such as "5m", "1h", "30s".
13+
*/
14+
@Inherited
15+
@Target({ ElementType.METHOD, ElementType.FIELD })
16+
@Retention(RetentionPolicy.RUNTIME)
17+
public @interface ConfigDataParsedDuration {
18+
19+
/**
20+
* Default value as a string (ex: "5m").
21+
*
22+
* @return default duration string
23+
*/
24+
String defaultValue() default "";
25+
26+
/**
27+
* Config path.
28+
*
29+
* @return path
30+
*/
31+
String path();
32+
33+
/**
34+
* Optional fallback path.
35+
*
36+
* @return second path
37+
*/
38+
String secondPath() default "";
39+
40+
TimeUnit defaultTimeUnit() default TimeUnit.SECONDS;
41+
}

0 commit comments

Comments
 (0)