@@ -29,6 +29,7 @@ import (
29
29
"slices"
30
30
"sort"
31
31
"strings"
32
+ "text/template"
32
33
"unicode"
33
34
)
34
35
@@ -80,6 +81,45 @@ var GeneratableInterfaces = []GeneratableInterfacePoperties{
80
81
},
81
82
}
82
83
84
+ // Template definitions
85
+ const handleHelperTemplate = `
86
+ // {{.Type}}Handle attempts to convert a {{.Interface}} to an {{.Type}}.
87
+ func {{.Type}}Handle({{.ParamName}} {{.Interface}}) {{.Type}} {
88
+ var helper func(val reflect.Value) {{.Type}}
89
+ helper = func(val reflect.Value) {{.Type}} {
90
+ if val.Kind() == reflect.Interface {
91
+ val = val.Elem()
92
+ }
93
+ if val.Kind() == reflect.Ptr {
94
+ val = val.Elem()
95
+ }
96
+ if val.Type() == reflect.TypeOf((*{{.Type}})(nil)).Elem() {
97
+ return val.Interface().({{.Type}})
98
+ }
99
+ if val.Kind() != reflect.Struct {
100
+ panic(fmt.Errorf("unable to convert non-struct type %v to {{.Type}}", val.Kind()))
101
+ }
102
+ for i := 0; i < val.Type().NumField(); i++ {
103
+ if !val.Type().Field(i).Anonymous {
104
+ continue
105
+ }
106
+ if !val.Field(i).Type().Implements(reflect.TypeOf((*{{.Interface}})(nil)).Elem()) {
107
+ continue
108
+ }
109
+ return helper(val.Field(i))
110
+ }
111
+ panic(fmt.Errorf("unable to convert %T to {{.Type}}", {{.ParamName}}))
112
+ }
113
+ return helper(reflect.ValueOf({{.ParamName}}))
114
+ }`
115
+
116
+ // Template data structures
117
+ type HandleHelperTemplateData struct {
118
+ Type string
119
+ Interface string
120
+ ParamName string
121
+ }
122
+
83
123
func main () {
84
124
sourceDir := flag .String ("sourceDir" , "" , "Path to the source directory for all go files" )
85
125
output := flag .String ("output" , "" , "Path to the output file (default: stdout)" )
@@ -140,6 +180,15 @@ func main() {
140
180
fmt .Fprint (writer , "\n " )
141
181
}
142
182
}
183
+
184
+ // Generate handle conversion helpers
185
+ fmt .Fprint (writer , "\n " )
186
+ handleHelpers , err := generateHandleHelpers ()
187
+ if err != nil {
188
+ fmt .Printf ("Error: %v" , err )
189
+ return
190
+ }
191
+ fmt .Fprint (writer , handleHelpers )
143
192
}
144
193
145
194
func getWriter (outputFile string ) (io.Writer , func () error , error ) {
@@ -177,6 +226,11 @@ func generateHeader() (string, error) {
177
226
"" ,
178
227
"package nvml" ,
179
228
"" ,
229
+ "import (" ,
230
+ " \" fmt\" " ,
231
+ " \" reflect\" " ,
232
+ ")" ,
233
+ "" ,
180
234
"" ,
181
235
}
182
236
return strings .Join (lines , "\n " ), nil
@@ -418,3 +472,37 @@ func isPublic(name string) bool {
418
472
}
419
473
return unicode .IsUpper ([]rune (name )[0 ])
420
474
}
475
+
476
+ func generateHandleHelpers () (string , error ) {
477
+ // Parse the template
478
+ tmpl , err := template .New ("handleHelper" ).Parse (handleHelperTemplate )
479
+ if err != nil {
480
+ return "" , fmt .Errorf ("failed to parse handle helper template: %v" , err )
481
+ }
482
+
483
+ var builder strings.Builder
484
+
485
+ // Generate helper for each type (only if Type starts with 'nvml')
486
+ for _ , p := range GeneratableInterfaces {
487
+ if ! strings .HasPrefix (p .Type , "nvml" ) {
488
+ continue
489
+ }
490
+
491
+ // Create template data
492
+ data := HandleHelperTemplateData {
493
+ Type : p .Type ,
494
+ Interface : p .Interface ,
495
+ ParamName : strings .ToLower (p .Interface [0 :1 ]) + p .Interface [1 :],
496
+ }
497
+
498
+ // Execute template
499
+ if err := tmpl .Execute (& builder , data ); err != nil {
500
+ return "" , fmt .Errorf ("failed to execute handle helper template for %s: %v" , p .Type , err )
501
+ }
502
+ builder .WriteString ("\n " )
503
+ }
504
+
505
+ return builder .String (), nil
506
+ }
507
+
508
+
0 commit comments