blob: 311033c8ab84c913a93b4a9ccb91235278ee0550 [file] [log] [blame]
Matthias Andreas Benkarda1e84432023-12-05 21:12:16 +01001// SPDX-FileCopyrightText: © 2023 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5package eu.mulk.jgvariant.tool.jsonb;
6
Matthias Andreas Benkarda1e84432023-12-05 21:12:16 +01007import eu.mulk.jgvariant.core.Signature;
8import eu.mulk.jgvariant.core.Variant;
9import jakarta.json.bind.serializer.JsonbSerializer;
10import jakarta.json.bind.serializer.SerializationContext;
11import jakarta.json.stream.JsonGenerator;
12import java.text.ParseException;
Matthias Andreas Benkard2b24f6c2023-12-07 19:34:42 +010013import java.util.Collection;
Matthias Andreas Benkarda1e84432023-12-05 21:12:16 +010014import java.util.List;
15
16@SuppressWarnings("java:S6548")
17public final class VariantSerializer implements JsonbSerializer<Variant> {
18
19 public static final VariantSerializer INSTANCE = new VariantSerializer();
20
21 private final ByteArraySerializer byteArraySerializer = ByteArraySerializer.INSTANCE;
22
23 private final Signature byteArraySignature;
24
25 private VariantSerializer() {
26 try {
27 byteArraySignature = Signature.parse("ay");
28 } catch (ParseException e) {
29 // impossible
30 throw new IllegalArgumentException(e);
31 }
32 }
33
34 @Override
35 @SuppressWarnings("unchecked")
36 public void serialize(Variant obj, JsonGenerator generator, SerializationContext ctx) {
37 if (obj.signature().equals(byteArraySignature)) {
Matthias Andreas Benkard2b24f6c2023-12-07 19:34:42 +010038 byteArraySerializer.serialize(byteArrayOf((List<Byte>) obj.value()), generator, ctx);
Matthias Andreas Benkarda1e84432023-12-05 21:12:16 +010039 } else {
40 ctx.serialize(obj.value(), generator);
41 }
42 }
Matthias Andreas Benkard2b24f6c2023-12-07 19:34:42 +010043
44 private static byte[] byteArrayOf(Collection<Byte> bytes) {
45 byte[] result = new byte[bytes.size()];
46 int i = 0;
47 for (byte b : bytes) {
48 result[i++] = b;
49 }
50 return result;
51 }
Matthias Andreas Benkarda1e84432023-12-05 21:12:16 +010052}