Add the ability to execute struct field functions
This commit is contained in:
		| @@ -10,7 +10,7 @@ type Namespace struct { | |||||||
| 	tags  map[string]Tag | 	tags  map[string]Tag | ||||||
|  |  | ||||||
| 	// WhitespaceMutations enables postprocessing to remove whitespace where it isn't needed | 	// WhitespaceMutations enables postprocessing to remove whitespace where it isn't needed | ||||||
| 	// to make the resulting document look better. Postprocessing is only done oncewhen the | 	// to make the resulting document look better. Postprocessing is only done once when the | ||||||
| 	// template is parsed, so it will not affect performance. (default: true) | 	// template is parsed, so it will not affect performance. (default: true) | ||||||
| 	WhitespaceMutations bool | 	WhitespaceMutations bool | ||||||
| 	escapeHTML          *bool | 	escapeHTML          *bool | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								salix.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								salix.go
									
									
									
									
									
								
							| @@ -438,11 +438,18 @@ func (t *Template) execMethodCall(mc ast.MethodCall, local map[string]any) (any, | |||||||
| 	for rval.Kind() == reflect.Pointer { | 	for rval.Kind() == reflect.Pointer { | ||||||
| 		rval = rval.Elem() | 		rval = rval.Elem() | ||||||
| 	} | 	} | ||||||
|  | 	// First, check for a method with the given name | ||||||
| 	mtd := rval.MethodByName(mc.Name.Value) | 	mtd := rval.MethodByName(mc.Name.Value) | ||||||
| 	if !mtd.IsValid() { | 	if mtd.IsValid() { | ||||||
| 		return nil, ast.PosError(mc, "no such method: %s", mc.Name.Value) | 		return t.execFunc(mtd, mc, mc.Params, local) | ||||||
| 	} | 	} | ||||||
| 	return t.execFunc(mtd, mc, mc.Params, local) | 	// If the method doesn't exist, also check for a field storing a function. | ||||||
|  | 	field := rval.FieldByName(mc.Name.Value) | ||||||
|  | 	if field.IsValid() && field.Kind() == reflect.Func { | ||||||
|  | 		return t.execFunc(field, mc, mc.Params, local) | ||||||
|  | 	} | ||||||
|  | 	// If neither of those exist, return an error | ||||||
|  | 	return nil, ast.PosError(mc, "no such method: %s", mc.Name.Value) | ||||||
| } | } | ||||||
|  |  | ||||||
| // execFunc executes a function call | // execFunc executes a function call | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user