Make TxOut language-specific, fix typescript UtilMethods compilation
[ldk-java] / typescript_strings.py
index 01096343e7d86d7d1acafcff0c0d0da9127170a8..d595e4d2351470ae4f86eb4fe666ec2b783df9da 100644 (file)
@@ -76,9 +76,6 @@ public static native long new_empty_slice_vec();
 
         self.bindings_footer = ""
 
-        self.util_fn_pfx = ""
-        self.util_fn_sfx = ""
-
         self.common_base = """
 function freer(f: () => void) { f() }
 const finalizer = new FinalizationRegistry(freer);
@@ -113,6 +110,24 @@ export default class CommonBase {
 }
 """
 
+        self.txout_defn = """export class TxOut extends CommonBase {
+       /** The script_pubkey in this output */
+       public script_pubkey: Uint8Array;
+       /** The value, in satoshis, of this output */
+       public value: number;
+
+       /* @internal */
+       public constructor(_dummy: object, ptr: number) {
+               super(ptr, bindings.TxOut_free);
+               this.script_pubkey = bindings.TxOut_get_script_pubkey(ptr);
+               this.value = bindings.TxOut_get_value(ptr);
+       }
+       public constructor_new(value: number, script_pubkey: Uint8Array): TxOut {
+               return new TxOut(null, bindings.TxOut_new(script_pubkey, value));
+       }
+}"""
+        self.obj_defined(["TxOut"], "structs")
+
         self.c_file_pfx = """#include "js-wasm.h"
 #include <stdatomic.h>
 #include <lightning.h>
@@ -309,6 +324,8 @@ import * as bindings from '../bindings.mjs'
 import * as InternalUtils from '../InternalUtils.mjs'
 
 """
+        self.util_fn_pfx = self.hu_struct_file_prefix + "\nexport class UtilMethods extends CommonBase {\n"
+        self.util_fn_sfx = "}"
         self.c_fn_ty_pfx = ""
         self.file_ext = ".mts"
         self.ptr_c_ty = "uint32_t"
@@ -534,6 +551,11 @@ const decodeString = (stringPointer, free = true) => {
     def var_decl_statement(self, ty_string, var_name, statement):
         return "const " + var_name + ": " + ty_string + " = " + statement
 
+    def for_n_in_range(self, n, minimum, maximum):
+        return "for (var " + n + " = " + minimum + "; " + n + " < " + maximum + "; " + n + "++) {"
+    def for_n_in_arr(self, n, arr_name, arr_elem_ty):
+        return (arr_name + ".forEach((" + n + ": " + arr_elem_ty.java_hu_ty + ") => { ", " })")
+
     def get_ptr(self, var):
         return "CommonBase.get_ptr_of(" + var + ")"
     def set_null_skip_free(self, var):
@@ -612,13 +634,13 @@ const decodeString = (stringPointer, free = true) => {
                 if var.from_hu_conv is not None:
                     super_instantiator += ", " + var.from_hu_conv[0]
                     if var.from_hu_conv[1] != "":
-                        pointer_to_adder += var.from_hu_conv[1] + ";\n"
+                        pointer_to_adder += "\t\t\t" + var.from_hu_conv[1] + ";\n"
                 else:
                     super_instantiator += ", " + first_to_lower(var.arg_name)
             else:
                 constructor_arguments += f", {first_to_lower(var[1])}?: bindings.{var[0]}"
                 super_instantiator += ", " + first_to_lower(var[1])
-                pointer_to_adder += "this.ptrs_to.push(" + first_to_lower(var[1]) + ");\n"
+                pointer_to_adder += "\t\t\tthis.ptrs_to.push(" + first_to_lower(var[1]) + ");\n"
                 impl_constructor_arguments += f", {first_to_lower(var[1])}_impl: {var[0].replace('LDK', '')}.{var[0].replace('LDK', '')}Interface"
 
         # BUILD INTERFACE METHODS
@@ -628,8 +650,8 @@ const decodeString = (stringPointer, free = true) => {
         for fn_line in field_function_lines:
             java_method_descriptor = ""
             if fn_line.fn_name != "free" and fn_line.fn_name != "cloned":
-                out_java_interface += fn_line.fn_name + "("
-                out_interface_implementation_overrides += f"{fn_line.fn_name} ("
+                out_java_interface += "\t" + fn_line.fn_name + "("
+                out_interface_implementation_overrides += f"\t\t\t{fn_line.fn_name} ("
 
                 for idx, arg_conv_info in enumerate(fn_line.args_ty):
                     if idx >= 1:
@@ -638,22 +660,20 @@ const decodeString = (stringPointer, free = true) => {
                     out_java_interface += f"{arg_conv_info.arg_name}: {arg_conv_info.java_hu_ty}"
                     out_interface_implementation_overrides += f"{arg_conv_info.arg_name}: {arg_conv_info.java_ty}"
                     java_method_descriptor += arg_conv_info.java_fn_ty_arg
-                out_java_interface += f"): {fn_line.ret_ty_info.java_hu_ty};\n\t\t\t\t"
+                out_java_interface += f"): {fn_line.ret_ty_info.java_hu_ty};\n"
                 java_method_descriptor += ")" + fn_line.ret_ty_info.java_fn_ty_arg
                 java_methods.append((fn_line.fn_name, java_method_descriptor))
 
                 out_interface_implementation_overrides += f"): {fn_line.ret_ty_info.java_ty} {{\n"
 
-                interface_method_override_inset = "\t\t\t\t\t\t"
-                interface_implementation_inset = "\t\t\t\t\t\t\t"
                 for arg_info in fn_line.args_ty:
                     if arg_info.to_hu_conv is not None:
-                        out_interface_implementation_overrides += interface_implementation_inset + arg_info.to_hu_conv.replace("\n", "\n\t\t\t\t") + "\n"
+                        out_interface_implementation_overrides += "\t\t\t\t" + arg_info.to_hu_conv.replace("\n", "\n\t\t\t\t") + "\n"
 
                 if fn_line.ret_ty_info.java_ty != "void":
-                    out_interface_implementation_overrides += interface_implementation_inset + fn_line.ret_ty_info.java_hu_ty + " ret = arg." + fn_line.fn_name + "("
+                    out_interface_implementation_overrides += "\t\t\t\tconst ret: " + fn_line.ret_ty_info.java_hu_ty + " = arg." + fn_line.fn_name + "("
                 else:
-                    out_interface_implementation_overrides += f"{interface_implementation_inset}arg." + fn_line.fn_name + "("
+                    out_interface_implementation_overrides += f"\t\t\t\targ." + fn_line.fn_name + "("
 
                 for idx, arg_info in enumerate(fn_line.args_ty):
                     if idx != 0:
@@ -666,17 +686,17 @@ const decodeString = (stringPointer, free = true) => {
                 out_interface_implementation_overrides += ");\n"
                 if fn_line.ret_ty_info.java_ty != "void":
                     if fn_line.ret_ty_info.from_hu_conv is not None:
-                        out_interface_implementation_overrides = out_interface_implementation_overrides + "\t\t\t\t" + f"result: {fn_line.ret_ty_info.java_ty} = " + fn_line.ret_ty_info.from_hu_conv[0] + ";\n"
+                        out_interface_implementation_overrides += "\t\t\t\t" + f"const result: {fn_line.ret_ty_info.java_ty} = " + fn_line.ret_ty_info.from_hu_conv[0].replace("\n", "\n\t\t\t\t") + ";\n"
                         if fn_line.ret_ty_info.from_hu_conv[1] != "":
-                            out_interface_implementation_overrides = out_interface_implementation_overrides + "\t\t\t\t" + fn_line.ret_ty_info.from_hu_conv[1].replace("this", "impl_holder.held") + ";\n"
+                            out_interface_implementation_overrides += "\t\t\t\t" + fn_line.ret_ty_info.from_hu_conv[1].replace("this", "impl_holder.held").replace("\n", "\n\t\t\t\t") + ";\n"
                         #if fn_line.ret_ty_info.rust_obj in result_types:
                         # XXX: We need to handle this in conversion logic so that its cross-language!
                         # Avoid double-free by breaking the result - we should learn to clone these and then we can be safe instead
                         #    out_interface_implementation_overrides = out_interface_implementation_overrides + "\t\t\t\tret.ptr = 0;\n"
-                        out_interface_implementation_overrides = out_interface_implementation_overrides + "\t\t\t\treturn result;\n"
+                        out_interface_implementation_overrides += "\t\t\t\treturn result;\n"
                     else:
-                        out_interface_implementation_overrides = out_interface_implementation_overrides + "\t\t\t\treturn ret;\n"
-                out_interface_implementation_overrides += f"{interface_method_override_inset}}},\n\n{interface_method_override_inset}"
+                        out_interface_implementation_overrides += "\t\t\t\treturn ret;\n"
+                out_interface_implementation_overrides += f"\t\t\t}},\n"
 
         trait_constructor_arguments = ""
         for var in field_var_conversions:
@@ -699,9 +719,15 @@ const decodeString = (stringPointer, free = true) => {
         out_typescript_human = f"""
 {self.hu_struct_file_prefix}
 
-{struct_name.replace("LDK","")} extends CommonBase {{
+export interface {struct_name.replace("LDK", "")}Interface {{
+{out_java_interface}}}
 
-       bindings_instance?: bindings.{struct_name};
+class {struct_name}Holder {{
+       held: {struct_name.replace("LDK", "")};
+}}
+
+export class {struct_name.replace("LDK","")} extends CommonBase {{
+       private bindings_instance?: bindings.{struct_name};
 
        constructor(ptr?: number, arg?: bindings.{struct_name}{constructor_arguments}) {{
                if (Number.isFinite(ptr)) {{
@@ -709,27 +735,17 @@ const decodeString = (stringPointer, free = true) => {
                        this.bindings_instance = null;
                }} else {{
                        // TODO: private constructor instantiation
-                       super(bindings.{struct_name}_new(arg{super_instantiator}));
+                       super(bindings.{struct_name}_new(arg{super_instantiator}), bindings.{struct_name.replace("LDK","")}_free);
                        this.ptrs_to.push(arg);
-                       {pointer_to_adder}
-               }}
+{pointer_to_adder}             }}
        }}
 
        static new_impl(arg: {struct_name.replace("LDK", "")}Interface{impl_constructor_arguments}): {struct_name.replace("LDK", "")} {{
                const impl_holder: {struct_name}Holder = new {struct_name}Holder();
-               let structImplementation = <bindings.{struct_name}>{{
-                       // todo: in-line interface filling
-                       {out_interface_implementation_overrides}
-               }};
+               let structImplementation = {{
+{out_interface_implementation_overrides}               }} as bindings.{struct_name};
                impl_holder.held = new {struct_name.replace("LDK", "")} (null, structImplementation{trait_constructor_arguments});
-       }}
-
-       export interface {struct_name.replace("LDK", "")}Interface {{
-               {out_java_interface}
-       }}
-
-       class {struct_name}Holder {{
-               held: {struct_name.replace("LDK", "")};
+               return impl_holder.held;
        }}
 """
 
@@ -756,8 +772,8 @@ const decodeString = (stringPointer, free = true) => {
                 out_typescript_bindings += f", {var[1]}: {var[0]}"
 
         out_typescript_bindings += f"""): number {{
-            throw new Error('unimplemented'); // TODO: bind to WASM
-        }}
+                       throw new Error('unimplemented'); // TODO: bind to WASM
+               }}
 """
 
         out_typescript_bindings += '\n// OUT_TYPESCRIPT_BINDINGS :: MAP_TRAIT :: END\n\n\n'