tigerbeetle 0.0.34 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/tb_client/extconf.rb +13 -13
- data/ext/tb_client/tigerbeetle/LICENSE +177 -0
- data/ext/tb_client/tigerbeetle/build.zig +2327 -0
- data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
- data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
- data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1084 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
- data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
- data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
- data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
- data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
- data/ext/tb_client/tigerbeetle/src/direction.zig +11 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
- data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
- data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
- data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
- data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
- data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
- data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
- data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
- data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
- data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
- data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
- data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
- data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
- data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
- data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +362 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +1036 -0
- data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
- data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
- data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +557 -0
- data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
- data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
- data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
- data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
- data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
- data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
- data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
- data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
- data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
- data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
- data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
- data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
- data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
- data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
- data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
- data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
- data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
- data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
- data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
- data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
- data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
- data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
- data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
- data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
- data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
- data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
- data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
- data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
- data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
- data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
- data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
- data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
- data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
- data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
- data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
- data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
- data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
- data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
- data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
- data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
- data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
- data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
- data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
- data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
- data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
- data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
- data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
- data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
- data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
- data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
- data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
- data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
- data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
- data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
- data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
- data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
- data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2910 -0
- data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
- data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
- data/lib/tb_client/shared_lib.rb +12 -5
- data/lib/tigerbeetle/client.rb +1 -1
- data/lib/tigerbeetle/platforms.rb +9 -0
- data/lib/tigerbeetle/version.rb +2 -2
- data/tigerbeetle.gemspec +22 -5
- metadata +242 -3
- data/ext/tb_client/pkg.tar.gz +0 -0
|
@@ -0,0 +1,996 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
|
|
3
|
+
const vsr = @import("vsr");
|
|
4
|
+
const stdx = vsr.stdx;
|
|
5
|
+
const tb = vsr.tigerbeetle;
|
|
6
|
+
const tb_client = vsr.tb_client;
|
|
7
|
+
const exports = tb_client.exports;
|
|
8
|
+
const assert = std.debug.assert;
|
|
9
|
+
|
|
10
|
+
const TypeMapping = struct {
|
|
11
|
+
name: []const u8,
|
|
12
|
+
private_fields: []const []const u8 = &.{},
|
|
13
|
+
readonly_fields: []const []const u8 = &.{},
|
|
14
|
+
docs_link: ?[]const u8 = null,
|
|
15
|
+
visibility: enum { public, internal } = .public,
|
|
16
|
+
constants: []const u8 = "",
|
|
17
|
+
|
|
18
|
+
pub fn is_private(comptime self: @This(), name: []const u8) bool {
|
|
19
|
+
inline for (self.private_fields) |field| {
|
|
20
|
+
if (std.mem.eql(u8, field, name)) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
} else return false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
pub fn is_read_only(comptime self: @This(), name: []const u8) bool {
|
|
27
|
+
inline for (self.readonly_fields) |field| {
|
|
28
|
+
if (std.mem.eql(u8, field, name)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
} else return false;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/// Some 128-bit fields are better represented as `java.math.BigInteger`,
|
|
36
|
+
/// otherwise they are considered IDs and exposed as an array of bytes.
|
|
37
|
+
const big_integer = struct {
|
|
38
|
+
const fields = .{
|
|
39
|
+
"credits_posted",
|
|
40
|
+
"credits_pending",
|
|
41
|
+
"debits_posted",
|
|
42
|
+
"debits_pending",
|
|
43
|
+
"amount",
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
fn contains(comptime field: []const u8) bool {
|
|
47
|
+
return comptime blk: for (fields) |value| {
|
|
48
|
+
if (std.mem.eql(u8, field, value)) break :blk true;
|
|
49
|
+
} else false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fn contains_any(comptime type_info: anytype) bool {
|
|
53
|
+
return comptime blk: for (type_info.fields) |field| {
|
|
54
|
+
if (contains(field.name)) break :blk true;
|
|
55
|
+
} else false;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const type_mappings = .{
|
|
60
|
+
.{ tb.AccountFlags, TypeMapping{
|
|
61
|
+
.name = "AccountFlags",
|
|
62
|
+
.private_fields = &.{"padding"},
|
|
63
|
+
.docs_link = "reference/account#flags",
|
|
64
|
+
} },
|
|
65
|
+
.{ tb.TransferFlags, TypeMapping{
|
|
66
|
+
.name = "TransferFlags",
|
|
67
|
+
.private_fields = &.{"padding"},
|
|
68
|
+
.docs_link = "reference/transfer#flags",
|
|
69
|
+
} },
|
|
70
|
+
.{ tb.AccountFilterFlags, TypeMapping{
|
|
71
|
+
.name = "AccountFilterFlags",
|
|
72
|
+
.private_fields = &.{"padding"},
|
|
73
|
+
.visibility = .internal,
|
|
74
|
+
} },
|
|
75
|
+
.{ tb.QueryFilterFlags, TypeMapping{
|
|
76
|
+
.name = "QueryFilterFlags",
|
|
77
|
+
.private_fields = &.{"padding"},
|
|
78
|
+
.visibility = .internal,
|
|
79
|
+
} },
|
|
80
|
+
.{ tb.Account, TypeMapping{
|
|
81
|
+
.name = "AccountBatch",
|
|
82
|
+
.private_fields = &.{"reserved"},
|
|
83
|
+
.readonly_fields = &.{
|
|
84
|
+
"debits_pending",
|
|
85
|
+
"credits_pending",
|
|
86
|
+
"debits_posted",
|
|
87
|
+
"credits_posted",
|
|
88
|
+
},
|
|
89
|
+
.docs_link = "reference/account#",
|
|
90
|
+
} },
|
|
91
|
+
.{ tb.AccountBalance, TypeMapping{
|
|
92
|
+
.name = "AccountBalanceBatch",
|
|
93
|
+
.private_fields = &.{"reserved"},
|
|
94
|
+
.readonly_fields = &.{
|
|
95
|
+
"debits_pending",
|
|
96
|
+
"credits_pending",
|
|
97
|
+
"debits_posted",
|
|
98
|
+
"credits_posted",
|
|
99
|
+
"timestamp",
|
|
100
|
+
},
|
|
101
|
+
.docs_link = "reference/account-balances#",
|
|
102
|
+
} },
|
|
103
|
+
.{
|
|
104
|
+
tb.Transfer, TypeMapping{
|
|
105
|
+
.name = "TransferBatch",
|
|
106
|
+
.private_fields = &.{"reserved"},
|
|
107
|
+
.readonly_fields = &.{},
|
|
108
|
+
.docs_link = "reference/transfer#",
|
|
109
|
+
.constants =
|
|
110
|
+
\\ public static final BigInteger AMOUNT_MAX = UInt128.asBigInteger(-1L, -1L);
|
|
111
|
+
\\
|
|
112
|
+
,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
.{ tb.CreateAccountResult, TypeMapping{
|
|
116
|
+
.name = "CreateAccountResult",
|
|
117
|
+
.docs_link = "reference/requests/create_accounts#",
|
|
118
|
+
} },
|
|
119
|
+
.{ tb.CreateTransferResult, TypeMapping{
|
|
120
|
+
.name = "CreateTransferResult",
|
|
121
|
+
.docs_link = "reference/requests/create_transfers#",
|
|
122
|
+
} },
|
|
123
|
+
.{ tb.CreateAccountsResult, TypeMapping{
|
|
124
|
+
.name = "CreateAccountResultBatch",
|
|
125
|
+
.readonly_fields = &.{ "index", "result" },
|
|
126
|
+
} },
|
|
127
|
+
.{ tb.CreateTransfersResult, TypeMapping{
|
|
128
|
+
.name = "CreateTransferResultBatch",
|
|
129
|
+
.readonly_fields = &.{ "index", "result" },
|
|
130
|
+
} },
|
|
131
|
+
.{ tb.AccountFilter, TypeMapping{
|
|
132
|
+
.name = "AccountFilterBatch",
|
|
133
|
+
.visibility = .internal,
|
|
134
|
+
.private_fields = &.{"reserved"},
|
|
135
|
+
} },
|
|
136
|
+
.{ tb.QueryFilter, TypeMapping{
|
|
137
|
+
.name = "QueryFilterBatch",
|
|
138
|
+
.visibility = .internal,
|
|
139
|
+
.private_fields = &.{"reserved"},
|
|
140
|
+
} },
|
|
141
|
+
.{ exports.tb_init_status, TypeMapping{
|
|
142
|
+
.name = "InitializationStatus",
|
|
143
|
+
} },
|
|
144
|
+
.{ exports.tb_client_status, TypeMapping{
|
|
145
|
+
.name = "ClientStatus",
|
|
146
|
+
.visibility = .internal,
|
|
147
|
+
} },
|
|
148
|
+
.{ exports.tb_packet_status, TypeMapping{
|
|
149
|
+
.name = "PacketStatus",
|
|
150
|
+
} },
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const auto_generated_code_notice =
|
|
154
|
+
\\//////////////////////////////////////////////////////////
|
|
155
|
+
\\// This file was auto-generated by java_bindings.zig
|
|
156
|
+
\\// Do not manually modify.
|
|
157
|
+
\\//////////////////////////////////////////////////////////
|
|
158
|
+
\\
|
|
159
|
+
;
|
|
160
|
+
|
|
161
|
+
fn java_type(
|
|
162
|
+
comptime Type: type,
|
|
163
|
+
) []const u8 {
|
|
164
|
+
switch (@typeInfo(Type)) {
|
|
165
|
+
.@"enum" => return comptime get_mapped_type_name(Type) orelse @compileError(
|
|
166
|
+
"Type " ++ @typeName(Type) ++ " not mapped.",
|
|
167
|
+
),
|
|
168
|
+
.@"struct" => |info| switch (info.layout) {
|
|
169
|
+
.@"packed" => return comptime java_type(std.meta.Int(.unsigned, @bitSizeOf(Type))),
|
|
170
|
+
else => return comptime get_mapped_type_name(Type) orelse @compileError(
|
|
171
|
+
"Type " ++ @typeName(Type) ++ " not mapped.",
|
|
172
|
+
),
|
|
173
|
+
},
|
|
174
|
+
.int => |info| {
|
|
175
|
+
// For better API ergonomy,
|
|
176
|
+
// we expose 16-bit unsigned integers in Java as "int" instead of "short".
|
|
177
|
+
// Even though, the backing fields are always stored as "short".
|
|
178
|
+
assert(info.signedness == .unsigned);
|
|
179
|
+
return switch (info.bits) {
|
|
180
|
+
1 => "byte",
|
|
181
|
+
8 => "byte",
|
|
182
|
+
16, 32 => "int",
|
|
183
|
+
64 => "long",
|
|
184
|
+
else => @compileError("invalid int type"),
|
|
185
|
+
};
|
|
186
|
+
},
|
|
187
|
+
else => @compileError("Unhandled type: " ++ @typeName(Type)),
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
fn get_mapped_type_name(comptime Type: type) ?[]const u8 {
|
|
192
|
+
inline for (type_mappings) |type_mapping| {
|
|
193
|
+
if (Type == type_mapping[0]) {
|
|
194
|
+
return type_mapping[1].name;
|
|
195
|
+
}
|
|
196
|
+
} else return null;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
fn to_case(
|
|
200
|
+
comptime input: []const u8,
|
|
201
|
+
comptime case: enum { camel, pascal, upper },
|
|
202
|
+
) []const u8 {
|
|
203
|
+
return comptime blk: {
|
|
204
|
+
var output: [input.len]u8 = undefined;
|
|
205
|
+
if (case == .upper) {
|
|
206
|
+
const len = std.ascii.upperString(output[0..], input).len;
|
|
207
|
+
break :blk stdx.comptime_slice(&output, len);
|
|
208
|
+
} else {
|
|
209
|
+
var len: usize = 0;
|
|
210
|
+
var iterator = std.mem.tokenizeScalar(u8, input, '_');
|
|
211
|
+
while (iterator.next()) |word| {
|
|
212
|
+
_ = std.ascii.lowerString(output[len..], word);
|
|
213
|
+
output[len] = std.ascii.toUpper(output[len]);
|
|
214
|
+
len += word.len;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
output[0] = switch (case) {
|
|
218
|
+
.camel => std.ascii.toLower(output[0]),
|
|
219
|
+
.pascal => std.ascii.toUpper(output[0]),
|
|
220
|
+
.upper => unreachable,
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
break :blk stdx.comptime_slice(&output, len);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
fn emit_enum(
|
|
229
|
+
buffer: *std.ArrayList(u8),
|
|
230
|
+
comptime Type: type,
|
|
231
|
+
comptime mapping: TypeMapping,
|
|
232
|
+
comptime int_type: []const u8,
|
|
233
|
+
) !void {
|
|
234
|
+
try buffer.writer().print(
|
|
235
|
+
\\{[notice]s}
|
|
236
|
+
\\package com.tigerbeetle;
|
|
237
|
+
\\
|
|
238
|
+
\\{[visibility]s}enum {[name]s} {{
|
|
239
|
+
\\
|
|
240
|
+
, .{
|
|
241
|
+
.visibility = if (mapping.visibility == .internal) "" else "public ",
|
|
242
|
+
.notice = auto_generated_code_notice,
|
|
243
|
+
.name = mapping.name,
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
const fields = comptime fields: {
|
|
247
|
+
const EnumField = std.builtin.Type.EnumField;
|
|
248
|
+
const type_info = @typeInfo(Type).@"enum";
|
|
249
|
+
var fields: []const EnumField = &[_]EnumField{};
|
|
250
|
+
for (type_info.fields) |field| {
|
|
251
|
+
if (mapping.is_private(field.name)) continue;
|
|
252
|
+
if (std.mem.startsWith(u8, field.name, "deprecated_")) continue;
|
|
253
|
+
fields = fields ++ [_]EnumField{field};
|
|
254
|
+
}
|
|
255
|
+
break :fields fields;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
inline for (fields, 0..) |field, i| {
|
|
259
|
+
if (mapping.docs_link) |docs_link| {
|
|
260
|
+
try buffer.writer().print(
|
|
261
|
+
\\
|
|
262
|
+
\\ /**
|
|
263
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
264
|
+
\\ */
|
|
265
|
+
\\
|
|
266
|
+
, .{
|
|
267
|
+
.docs_link = docs_link,
|
|
268
|
+
.field_name = field.name,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
try buffer.writer().print(
|
|
273
|
+
\\ {[enum_name]s}(({[int_type]s}) {[value]d}){[separator]c}
|
|
274
|
+
\\
|
|
275
|
+
, .{
|
|
276
|
+
.enum_name = to_case(field.name, .pascal),
|
|
277
|
+
.int_type = int_type,
|
|
278
|
+
.value = @intFromEnum(@field(Type, field.name)),
|
|
279
|
+
.separator = if (i == fields.len - 1) ';' else ',',
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
try buffer.writer().print(
|
|
284
|
+
\\
|
|
285
|
+
\\ public final {[int_type]s} value;
|
|
286
|
+
\\
|
|
287
|
+
\\ {[name]s}({[int_type]s} value) {{
|
|
288
|
+
\\ this.value = value;
|
|
289
|
+
\\ }}
|
|
290
|
+
\\
|
|
291
|
+
\\ public static {[name]s} fromValue({[int_type]s} value) {{
|
|
292
|
+
\\ switch (value) {{
|
|
293
|
+
\\
|
|
294
|
+
, .{
|
|
295
|
+
.int_type = int_type,
|
|
296
|
+
.name = mapping.name,
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
inline for (fields) |field| {
|
|
300
|
+
try buffer.writer().print(
|
|
301
|
+
\\ case {[value]d}: return {[enum_name]s};
|
|
302
|
+
\\
|
|
303
|
+
, .{
|
|
304
|
+
.enum_name = to_case(field.name, .pascal),
|
|
305
|
+
.value = @intFromEnum(@field(Type, field.name)),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
try buffer.writer().print(
|
|
310
|
+
\\ default: throw new IllegalArgumentException(
|
|
311
|
+
\\ String.format("Invalid {[name]s} value=%d", value));
|
|
312
|
+
\\ }}
|
|
313
|
+
\\ }}
|
|
314
|
+
\\}}
|
|
315
|
+
\\
|
|
316
|
+
\\
|
|
317
|
+
, .{
|
|
318
|
+
.name = mapping.name,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
fn emit_packed_enum(
|
|
323
|
+
buffer: *std.ArrayList(u8),
|
|
324
|
+
comptime type_info: anytype,
|
|
325
|
+
comptime mapping: TypeMapping,
|
|
326
|
+
comptime int_type: []const u8,
|
|
327
|
+
) !void {
|
|
328
|
+
try buffer.writer().print(
|
|
329
|
+
\\{[notice]s}
|
|
330
|
+
\\package com.tigerbeetle;
|
|
331
|
+
\\
|
|
332
|
+
\\{[visibility]s}interface {[name]s} {{
|
|
333
|
+
\\ {[int_type]s} NONE = ({[int_type]s}) 0;
|
|
334
|
+
\\
|
|
335
|
+
, .{
|
|
336
|
+
.visibility = if (mapping.visibility == .internal) "" else "public ",
|
|
337
|
+
.notice = auto_generated_code_notice,
|
|
338
|
+
.name = mapping.name,
|
|
339
|
+
.int_type = int_type,
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
inline for (type_info.fields, 0..) |field, i| {
|
|
343
|
+
if (comptime mapping.is_private(field.name)) continue;
|
|
344
|
+
|
|
345
|
+
if (mapping.docs_link) |docs_link| {
|
|
346
|
+
try buffer.writer().print(
|
|
347
|
+
\\
|
|
348
|
+
\\ /**
|
|
349
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
350
|
+
\\ */
|
|
351
|
+
\\
|
|
352
|
+
, .{
|
|
353
|
+
.docs_link = docs_link,
|
|
354
|
+
.field_name = field.name,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
try buffer.writer().print(
|
|
359
|
+
\\ {[int_type]s} {[enum_name]s} = ({[int_type]s}) (1 << {[value]d});
|
|
360
|
+
\\
|
|
361
|
+
, .{
|
|
362
|
+
.int_type = int_type,
|
|
363
|
+
.enum_name = to_case(field.name, .upper),
|
|
364
|
+
.value = i,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
try buffer.writer().print("\n", .{});
|
|
369
|
+
|
|
370
|
+
inline for (type_info.fields) |field| {
|
|
371
|
+
if (comptime mapping.is_private(field.name)) continue;
|
|
372
|
+
|
|
373
|
+
try buffer.writer().print(
|
|
374
|
+
\\ static boolean has{[flag_name]s}(final {[int_type]s} flags) {{
|
|
375
|
+
\\ return (flags & {[enum_name]s}) == {[enum_name]s};
|
|
376
|
+
\\ }}
|
|
377
|
+
\\
|
|
378
|
+
\\
|
|
379
|
+
, .{
|
|
380
|
+
.flag_name = to_case(field.name, .pascal),
|
|
381
|
+
.int_type = int_type,
|
|
382
|
+
.enum_name = to_case(field.name, .upper),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
try buffer.writer().print(
|
|
387
|
+
\\}}
|
|
388
|
+
\\
|
|
389
|
+
, .{});
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
fn batch_type(comptime Type: type) []const u8 {
|
|
393
|
+
switch (@typeInfo(Type)) {
|
|
394
|
+
.int => |info| {
|
|
395
|
+
assert(info.signedness == .unsigned);
|
|
396
|
+
switch (info.bits) {
|
|
397
|
+
16 => return "UInt16",
|
|
398
|
+
32 => return "UInt32",
|
|
399
|
+
64 => return "UInt64",
|
|
400
|
+
else => {},
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
.@"struct" => |info| switch (info.layout) {
|
|
404
|
+
.@"packed" => return batch_type(std.meta.Int(.unsigned, @bitSizeOf(Type))),
|
|
405
|
+
else => {},
|
|
406
|
+
},
|
|
407
|
+
.@"enum" => return batch_type(std.meta.Int(.unsigned, @bitSizeOf(Type))),
|
|
408
|
+
else => {},
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
@compileError("Unhandled type: " ++ @typeName(Type));
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
fn emit_batch(
|
|
415
|
+
buffer: *std.ArrayList(u8),
|
|
416
|
+
comptime type_info: anytype,
|
|
417
|
+
comptime mapping: TypeMapping,
|
|
418
|
+
comptime size: usize,
|
|
419
|
+
) !void {
|
|
420
|
+
try buffer.writer().print(
|
|
421
|
+
\\{[notice]s}
|
|
422
|
+
\\package com.tigerbeetle;
|
|
423
|
+
\\
|
|
424
|
+
\\import java.nio.ByteBuffer;
|
|
425
|
+
\\{[big_integer_import]s}
|
|
426
|
+
\\
|
|
427
|
+
\\{[visibility]s}final class {[name]s} extends Batch {{
|
|
428
|
+
\\
|
|
429
|
+
\\{[constants]s}
|
|
430
|
+
\\ interface Struct {{
|
|
431
|
+
\\ int SIZE = {[size]d};
|
|
432
|
+
\\
|
|
433
|
+
\\
|
|
434
|
+
, .{
|
|
435
|
+
.visibility = if (mapping.visibility == .internal) "" else "public ",
|
|
436
|
+
.notice = auto_generated_code_notice,
|
|
437
|
+
.name = mapping.name,
|
|
438
|
+
.size = size,
|
|
439
|
+
.big_integer_import = if (big_integer.contains_any(type_info))
|
|
440
|
+
"import java.math.BigInteger;"
|
|
441
|
+
else
|
|
442
|
+
"",
|
|
443
|
+
.constants = mapping.constants,
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
// Fields offset:
|
|
447
|
+
var offset: usize = 0;
|
|
448
|
+
inline for (type_info.fields) |field| {
|
|
449
|
+
try buffer.writer().print(
|
|
450
|
+
\\ int {[field_name]s} = {[offset]d};
|
|
451
|
+
\\
|
|
452
|
+
, .{
|
|
453
|
+
.field_name = to_case(field.name, .pascal),
|
|
454
|
+
.offset = offset,
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
offset += @sizeOf(field.type);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Constructors:
|
|
461
|
+
try buffer.writer().print(
|
|
462
|
+
\\ }}
|
|
463
|
+
\\
|
|
464
|
+
\\ /**
|
|
465
|
+
\\ * Creates an empty batch with the desired maximum capacity.
|
|
466
|
+
\\ * <p>
|
|
467
|
+
\\ * Once created, an instance cannot be resized, however it may contain any number of elements
|
|
468
|
+
\\ * between zero and its {{@link #getCapacity capacity}}.
|
|
469
|
+
\\ *
|
|
470
|
+
\\ * @param capacity the maximum capacity.
|
|
471
|
+
\\ * @throws IllegalArgumentException if capacity is negative.
|
|
472
|
+
\\ */
|
|
473
|
+
\\ public {[name]s}(final int capacity) {{
|
|
474
|
+
\\ super(capacity, Struct.SIZE);
|
|
475
|
+
\\ }}
|
|
476
|
+
\\
|
|
477
|
+
\\ {[name]s}(final ByteBuffer buffer) {{
|
|
478
|
+
\\ super(buffer, Struct.SIZE);
|
|
479
|
+
\\ }}
|
|
480
|
+
\\
|
|
481
|
+
\\
|
|
482
|
+
, .{
|
|
483
|
+
.name = mapping.name,
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
// Properties:
|
|
487
|
+
inline for (type_info.fields) |field| {
|
|
488
|
+
if (field.type == u128) {
|
|
489
|
+
try emit_u128_batch_accessors(buffer, mapping, field);
|
|
490
|
+
} else {
|
|
491
|
+
try emit_batch_accessors(buffer, mapping, field);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
try buffer.writer().print(
|
|
496
|
+
\\}}
|
|
497
|
+
\\
|
|
498
|
+
\\
|
|
499
|
+
, .{});
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
fn emit_batch_accessors(
|
|
503
|
+
buffer: *std.ArrayList(u8),
|
|
504
|
+
comptime mapping: TypeMapping,
|
|
505
|
+
comptime field: anytype,
|
|
506
|
+
) !void {
|
|
507
|
+
comptime assert(field.type != u128);
|
|
508
|
+
const is_private = comptime mapping.is_private(field.name);
|
|
509
|
+
const is_read_only = comptime mapping.is_read_only(field.name);
|
|
510
|
+
|
|
511
|
+
// Get:
|
|
512
|
+
try buffer.writer().print(
|
|
513
|
+
\\ /**
|
|
514
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
515
|
+
\\
|
|
516
|
+
, .{});
|
|
517
|
+
|
|
518
|
+
if (mapping.docs_link) |docs_link| {
|
|
519
|
+
try buffer.writer().print(
|
|
520
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
521
|
+
\\ */
|
|
522
|
+
\\
|
|
523
|
+
, .{
|
|
524
|
+
.docs_link = docs_link,
|
|
525
|
+
.field_name = field.name,
|
|
526
|
+
});
|
|
527
|
+
} else {
|
|
528
|
+
try buffer.writer().print(
|
|
529
|
+
\\ */
|
|
530
|
+
\\
|
|
531
|
+
, .{});
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
if (@typeInfo(field.type) == .array) {
|
|
535
|
+
try buffer.writer().print(
|
|
536
|
+
\\ {[visibility]s}byte[] get{[property]s}() {{
|
|
537
|
+
\\ return getArray(at(Struct.{[property]s}), {[array_len]d});
|
|
538
|
+
\\ }}
|
|
539
|
+
\\
|
|
540
|
+
\\
|
|
541
|
+
, .{
|
|
542
|
+
.visibility = if (is_private) "" else "public ",
|
|
543
|
+
.property = to_case(field.name, .pascal),
|
|
544
|
+
.array_len = @typeInfo(field.type).array.len,
|
|
545
|
+
});
|
|
546
|
+
} else {
|
|
547
|
+
try buffer.writer().print(
|
|
548
|
+
\\ {[visibility]s}{[java_type]s} get{[property]s}() {{
|
|
549
|
+
\\ final var value = get{[batch_type]s}(at(Struct.{[property]s}));
|
|
550
|
+
\\ return {[return_expression]s};
|
|
551
|
+
\\ }}
|
|
552
|
+
\\
|
|
553
|
+
\\
|
|
554
|
+
, .{
|
|
555
|
+
.visibility = if (is_private) "" else "public ",
|
|
556
|
+
.java_type = java_type(field.type),
|
|
557
|
+
.property = to_case(field.name, .pascal),
|
|
558
|
+
.batch_type = batch_type(field.type),
|
|
559
|
+
.return_expression = comptime if (@typeInfo(field.type) == .@"enum")
|
|
560
|
+
get_mapped_type_name(field.type).? ++ ".fromValue(value)"
|
|
561
|
+
else
|
|
562
|
+
"value",
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Set:
|
|
567
|
+
try buffer.writer().print(
|
|
568
|
+
\\ /**
|
|
569
|
+
\\ * @param {[param_name]s}
|
|
570
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
571
|
+
\\ * @throws IllegalStateException if a {{@link #isReadOnly() read-only}} batch.
|
|
572
|
+
\\
|
|
573
|
+
, .{
|
|
574
|
+
.param_name = to_case(field.name, .camel),
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
if (mapping.docs_link) |docs_link| {
|
|
578
|
+
try buffer.writer().print(
|
|
579
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
580
|
+
\\ */
|
|
581
|
+
\\
|
|
582
|
+
, .{
|
|
583
|
+
.docs_link = docs_link,
|
|
584
|
+
.field_name = field.name,
|
|
585
|
+
});
|
|
586
|
+
} else {
|
|
587
|
+
try buffer.writer().print(
|
|
588
|
+
\\ */
|
|
589
|
+
\\
|
|
590
|
+
, .{});
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
if (@typeInfo(field.type) == .array) {
|
|
594
|
+
try buffer.writer().print(
|
|
595
|
+
\\ {[visibility]s}void set{[property]s}(byte[] {[param_name]s}) {{
|
|
596
|
+
\\ if ({[param_name]s} == null)
|
|
597
|
+
\\ {[param_name]s} = new byte[{[array_len]d}];
|
|
598
|
+
\\ if ({[param_name]s}.length != {[array_len]d})
|
|
599
|
+
\\ throw new IllegalArgumentException("Reserved must be {[array_len]d} bytes long");
|
|
600
|
+
\\ putArray(at(Struct.{[property]s}), {[param_name]s});
|
|
601
|
+
\\ }}
|
|
602
|
+
\\
|
|
603
|
+
\\
|
|
604
|
+
, .{
|
|
605
|
+
.property = to_case(field.name, .pascal),
|
|
606
|
+
.param_name = to_case(field.name, .camel),
|
|
607
|
+
.visibility = if (is_private or is_read_only) "" else "public ",
|
|
608
|
+
.array_len = @typeInfo(field.type).array.len,
|
|
609
|
+
});
|
|
610
|
+
} else {
|
|
611
|
+
try buffer.writer().print(
|
|
612
|
+
\\ {[visibility]s}void set{[property]s}(final {[java_type]s} {[param_name]s}) {{
|
|
613
|
+
\\ put{[batch_type]s}(at(Struct.{[property]s}), {[param_name]s}{[value_expression]s});
|
|
614
|
+
\\ }}
|
|
615
|
+
\\
|
|
616
|
+
\\
|
|
617
|
+
, .{
|
|
618
|
+
.property = to_case(field.name, .pascal),
|
|
619
|
+
.param_name = to_case(field.name, .camel),
|
|
620
|
+
.visibility = if (is_private or is_read_only) "" else "public ",
|
|
621
|
+
.batch_type = batch_type(field.type),
|
|
622
|
+
.java_type = java_type(field.type),
|
|
623
|
+
.value_expression = if (comptime @typeInfo(field.type) == .@"enum")
|
|
624
|
+
".value"
|
|
625
|
+
else
|
|
626
|
+
"",
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
// We offer multiple APIs for dealing with UInt128 in Java:
|
|
632
|
+
// - A byte array, heap-allocated, for ids and user_data;
|
|
633
|
+
// - A BigInteger, heap-allocated, for balances and amounts;
|
|
634
|
+
// - Two 64-bit integers (long), stack-allocated, for both cases;
|
|
635
|
+
fn emit_u128_batch_accessors(
|
|
636
|
+
buffer: *std.ArrayList(u8),
|
|
637
|
+
comptime mapping: TypeMapping,
|
|
638
|
+
comptime field: anytype,
|
|
639
|
+
) !void {
|
|
640
|
+
comptime assert(field.type == u128);
|
|
641
|
+
const is_private = comptime mapping.is_private(field.name);
|
|
642
|
+
const is_read_only = comptime mapping.is_read_only(field.name);
|
|
643
|
+
|
|
644
|
+
if (big_integer.contains(field.name)) {
|
|
645
|
+
// Get BigInteger:
|
|
646
|
+
try buffer.writer().print(
|
|
647
|
+
\\ /**
|
|
648
|
+
\\ * @return a {{@link java.math.BigInteger}} representing the 128-bit value.
|
|
649
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
650
|
+
\\
|
|
651
|
+
, .{});
|
|
652
|
+
|
|
653
|
+
if (mapping.docs_link) |docs_link| {
|
|
654
|
+
try buffer.writer().print(
|
|
655
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
656
|
+
\\ */
|
|
657
|
+
\\
|
|
658
|
+
, .{
|
|
659
|
+
.docs_link = docs_link,
|
|
660
|
+
.field_name = field.name,
|
|
661
|
+
});
|
|
662
|
+
} else {
|
|
663
|
+
try buffer.writer().print(
|
|
664
|
+
\\ */
|
|
665
|
+
\\
|
|
666
|
+
, .{});
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
try buffer.writer().print(
|
|
670
|
+
\\ {[visibility]s}BigInteger get{[property]s}() {{
|
|
671
|
+
\\ final var index = at(Struct.{[property]s});
|
|
672
|
+
\\ return UInt128.asBigInteger(
|
|
673
|
+
\\ getUInt128(index, UInt128.LeastSignificant),
|
|
674
|
+
\\ getUInt128(index, UInt128.MostSignificant));
|
|
675
|
+
\\ }}
|
|
676
|
+
\\
|
|
677
|
+
\\
|
|
678
|
+
, .{
|
|
679
|
+
.visibility = if (is_private) "" else "public ",
|
|
680
|
+
.property = to_case(field.name, .pascal),
|
|
681
|
+
});
|
|
682
|
+
} else {
|
|
683
|
+
// Get array:
|
|
684
|
+
try buffer.writer().print(
|
|
685
|
+
\\ /**
|
|
686
|
+
\\ * @return an array of 16 bytes representing the 128-bit value.
|
|
687
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
688
|
+
\\
|
|
689
|
+
, .{});
|
|
690
|
+
|
|
691
|
+
if (mapping.docs_link) |docs_link| {
|
|
692
|
+
try buffer.writer().print(
|
|
693
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
694
|
+
\\ */
|
|
695
|
+
\\
|
|
696
|
+
, .{
|
|
697
|
+
.docs_link = docs_link,
|
|
698
|
+
.field_name = field.name,
|
|
699
|
+
});
|
|
700
|
+
} else {
|
|
701
|
+
try buffer.writer().print(
|
|
702
|
+
\\ */
|
|
703
|
+
\\
|
|
704
|
+
, .{});
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
try buffer.writer().print(
|
|
708
|
+
\\ {[visibility]s}byte[] get{[property]s}() {{
|
|
709
|
+
\\ return getUInt128(at(Struct.{[property]s}));
|
|
710
|
+
\\ }}
|
|
711
|
+
\\
|
|
712
|
+
\\
|
|
713
|
+
, .{
|
|
714
|
+
.visibility = if (is_private) "" else "public ",
|
|
715
|
+
.property = to_case(field.name, .pascal),
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// Get long:
|
|
720
|
+
try buffer.writer().print(
|
|
721
|
+
\\ /**
|
|
722
|
+
\\ * @param part a {{@link UInt128}} enum indicating which part of the 128-bit value
|
|
723
|
+
\\ is to be retrieved.
|
|
724
|
+
\\ * @return a {{@code long}} representing the first 8 bytes of the 128-bit value if
|
|
725
|
+
\\ * {{@link UInt128#LeastSignificant}} is informed, or the last 8 bytes if
|
|
726
|
+
\\ * {{@link UInt128#MostSignificant}}.
|
|
727
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
728
|
+
\\
|
|
729
|
+
, .{});
|
|
730
|
+
|
|
731
|
+
if (mapping.docs_link) |docs_link| {
|
|
732
|
+
try buffer.writer().print(
|
|
733
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
734
|
+
\\ */
|
|
735
|
+
\\
|
|
736
|
+
, .{
|
|
737
|
+
.docs_link = docs_link,
|
|
738
|
+
.field_name = field.name,
|
|
739
|
+
});
|
|
740
|
+
} else {
|
|
741
|
+
try buffer.writer().print(
|
|
742
|
+
\\ */
|
|
743
|
+
\\
|
|
744
|
+
, .{});
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
try buffer.writer().print(
|
|
748
|
+
\\ {[visibility]s}long get{[property]s}(final UInt128 part) {{
|
|
749
|
+
\\ return getUInt128(at(Struct.{[property]s}), part);
|
|
750
|
+
\\ }}
|
|
751
|
+
\\
|
|
752
|
+
\\
|
|
753
|
+
, .{
|
|
754
|
+
.visibility = if (is_private) "" else "public ",
|
|
755
|
+
.property = to_case(field.name, .pascal),
|
|
756
|
+
});
|
|
757
|
+
|
|
758
|
+
if (big_integer.contains(field.name)) {
|
|
759
|
+
// Set BigInteger:
|
|
760
|
+
try buffer.writer().print(
|
|
761
|
+
\\ /**
|
|
762
|
+
\\ * @param {[param_name]s} a {{@link java.math.BigInteger}} representing the 128-bit value.
|
|
763
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
764
|
+
\\ * @throws IllegalStateException if a {{@link #isReadOnly() read-only}} batch.
|
|
765
|
+
\\
|
|
766
|
+
, .{
|
|
767
|
+
.param_name = to_case(field.name, .camel),
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
if (mapping.docs_link) |docs_link| {
|
|
771
|
+
try buffer.writer().print(
|
|
772
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
773
|
+
\\ */
|
|
774
|
+
\\
|
|
775
|
+
, .{
|
|
776
|
+
.docs_link = docs_link,
|
|
777
|
+
.field_name = field.name,
|
|
778
|
+
});
|
|
779
|
+
} else {
|
|
780
|
+
try buffer.writer().print(
|
|
781
|
+
\\ */
|
|
782
|
+
\\
|
|
783
|
+
, .{});
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
try buffer.writer().print(
|
|
787
|
+
\\ {[visibility]s}void set{[property]s}(final BigInteger {[param_name]s}) {{
|
|
788
|
+
\\ putUInt128(at(Struct.{[property]s}), UInt128.asBytes({[param_name]s}));
|
|
789
|
+
\\ }}
|
|
790
|
+
\\
|
|
791
|
+
\\
|
|
792
|
+
, .{
|
|
793
|
+
.visibility = if (is_private or is_read_only) "" else "public ",
|
|
794
|
+
.property = to_case(field.name, .pascal),
|
|
795
|
+
.param_name = to_case(field.name, .camel),
|
|
796
|
+
});
|
|
797
|
+
} else {
|
|
798
|
+
// Set array:
|
|
799
|
+
try buffer.writer().print(
|
|
800
|
+
\\ /**
|
|
801
|
+
\\ * @param {[param_name]s} an array of 16 bytes representing the 128-bit value.
|
|
802
|
+
\\ * @throws IllegalArgumentException if {{@code {[param_name]s}}} is not 16 bytes long.
|
|
803
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
804
|
+
\\ * @throws IllegalStateException if a {{@link #isReadOnly() read-only}} batch.
|
|
805
|
+
\\
|
|
806
|
+
, .{
|
|
807
|
+
.param_name = to_case(field.name, .camel),
|
|
808
|
+
});
|
|
809
|
+
|
|
810
|
+
if (mapping.docs_link) |docs_link| {
|
|
811
|
+
try buffer.writer().print(
|
|
812
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
813
|
+
\\ */
|
|
814
|
+
\\
|
|
815
|
+
, .{
|
|
816
|
+
.docs_link = docs_link,
|
|
817
|
+
.field_name = field.name,
|
|
818
|
+
});
|
|
819
|
+
} else {
|
|
820
|
+
try buffer.writer().print(
|
|
821
|
+
\\ */
|
|
822
|
+
\\
|
|
823
|
+
, .{});
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
try buffer.writer().print(
|
|
827
|
+
\\ {[visibility]s}void set{[property]s}(final byte[] {[param_name]s}) {{
|
|
828
|
+
\\ putUInt128(at(Struct.{[property]s}), {[param_name]s});
|
|
829
|
+
\\ }}
|
|
830
|
+
\\
|
|
831
|
+
\\
|
|
832
|
+
, .{
|
|
833
|
+
.visibility = if (is_private or is_read_only) "" else "public ",
|
|
834
|
+
.property = to_case(field.name, .pascal),
|
|
835
|
+
.param_name = to_case(field.name, .camel),
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
// Set long:
|
|
840
|
+
try buffer.writer().print(
|
|
841
|
+
\\ /**
|
|
842
|
+
\\ * @param leastSignificant a {{@code long}} representing the first 8 bytes of the 128-bit value.
|
|
843
|
+
\\ * @param mostSignificant a {{@code long}} representing the last 8 bytes of the 128-bit value.
|
|
844
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
845
|
+
\\ * @throws IllegalStateException if a {{@link #isReadOnly() read-only}} batch.
|
|
846
|
+
\\
|
|
847
|
+
, .{});
|
|
848
|
+
|
|
849
|
+
if (mapping.docs_link) |docs_link| {
|
|
850
|
+
try buffer.writer().print(
|
|
851
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
852
|
+
\\ */
|
|
853
|
+
\\
|
|
854
|
+
, .{
|
|
855
|
+
.docs_link = docs_link,
|
|
856
|
+
.field_name = field.name,
|
|
857
|
+
});
|
|
858
|
+
} else {
|
|
859
|
+
try buffer.writer().print(
|
|
860
|
+
\\ */
|
|
861
|
+
\\
|
|
862
|
+
, .{});
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
try buffer.writer().print(
|
|
866
|
+
\\ {[visibility]s}void set{[property]s}(final long leastSignificant, final long mostSignificant) {{
|
|
867
|
+
\\ putUInt128(at(Struct.{[property]s}), leastSignificant, mostSignificant);
|
|
868
|
+
\\ }}
|
|
869
|
+
\\
|
|
870
|
+
\\
|
|
871
|
+
, .{
|
|
872
|
+
.visibility = if (is_private or is_read_only) "" else "public ",
|
|
873
|
+
.property = to_case(field.name, .pascal),
|
|
874
|
+
});
|
|
875
|
+
|
|
876
|
+
// Set long without most significant bits
|
|
877
|
+
try buffer.writer().print(
|
|
878
|
+
\\ /**
|
|
879
|
+
\\ * @param leastSignificant a {{@code long}} representing the first 8 bytes of the 128-bit value.
|
|
880
|
+
\\ * @throws IllegalStateException if not at a {{@link #isValidPosition valid position}}.
|
|
881
|
+
\\ * @throws IllegalStateException if a {{@link #isReadOnly() read-only}} batch.
|
|
882
|
+
\\
|
|
883
|
+
, .{});
|
|
884
|
+
|
|
885
|
+
if (mapping.docs_link) |docs_link| {
|
|
886
|
+
try buffer.writer().print(
|
|
887
|
+
\\ * @see <a href="https://docs.tigerbeetle.com/{[docs_link]s}{[field_name]s}">{[field_name]s}</a>
|
|
888
|
+
\\ */
|
|
889
|
+
\\
|
|
890
|
+
, .{
|
|
891
|
+
.docs_link = docs_link,
|
|
892
|
+
.field_name = field.name,
|
|
893
|
+
});
|
|
894
|
+
} else {
|
|
895
|
+
try buffer.writer().print(
|
|
896
|
+
\\ */
|
|
897
|
+
\\
|
|
898
|
+
, .{});
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
try buffer.writer().print(
|
|
902
|
+
\\ {[visibility]s}void set{[property]s}(final long leastSignificant) {{
|
|
903
|
+
\\ putUInt128(at(Struct.{[property]s}), leastSignificant, 0);
|
|
904
|
+
\\ }}
|
|
905
|
+
\\
|
|
906
|
+
\\
|
|
907
|
+
, .{
|
|
908
|
+
.visibility = if (is_private or is_read_only) "" else "public ",
|
|
909
|
+
.property = to_case(field.name, .pascal),
|
|
910
|
+
});
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
pub fn generate_bindings(
|
|
914
|
+
comptime ZigType: type,
|
|
915
|
+
comptime mapping: TypeMapping,
|
|
916
|
+
buffer: *std.ArrayList(u8),
|
|
917
|
+
) !void {
|
|
918
|
+
@setEvalBranchQuota(100_000);
|
|
919
|
+
|
|
920
|
+
switch (@typeInfo(ZigType)) {
|
|
921
|
+
.@"struct" => |info| switch (info.layout) {
|
|
922
|
+
.auto => @compileError(
|
|
923
|
+
"Only packed or extern structs are supported: " ++ @typeName(ZigType),
|
|
924
|
+
),
|
|
925
|
+
.@"packed" => try emit_packed_enum(
|
|
926
|
+
buffer,
|
|
927
|
+
info,
|
|
928
|
+
mapping,
|
|
929
|
+
comptime java_type(std.meta.Int(.unsigned, @bitSizeOf(ZigType))),
|
|
930
|
+
),
|
|
931
|
+
.@"extern" => try emit_batch(
|
|
932
|
+
buffer,
|
|
933
|
+
info,
|
|
934
|
+
mapping,
|
|
935
|
+
@sizeOf(ZigType),
|
|
936
|
+
),
|
|
937
|
+
},
|
|
938
|
+
.@"enum" => try emit_enum(
|
|
939
|
+
buffer,
|
|
940
|
+
ZigType,
|
|
941
|
+
mapping,
|
|
942
|
+
comptime java_type(std.meta.Int(.unsigned, @bitSizeOf(ZigType))),
|
|
943
|
+
),
|
|
944
|
+
else => @compileError("Type cannot be represented: " ++ @typeName(ZigType)),
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
pub fn main() !void {
|
|
949
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
950
|
+
defer arena.deinit();
|
|
951
|
+
|
|
952
|
+
const allocator = arena.allocator();
|
|
953
|
+
|
|
954
|
+
var args = try std.process.argsWithAllocator(allocator);
|
|
955
|
+
defer args.deinit();
|
|
956
|
+
assert(args.skip());
|
|
957
|
+
const target_dir_path = args.next().?;
|
|
958
|
+
assert(args.next() == null);
|
|
959
|
+
|
|
960
|
+
var target_dir = try std.fs.cwd().openDir(target_dir_path, .{});
|
|
961
|
+
defer target_dir.close();
|
|
962
|
+
|
|
963
|
+
// Emit Java declarations.
|
|
964
|
+
inline for (type_mappings) |type_mapping| {
|
|
965
|
+
const ZigType = type_mapping[0];
|
|
966
|
+
const mapping = type_mapping[1];
|
|
967
|
+
|
|
968
|
+
var buffer = std.ArrayList(u8).init(allocator);
|
|
969
|
+
try generate_bindings(ZigType, mapping, &buffer);
|
|
970
|
+
|
|
971
|
+
try target_dir.writeFile(.{
|
|
972
|
+
.sub_path = mapping.name ++ ".java",
|
|
973
|
+
.data = buffer.items,
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
{
|
|
978
|
+
var buffer = std.ArrayList(u8).init(allocator);
|
|
979
|
+
try buffer.writer().print(
|
|
980
|
+
\\package com.tigerbeetle;
|
|
981
|
+
\\
|
|
982
|
+
\\interface TBClient {{
|
|
983
|
+
\\ int SIZE = {};
|
|
984
|
+
\\ int ALIGNMENT = {};
|
|
985
|
+
\\}}
|
|
986
|
+
\\
|
|
987
|
+
, .{
|
|
988
|
+
@sizeOf(exports.tb_client_t),
|
|
989
|
+
@alignOf(exports.tb_client_t),
|
|
990
|
+
});
|
|
991
|
+
try target_dir.writeFile(.{
|
|
992
|
+
.sub_path = "TBClient.java",
|
|
993
|
+
.data = buffer.items,
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
}
|