@@ -2,104 +2,17 @@ package templating
22
33import (
44 "fmt"
5- "reflect"
65 "regexp"
76
8- "github.com/jumpstarter-dev/jumpstarter-lab-config/internal/config"
97 "github.com/jumpstarter-dev/jumpstarter-lab-config/internal/vars"
108)
119
12- type TemplateApplier struct {
13- variables * vars.Variables
14- parameters * Parameters
15- }
16-
17- func NewTemplateApplier (cfg * config.Config , parameters * Parameters ) (* TemplateApplier , error ) {
18- if cfg == nil {
19- return nil , fmt .Errorf ("config cannot be nil" )
20- }
21- if cfg .Loaded == nil {
22- return nil , fmt .Errorf ("loaded config cannot be nil" )
23- }
24- return & TemplateApplier {
25- variables : cfg .Loaded .Variables ,
26- parameters : parameters ,
27- }, nil
28- }
29-
30- // ApplyTemplatesRecursively walks through all fields of the given object recursively,
31- // and applies ProcessTemplate to every string field.
32- func (t * TemplateApplier ) Apply (obj interface {}) error {
33- return t .applyTemplates (reflect .ValueOf (obj ))
34- }
35-
36- func (t * TemplateApplier ) applyTemplates (v reflect.Value ) error {
37- if ! v .IsValid () {
38- return nil
39- }
40-
41- switch v .Kind () {
42- case reflect .Ptr :
43- if v .IsNil () {
44- return nil
45- }
46- return t .applyTemplates (v .Elem ())
47- case reflect .Interface :
48- if v .IsNil () {
49- return nil
50- }
51- return t .applyTemplates (v .Elem ())
52- case reflect .Struct :
53- for i := 0 ; i < v .NumField (); i ++ {
54- // Only process exported fields
55- if v .Type ().Field (i ).PkgPath != "" {
56- continue
57- }
58- if err := t .applyTemplates (v .Field (i )); err != nil {
59- return err
60- }
61- }
62- case reflect .Slice , reflect .Array :
63- for i := 0 ; i < v .Len (); i ++ {
64- if err := t .applyTemplates (v .Index (i )); err != nil {
65- return err
66- }
67- }
68- case reflect .Map :
69- for _ , key := range v .MapKeys () {
70- val := v .MapIndex (key )
71- // For map[string]string, apply directly
72- if val .Kind () == reflect .String {
73- str , err := ProcessTemplate (val .String (), t .variables , t .parameters )
74- if err != nil {
75- return fmt .Errorf ("template error for map key %v: %w" , key , err )
76- }
77- v .SetMapIndex (key , reflect .ValueOf (str ))
78- } else {
79- // For other map value types, recurse
80- if err := t .applyTemplates (val ); err != nil {
81- return err
82- }
83- }
84- }
85- case reflect .String :
86- if v .CanSet () {
87- str , err := ProcessTemplate (v .String (), t .variables , t .parameters )
88- if err != nil {
89- return err
90- }
91- v .SetString (str )
92- }
93- }
94- return nil
95- }
96-
97- func ProcessTemplate (data string , variables * vars.Variables , parameters * Parameters ) (string , error ) {
10+ func ProcessTemplate (data string , variables * vars.Variables , parameters * Parameters , meta * Parameters ) (string , error ) {
9811 // This function would process the template using the provided variables.
9912 // For now, we will just return the template as-is for demonstration purposes.
10013 // In a real implementation, you would use a templating engine like text/template or html/template.
10114 if needsReplacements (data ) {
102- replacements , err := constructReplacementMap (variables , parameters )
15+ replacements , err := constructReplacementMap (variables , parameters , meta )
10316 if err != nil {
10417 return "" , err
10518 }
@@ -116,7 +29,7 @@ func needsReplacements(data string) bool {
11629
11730}
11831
119- func constructReplacementMap (variables * vars.Variables , parameters * Parameters ) (map [string ]string , error ) {
32+ func constructReplacementMap (variables * vars.Variables , parameters * Parameters , meta * Parameters ) (map [string ]string , error ) {
12033 replacements := make (map [string ]string )
12134
12235 // Add variables to the replacement map
@@ -133,6 +46,13 @@ func constructReplacementMap(variables *vars.Variables, parameters *Parameters)
13346 replacements ["param." + key ] = value
13447 }
13548
49+ // Add meta parameters to the replacement map
50+ if meta != nil {
51+ for key , value := range meta .parameters {
52+ replacements [key ] = value
53+ }
54+ }
55+
13656 return replacements , nil
13757}
13858
0 commit comments