3434import lombok .ToString ;
3535
3636import java .io .IOException ;
37+ import java .util .regex .Matcher ;
38+ import java .util .regex .Pattern ;
3739
3840@ AllArgsConstructor
3941@ Getter
@@ -54,6 +56,8 @@ public boolean isSmallerOrEqual(PackVersion other) {
5456
5557 public static class Adapter extends TypeAdapter <PackVersion > {
5658
59+ private static final Pattern VERSION_STRING_PATTERN = Pattern .compile ("^(\\ d+)(?:\\ .(\\ d+))?$" );
60+
5761 private final int defaultMinor ;
5862
5963 public Adapter (int defaultMinor ) {
@@ -67,12 +71,32 @@ public void write(JsonWriter out, PackVersion value) {
6771
6872 @ Override
6973 public PackVersion read (JsonReader in ) throws IOException {
70- if (in .peek () == JsonToken .NUMBER ) return new PackVersion (in .nextInt (), defaultMinor );
71- in .beginArray ();
72- int major = in .nextInt ();
73- int minor = in .hasNext () ? in .nextInt () : defaultMinor ;
74- in .endArray ();
75- return new PackVersion (major , minor );
74+ return switch (in .peek ()) {
75+ case JsonToken .STRING -> parseString (in .nextString ());
76+ case NUMBER -> {
77+ double version = in .nextDouble ();
78+ if (version == Math .floor (version )) yield new PackVersion ((int ) version , defaultMinor );
79+ yield parseString ("%.9f" .formatted (version ));
80+ }
81+ case BEGIN_ARRAY -> {
82+ in .beginArray ();
83+ int major = in .nextInt ();
84+ int minor = in .hasNext () ? in .nextInt () : defaultMinor ;
85+ in .endArray ();
86+ yield new PackVersion (major , minor );
87+ }
88+ default -> throw new IOException ("Invalid version format: '%s'!" .formatted (in .peek ()));
89+ };
90+ }
91+
92+ private PackVersion parseString (String versionString ) throws IOException {
93+ Matcher versionStringMatcher = VERSION_STRING_PATTERN .matcher (versionString );
94+ if (!versionStringMatcher .matches ())
95+ throw new IOException ("Invalid version string: '%s'!" .formatted (versionString ));
96+
97+ String major = versionStringMatcher .group (1 );
98+ String minor = versionStringMatcher .group (2 );
99+ return new PackVersion (Integer .parseInt (major ), minor != null && !minor .isEmpty () ? Integer .parseInt (minor ) : defaultMinor );
76100 }
77101
78102 }
0 commit comments