From 5977af51b705744d1f287dc79c2ce378b0c0d17f Mon Sep 17 00:00:00 2001
From: alterdekim <alterwain@protonmail.com>
Date: Thu, 9 Jan 2025 21:26:27 +0300
Subject: [PATCH] Mapper improved

---
 pom.xml                                               |  2 +-
 .../flash/decompiler/mapper/FlashField.java           |  2 ++
 .../flash/decompiler/mapper/FlashFieldConverter.java  | 11 +++++++++++
 .../flash/decompiler/mapper/FlashMapper.java          |  8 +++++++-
 4 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/com/alterdekim/flash/decompiler/mapper/FlashFieldConverter.java

diff --git a/pom.xml b/pom.xml
index 706907a..c67e611 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>com.alterdekim.game</groupId>
     <artifactId>actionScriptDecompiler</artifactId>
-    <version>0.0.3</version>
+    <version>0.0.4</version>
     <packaging>jar</packaging>
 
     <name>SWFDissect</name>
diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashField.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashField.java
index 09cd06d..069bf77 100644
--- a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashField.java
+++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashField.java
@@ -9,4 +9,6 @@ import java.lang.annotation.Target;
 @Target(ElementType.FIELD)
 public @interface FlashField {
     String name() default "";
+    boolean useCustomConverter() default false;
+    Class<? extends FlashFieldConverter> converter() default FlashFieldConverter.None.class;
 }
diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashFieldConverter.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashFieldConverter.java
new file mode 100644
index 0000000..9f89fb3
--- /dev/null
+++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashFieldConverter.java
@@ -0,0 +1,11 @@
+package com.alterdekim.flash.decompiler.mapper;
+
+
+public abstract class FlashFieldConverter {
+    public abstract Object convert(Object o);
+
+    public abstract static class None extends FlashFieldConverter {
+        public None() {
+        }
+    }
+}
diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java
index 3eeb910..cb6513c 100644
--- a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java
+++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java
@@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.tuple.Pair;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.Map;
 
@@ -21,8 +22,13 @@ public class FlashMapper {
                             Field f = p.getLeft();
                             String name = p.getRight();
                             f.setAccessible(true);
+                            if( f.isAnnotationPresent(FlashField.class) && f.getAnnotation(FlashField.class).useCustomConverter()) {
+                                f.set(result, f.getAnnotation(FlashField.class).converter().getDeclaredConstructor().newInstance().convert(m.get(name)));
+                                return;
+                            }
                             f.set(result, m.get(name));
-                        } catch (IllegalAccessException e) {
+                        } catch (IllegalAccessException | NoSuchMethodException | InstantiationException |
+                                 InvocationTargetException e) {
                             log.error("FlashMapper valueSet error: {}", e.getMessage());
                         }
                     });