Add JSONValue and JSONCodec.unparseValue()
[yangtools.git] / codec / yang-data-codec-gson / src / main / java / org / opendaylight / yangtools / yang / data / codec / gson / UnionJSONCodec.java
index 8f5b54132f10f1e48bf5ca968f51348713509833..d39ac5ca96738840dbad58603d2bf8c7f8001b71 100644 (file)
@@ -98,21 +98,41 @@ abstract sealed class UnionJSONCodec<T> implements JSONCodec<T> {
     @SuppressWarnings("checkstyle:illegalCatch")
     public final void writeValue(final JSONValueWriter ctx, final T value) throws IOException {
         for (var codec : codecs) {
-            if (!codec.getDataType().isInstance(value)) {
+            if (codec.getDataType().isInstance(value)) {
+                @SuppressWarnings("unchecked")
+                final var objCodec = (JSONCodec<Object>) codec;
+                try {
+                    objCodec.writeValue(ctx, value);
+                    return;
+                } catch (RuntimeException e) {
+                    LOG.debug("Codec {} failed to serialize {}", codec, value, e);
+                }
+            } else {
                 LOG.debug("Codec {} cannot accept input {}, skipping it", codec, value);
-                continue;
             }
+        }
 
-            @SuppressWarnings("unchecked")
-            final var objCodec = (JSONCodec<Object>) codec;
-            try {
-                objCodec.writeValue(ctx, value);
-                return;
-            } catch (RuntimeException e) {
-                LOG.debug("Codec {} failed to serialize {}", codec, value, e);
+        throw new IllegalArgumentException("No codecs could serialize" + value);
+    }
+
+
+    @Override
+    @SuppressWarnings("checkstyle:illegalCatch")
+    public JSONValue unparseValue(final Object value) {
+        for (var codec : codecs) {
+            if (codec.getDataType().isInstance(value)) {
+                @SuppressWarnings("unchecked")
+                final var objCodec = (JSONCodec<Object>) codec;
+                try {
+                    return objCodec.unparseValue(value);
+                } catch (RuntimeException e) {
+                    LOG.debug("Codec {} failed to unparse {}", codec, value, e);
+                }
+            } else {
+                LOG.debug("Codec {} cannot accept input {}, skipping it", codec, value);
             }
         }
 
-        throw new IllegalArgumentException("No codecs could serialize" + value);
+        throw new IllegalArgumentException("No codecs could unparse" + value);
     }
 }