Skip to content

Commit c13b182

Browse files
committed
Setup lazy expanderfunc to avoid projectfile set callback
1 parent 09269dd commit c13b182

File tree

3 files changed

+20
-59
lines changed

3 files changed

+20
-59
lines changed

pkg/project/expander.go

+16
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,22 @@ func makeEntryMapMap(structure reflect.Value) map[string]map[string]entry {
291291
return m
292292
}
293293

294+
func makeLazyExpanderFuncFromPtrToStruct(val reflect.Value) ExpanderFunc {
295+
return func(v, name, meta string, isFunc bool, ctx *Expansion) (string, error) {
296+
iface := val.Interface()
297+
if u, ok := iface.(interface{ Update(*Project) }); ok {
298+
u.Update(ctx.Project)
299+
}
300+
301+
if val.Kind() == reflect.Ptr {
302+
val = val.Elem()
303+
}
304+
fn := makeExpanderFuncFromMap(makeEntryMapMap(val))
305+
306+
return fn(v, name, meta, isFunc, ctx)
307+
}
308+
}
309+
294310
func makeExpanderFuncFromMap(m map[string]map[string]entry) ExpanderFunc {
295311
return func(v, name, meta string, isFunc bool, ctx *Expansion) (string, error) {
296312
if isFunc && meta == "()" {

pkg/project/project.go

-7
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,6 @@ func (p *Project) SetCommit(commitID string) error {
5858
return p.Source().SetCommit(commitID, p.IsHeadless())
5959
}
6060

61-
func (p *Project) SetUpdateCallback(fn func()) {
62-
if p.projectfile == nil {
63-
return
64-
}
65-
p.projectfile.SetUpdateCallback(fn)
66-
}
67-
6861
// Constants returns a reference to projectfile.Constants
6962
func (p *Project) Constants() []*Constant {
7063
constrained, err := constraints.FilterUnconstrained(pConditional, p.projectfile.Constants.AsConstrainedEntities())

pkg/project/registry.go

+4-52
Original file line numberDiff line numberDiff line change
@@ -31,55 +31,7 @@ func init() {
3131
}
3232
}
3333

34-
func RegisterTopLevelStruct(name string, val interface{}) error {
35-
v := reflect.ValueOf(val)
36-
if v.Kind() == reflect.Ptr {
37-
v = v.Elem()
38-
}
39-
40-
m := makeEntryMapMap(v)
41-
name = strings.ToLower(name)
42-
err := RegisterExpander(name, makeExpanderFuncFromMap(m))
43-
if err != nil {
44-
return locale.WrapError(
45-
err, "project_expand_register_expander_map",
46-
"Cannot register expander (map)",
47-
)
48-
}
49-
50-
return nil
51-
}
52-
53-
func RegisterTopLevelFunc(name string, val interface{}) error {
54-
v := reflect.ValueOf(val)
55-
if v.Kind() == reflect.Ptr {
56-
v = v.Elem()
57-
}
58-
59-
name = strings.ToLower(name)
60-
err := RegisterExpander(name, makeExpanderFuncFromFunc(v))
61-
if err != nil {
62-
return locale.WrapError(
63-
err, "project_expand_register_expander_func",
64-
"Cannot register expander (func)",
65-
)
66-
}
67-
68-
return nil
69-
}
70-
71-
func RegisterTopLevelStringer(name string, val interface{}) error {
72-
v := reflect.ValueOf(val)
73-
if v.Kind() == reflect.Ptr {
74-
v = v.Elem()
75-
}
76-
77-
topLevelLookup[strings.ToLower(name)] = fmt.Sprintf("%v", v.Interface())
78-
79-
return nil
80-
}
81-
82-
/*func RegisterStruct(val interface{}) error {
34+
func RegisterStruct(val interface{}) error {
8335
v := reflect.ValueOf(val)
8436
// deref if needed
8537
if v.Kind() == reflect.Ptr {
@@ -95,6 +47,7 @@ func RegisterTopLevelStringer(name string, val interface{}) error {
9547
}
9648

9749
d1Val := v.FieldByIndex(f.Index)
50+
d1ValOrig := d1Val
9851
if d1Val.Kind() == reflect.Ptr {
9952
d1Val = d1Val.Elem()
10053
}
@@ -105,9 +58,8 @@ func RegisterTopLevelStringer(name string, val interface{}) error {
10558
switch d1Val.Type().Kind() {
10659
// Convert type (to map-map) to express advanced control like tag handling.
10760
case reflect.Struct:
108-
m := makeEntryMapMap(d1Val)
10961
name := strings.ToLower(f.Name)
110-
err := RegisterExpander(name, makeExpanderFuncFromMap(m))
62+
err := RegisterExpander(name, makeLazyExpanderFuncFromPtrToStruct(d1ValOrig))
11163
if err != nil {
11264
return locale.WrapError(
11365
err, "project_expand_register_expander_map",
@@ -133,7 +85,7 @@ func RegisterTopLevelStringer(name string, val interface{}) error {
13385
}
13486

13587
return nil
136-
}*/
88+
}
13789

13890
// RegisterExpander registers an Expander Func for some given handler value. The handler value
13991
// must not effectively be a blank string and the Func must be defined. It is definitely possible

0 commit comments

Comments
 (0)