Add a warning for Locked human objects as they are not usable yet
[ldk-java] / typescript_strings.py
index f889519b76dbd9509235d35ce04513447eba4ec6..e995ab0c49d2832cc8872bcd03481328fcdad999 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"
@@ -531,6 +548,9 @@ const decodeString = (stringPointer, free = true) => {
     def init_str(self):
         return ""
 
+    def constr_hu_array(self, ty_info, arr_len):
+        return "new Array(" + arr_len + ").fill(null)"
+
     def var_decl_statement(self, ty_string, var_name, statement):
         return "const " + var_name + ": " + ty_string + " = " + statement
 
@@ -606,25 +626,39 @@ const decodeString = (stringPointer, free = true) => {
     def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field_var_conversions, field_function_lines, trait_doc_comment):
         out_typescript_bindings = "\n\n\n// OUT_TYPESCRIPT_BINDINGS :: MAP_TRAIT :: START\n\n"
 
-        constructor_arguments = ""
         super_instantiator = ""
+        bindings_instantiator = ""
         pointer_to_adder = ""
         impl_constructor_arguments = ""
         for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo):
-                constructor_arguments += f", {first_to_lower(var.arg_name)}?: {var.java_hu_ty}"
                 impl_constructor_arguments += f", {var.arg_name}: {var.java_hu_ty}"
+                super_instantiator += first_to_lower(var.arg_name) + ", "
                 if var.from_hu_conv is not None:
-                    super_instantiator += ", " + var.from_hu_conv[0]
+                    bindings_instantiator += ", " + var.from_hu_conv[0]
                     if var.from_hu_conv[1] != "":
                         pointer_to_adder += "\t\t\t" + var.from_hu_conv[1] + ";\n"
                 else:
-                    super_instantiator += ", " + first_to_lower(var.arg_name)
+                    bindings_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 += "\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"
+                bindings_instantiator += ", " + first_to_lower(var[1]) + ".bindings_instance"
+                super_instantiator += first_to_lower(var[1]) + "_impl, "
+                pointer_to_adder += "\t\timpl_holder.held.ptrs_to.push(" + first_to_lower(var[1]) + ");\n"
+                impl_constructor_arguments += f", {first_to_lower(var[1])}_impl: {var[0].replace('LDK', '')}Interface"
+
+        super_constructor_statements = ""
+        trait_constructor_arguments = ""
+        for var in field_var_conversions:
+            if isinstance(var, ConvInfo):
+                trait_constructor_arguments += ", " + var.arg_name
+            else:
+                super_constructor_statements += "\t\tconst " + first_to_lower(var[1]) + " = " + var[1] + ".new_impl(" + super_instantiator + ");\n"
+                trait_constructor_arguments += ", " + first_to_lower(var[1]) + ".bindings_instance"
+                for suparg in var[2]:
+                    if isinstance(suparg, ConvInfo):
+                        trait_constructor_arguments += ", " + suparg.arg_name
+                    else:
+                        trait_constructor_arguments += ", " + suparg[1]
 
         # BUILD INTERFACE METHODS
         out_java_interface = ""
@@ -681,24 +715,6 @@ const decodeString = (stringPointer, free = true) => {
                         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:
-            if isinstance(var, ConvInfo):
-                trait_constructor_arguments += ", " + var.arg_name
-            else:
-                trait_constructor_arguments += ", " + var[1] + ".new_impl(" + var[1] + "_impl"
-                for suparg in var[2]:
-                    if isinstance(suparg, ConvInfo):
-                        trait_constructor_arguments += ", " + suparg.arg_name
-                    else:
-                        trait_constructor_arguments += ", " + suparg[1]
-                trait_constructor_arguments += ").bindings_instance"
-                for suparg in var[2]:
-                    if isinstance(suparg, ConvInfo):
-                        trait_constructor_arguments += ", " + suparg.arg_name
-                    else:
-                        trait_constructor_arguments += ", " + suparg[1]
-
         out_typescript_human = f"""
 {self.hu_struct_file_prefix}
 
@@ -710,27 +726,27 @@ class {struct_name}Holder {{
 }}
 
 export class {struct_name.replace("LDK","")} extends CommonBase {{
-       private bindings_instance?: bindings.{struct_name};
+       /* @internal */
+       public bindings_instance?: bindings.{struct_name};
 
-       constructor(ptr?: number, arg?: bindings.{struct_name}{constructor_arguments}) {{
-               if (Number.isFinite(ptr)) {{
-                       super(ptr, bindings.{struct_name.replace("LDK","")}_free);
-                       this.bindings_instance = null;
-               }} else {{
-                       // TODO: private constructor instantiation
-                       super(bindings.{struct_name}_new(arg{super_instantiator}), bindings.{struct_name.replace("LDK","")}_free);
-                       this.ptrs_to.push(arg);
-{pointer_to_adder}             }}
+       /* @internal */
+       constructor(_dummy: object, ptr: number) {{
+               super(ptr, bindings.{struct_name.replace("LDK","")}_free);
+               this.bindings_instance = null;
        }}
 
        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 = {{
 {out_interface_implementation_overrides}               }} as bindings.{struct_name};
-               impl_holder.held = new {struct_name.replace("LDK", "")} (null, structImplementation{trait_constructor_arguments});
-               return impl_holder.held;
+{super_constructor_statements}         const ptr: number = bindings.{struct_name}_new(structImplementation{bindings_instantiator});
+
+               impl_holder.held = new {struct_name.replace("LDK", "")}(null, ptr);
+               impl_holder.held.bindings_instance = structImplementation;
+{pointer_to_adder}             return impl_holder.held;
        }}
 """
+        self.obj_defined([struct_name.replace("LDK", ""), struct_name.replace("LDK", "") + "Interface"], "structs")
 
         out_typescript_bindings += "\t\texport interface " + struct_name + " {\n"
         java_meths = []
@@ -998,12 +1014,12 @@ export class {struct_name.replace("LDK","")} extends CommonBase {{
     def map_opaque_struct(self, struct_name, struct_doc_comment):
         implementations = ""
         method_header = ""
-        if struct_name.startswith("LDKLocked"):
-            return "NOT IMPLEMENTED"
 
         hu_name = struct_name.replace("LDKC2Tuple", "TwoTuple").replace("LDKC3Tuple", "ThreeTuple").replace("LDK", "")
-        out_opaque_struct_human = f"""{self.hu_struct_file_prefix}
-
+        out_opaque_struct_human = f"{self.hu_struct_file_prefix}"
+        if struct_name.startswith("LDKLocked"):
+            out_opaque_struct_human += "/** XXX: DO NOT USE THIS - it remains locked until the GC runs (if that ever happens */"
+        out_opaque_struct_human += f"""
 export class {hu_name} extends CommonBase {implementations}{{
        /* @internal */
        public constructor(_dummy: object, ptr: number) {{