5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 07:09:54 +08:00
wails/v2/internal/binding/binding_test/binding_deepelements_test.go
Jeremy Jay c4fdfd6415
Fix miscellaneous bindings and typescript export bugs (#3978)
* Do not attempt to export fields that cannot be json-encoded

* update changelog w/ PR

* also skip UnsafePointers

* WIP to allow conversion from Go generic types to typescript

* support for non-primitive generics also :)

* fix generic types in parameters / return args

* fixes a namespacing bug when mapping to pointer to struct

* fixing invalid knownstructs

* found a place it mattered, pushing the star replacement to the generate side

* descend as much as necessary to find structs

caught these examples in http.Request.TLS:

PeerCertificates []*x509.Certificate
VerifiedChains [][]*x509.Certificate

* accidently reverted other fix

* switch syntax for typescript record outputs

prior syntax is primarily useful for naming keys
so not useful here, and this syntax avoids square
brackets in output which greatly simplifies
generation for Go generics

* better handle edge cases for nested arrays and slices

* lots o tests

* update changelog

---------

Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
2025-01-13 20:14:54 +11:00

127 lines
5.0 KiB
Go

package binding_test
// Issues 2303, 3442, 3709
type DeepMessage struct {
Msg string
}
type DeepElements struct {
Single []int
Double [][]string
FourDouble [4][]float64
DoubleFour [][4]int64
Triple [][][]int
SingleMap map[string]int
SliceMap map[string][]int
DoubleSliceMap map[string][][]int
ArrayMap map[string][4]int
DoubleArrayMap1 map[string][4][]int
DoubleArrayMap2 map[string][][4]int
DoubleArrayMap3 map[string][4][4]int
OneStructs []*DeepMessage
TwoStructs [3][]*DeepMessage
ThreeStructs [][][]DeepMessage
MapStructs map[string][]*DeepMessage
MapTwoStructs map[string][4][]DeepMessage
MapThreeStructs map[string][][7][]*DeepMessage
}
func (x DeepElements) Get() DeepElements {
return x
}
var DeepElementsTest = BindingTest{
name: "DeepElements",
structs: []interface{}{
&DeepElements{},
},
exemptions: nil,
shouldError: false,
want: `
export namespace binding_test {
export class DeepMessage {
Msg: string;
static createFrom(source: any = {}) {
return new DeepMessage(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.Msg = source["Msg"];
}
}
export class DeepElements {
Single: number[];
Double: string[][];
FourDouble: number[][];
DoubleFour: number[][];
Triple: number[][][];
SingleMap: Record<string, number>;
SliceMap: Record<string, number[]>;
DoubleSliceMap: Record<string, number[][]>;
ArrayMap: Record<string, number[]>;
DoubleArrayMap1: Record<string, number[][]>;
DoubleArrayMap2: Record<string, number[][]>;
DoubleArrayMap3: Record<string, number[][]>;
OneStructs: DeepMessage[];
TwoStructs: DeepMessage[][];
ThreeStructs: DeepMessage[][][];
MapStructs: Record<string, DeepMessage[]>;
MapTwoStructs: Record<string, DeepMessage[][]>;
MapThreeStructs: Record<string, DeepMessage[][][]>;
static createFrom(source: any = {}) {
return new DeepElements(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.Single = source["Single"];
this.Double = source["Double"];
this.FourDouble = source["FourDouble"];
this.DoubleFour = source["DoubleFour"];
this.Triple = source["Triple"];
this.SingleMap = source["SingleMap"];
this.SliceMap = source["SliceMap"];
this.DoubleSliceMap = source["DoubleSliceMap"];
this.ArrayMap = source["ArrayMap"];
this.DoubleArrayMap1 = source["DoubleArrayMap1"];
this.DoubleArrayMap2 = source["DoubleArrayMap2"];
this.DoubleArrayMap3 = source["DoubleArrayMap3"];
this.OneStructs = this.convertValues(source["OneStructs"], DeepMessage);
this.TwoStructs = this.convertValues(source["TwoStructs"], DeepMessage);
this.ThreeStructs = this.convertValues(source["ThreeStructs"], DeepMessage);
this.MapStructs = this.convertValues(source["MapStructs"], DeepMessage[], true);
this.MapTwoStructs = this.convertValues(source["MapTwoStructs"], DeepMessage[][], true);
this.MapThreeStructs = this.convertValues(source["MapThreeStructs"], DeepMessage[][][], true);
}
convertValues(a: any, classs: any, asMap: boolean = false): any {
if (!a) {
return a;
}
if (a.slice && a.map) {
return (a as any[]).map(elem => this.convertValues(elem, classs));
} else if ("object" === typeof a) {
if (asMap) {
for (const key of Object.keys(a)) {
a[key] = new classs(a[key]);
}
return a;
}
return new classs(a);
}
return a;
}
}
}
`,
}