dev
dart 64 lines 1.42 KB
Raw
1 import 'dart:ffi';
2 import 'package:ffi/ffi.dart';
3 import 'dart:convert';
4
5 class PayloadResult {
6 final String payload;
7 final String err;
8 final int errCode;
9
10 const PayloadResult(this.payload, this.err, this.errCode);
11 }
12
13 // Executes the provided fn and converts the string response to a PayloadResult.
14 // Returns payload, error code, and error.
15 PayloadResult executePayloadFn({
16 required Pointer<Char> fn(),
17 required List<Pointer> ptrsToFree,
18 bool skipErrorCheck = false,
19 }) {
20 final jsonStr = fn().toDartString();
21 freePointers(ptrsToFree);
22 if (jsonStr == null) throw Exception("no json return from wallet library");
23 final decoded = json.decode(jsonStr);
24
25 final err = decoded["error"] ?? "";
26 if (!skipErrorCheck) {
27 checkErr(err);
28 }
29
30 final payload = decoded["payload"] ?? "";
31 final errCode = decoded["errorcode"] ?? -1;
32 return new PayloadResult(payload, err, errCode);
33 }
34
35 void freePointers(List<Pointer> ptrsToFree) {
36 for (final ptr in ptrsToFree) {
37 malloc.free(ptr);
38 }
39 }
40
41 void checkErr(String err) {
42 if (err == "") return;
43 throw Exception(err);
44 }
45
46 extension StringUtil on String {
47 Pointer<Char> toCString() => toNativeUtf8().cast<Char>();
48 }
49
50 extension CStringUtil on Pointer<Char> {
51 bool get isNull => address == nullptr.address;
52
53 free() {
54 malloc.free(this);
55 }
56
57 String? toDartString() {
58 if (isNull) return null;
59
60 final str = cast<Utf8>().toDartString();
61 free();
62 return str;
63 }
64 }