Skip to content

Commit 2b0ddde

Browse files
committed
add support for primitive vec type generation
1 parent 4d1ae73 commit 2b0ddde

File tree

7 files changed

+111
-6
lines changed

7 files changed

+111
-6
lines changed

input/minimal_tuple.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ typedef struct LDKCVec_u8Z {
3737
uintptr_t datalen;
3838
} LDKCVec_u8Z;
3939

40+
typedef struct LDKCVec_u16Z {
41+
uint16_t *data;
42+
// void *data;
43+
uintptr_t datalen;
44+
} LDKCVec_u16Z;
45+
4046
typedef struct LDKC2Tuple_u32ScriptZ {
4147
uint32_t a;
4248
struct LDKCVec_u8Z b;

src/generators/opaque_struct_generator.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,3 @@ def generate_opaque_struct(self, struct_name, struct_details):
180180
os.makedirs(output_directory)
181181
with open(output_path, "w") as f:
182182
f.write(mutating_output_file_contents)
183-
pass

src/generators/vector_generator.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import re
2+
import os
3+
4+
5+
class VectorGenerator:
6+
7+
def __init__(self) -> None:
8+
super().__init__()
9+
template_path = f'{os.path.dirname(__file__)}/../../templates/BindingsTemplate.swift'
10+
with open(template_path, 'r') as template_handle:
11+
self.bindings_template = template_handle.read()
12+
self.vector_template_regex = re.compile(
13+
"(\/\* VECTOR_METHODS_START \*\/\n)(.*)(\n[\t ]*\/\* VECTOR_METHODS_END \*\/)",
14+
flags=re.MULTILINE | re.DOTALL)
15+
self.template = self.vector_template_regex.search(self.bindings_template).group(2)
16+
self.mutating_vector_methods = ''
17+
18+
def generate_vector(self, vector_name, vector_type_details):
19+
if not vector_type_details.is_primitive:
20+
# TODO: add non-primitive tuple support
21+
return
22+
mutating_current_vector_methods = self.template
23+
mutating_current_vector_methods = mutating_current_vector_methods.replace('LDKCVec_rust_primitive', vector_name)
24+
mutating_current_vector_methods = mutating_current_vector_methods.replace('SwiftPrimitive',
25+
vector_type_details.primitive_swift_counterpart)
26+
self.mutating_vector_methods += "\n"+mutating_current_vector_methods+"\n"
27+
28+
def finalize(self):
29+
filled_template = self.vector_template_regex.sub(f'\g<1>{self.mutating_vector_methods}\g<3>',
30+
self.bindings_template)
31+
32+
# store the output
33+
output_path = f'{os.path.dirname(__file__)}/../../output/LDK/Bindings.swift'
34+
output_directory = os.path.dirname(output_path)
35+
if not os.path.exists(output_directory):
36+
os.makedirs(output_directory)
37+
with open(output_path, "w") as f:
38+
f.write(filled_template)

src/lightning_header_parser.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
class CTypes(enum.Enum):
1111
OPAQUE_STRUCT = 1,
1212
TUPLE = 2,
13-
UNITARY_ENUM = 3
13+
UNITARY_ENUM = 3,
14+
VECTOR = 4
1415

1516

1617
class TypeDetails:
@@ -23,6 +24,8 @@ def __init__(self) -> None:
2324
self.methods = []
2425
self.constructor_method = None
2526
self.free_method = None
27+
self.is_primitive = False
28+
self.primitive_swift_counterpart = None
2629

2730

2831
class LightningHeaderParser():
@@ -101,6 +104,7 @@ def populate_type_details(self):
101104

102105
self.trait_structs = set()
103106
self.result_types = set()
107+
self.vec_types = set()
104108

105109
fn_ptr_regex = re.compile("^extern const ([A-Za-z_0-9\* ]*) \(\*(.*)\)\((.*)\);$")
106110
fn_ret_arr_regex = re.compile("(.*) \(\*(.*)\((.*)\)\)\[([0-9]*)\];$")
@@ -252,6 +256,18 @@ def populate_type_details(self):
252256
pass
253257
elif vec_ty is not None:
254258
# TODO: vector type (each one needs to be mapped)
259+
self.vec_types.add(struct_name)
260+
vector_type_details = None
261+
if vec_ty in self.type_details:
262+
vector_type_details = self.type_details[vec_ty]
263+
else:
264+
# it's a primitive
265+
vector_type_details = TypeDetails()
266+
vector_type_details.name = vec_ty
267+
vector_type_details.type = CTypes.VECTOR
268+
vector_type_details.is_primitive = True
269+
vector_type_details.primitive_swift_counterpart = self.language_constants.c_type_map[vec_ty]
270+
self.type_details[struct_name] = vector_type_details
255271
pass
256272
elif is_union_enum:
257273
assert (struct_name.endswith("_Tag"))

src/sdk_generator.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from lightning_header_parser import LightningHeaderParser
22
from generators.opaque_struct_generator import OpaqueStructGenerator
33
from generators.tuple_generator import TupleGenerator
4+
from generators.vector_generator import VectorGenerator
45

56

67
def parse_header() -> LightningHeaderParser:
@@ -11,6 +12,16 @@ def parse_header() -> LightningHeaderParser:
1112
return header_parser
1213

1314

15+
def generate_binding_methods(parser: LightningHeaderParser):
16+
# firstly, let's generate the vector utilities
17+
vector_generator = VectorGenerator()
18+
19+
vectors = parser.vec_types
20+
for current_vector in vectors:
21+
vector_type_details = parser.type_details[current_vector]
22+
vector_generator.generate_vector(current_vector, vector_type_details)
23+
vector_generator.finalize()
24+
1425
def generate_opaque_struct_wrappers(parser: LightningHeaderParser):
1526
opaque_struct_generator = OpaqueStructGenerator()
1627

@@ -31,6 +42,7 @@ def generate_tuple_wrappers(parser: LightningHeaderParser):
3142

3243
def generate_sdk():
3344
parser = parse_header()
45+
generate_binding_methods(parser)
3446
generate_opaque_struct_wrappers(parser)
3547
generate_tuple_wrappers(parser)
3648

src/swift_constants.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ def __init__(self, DEBUG: bool, target: Target, **kwargs):
1010
self.target = target
1111
self.c_array_class_caches = set()
1212
self.c_type_map = dict(
13-
uint8_t = ['UInt8'],
14-
uint16_t = ['UInt16'],
15-
uint32_t = ['UInt32'],
16-
uint64_t = ['UInt64'],
13+
uint8_t = 'UInt8',
14+
uint16_t = 'UInt16',
15+
uint32_t = 'UInt32',
16+
uint64_t = 'UInt64',
1717
)
1818

1919
self.to_hu_conv_templates = dict(

templates/BindingsTemplate.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// Bindings.swift
3+
// LDKSwiftARC
4+
//
5+
// Created by Arik Sosman on 3/23/21.
6+
//
7+
8+
import Foundation
9+
10+
class Bindings{
11+
12+
/* VECTOR_METHODS_START */
13+
static func new_LDKCVec_rust_primitive(array: [SwiftPrimitive]) -> LDKCVec_rust_primitive {
14+
15+
let dataContainer = array.withUnsafeBufferPointer { (pointer: UnsafeBufferPointer<SwiftPrimitive>) -> UnsafeMutablePointer<SwiftPrimitive> in
16+
let mutablePointer = UnsafeMutablePointer<SwiftPrimitive>(mutating: pointer.baseAddress!)
17+
return mutablePointer
18+
}
19+
20+
let vector = LDKCVec_rust_primitive(data: dataContainer, datalen: UInt(array.count))
21+
return vector
22+
23+
}
24+
25+
static func LDKCVec_rust_primitive_to_array(vector: LDKCVec_rust_primitive) -> [SwiftPrimitive] {
26+
var array = [SwiftPrimitive]()
27+
for index in 0..<Int(vector.datalen) {
28+
array.append(vector.data[index])
29+
}
30+
return array
31+
}
32+
/* VECTOR_METHODS_END */
33+
34+
}

0 commit comments

Comments
 (0)