diff --git a/pongo2_issues_test.go b/pongo2_issues_test.go index 526cff8..b30b963 100644 --- a/pongo2_issues_test.go +++ b/pongo2_issues_test.go @@ -43,3 +43,53 @@ func TestIssue297(t *testing.T) { t.Fatalf("Expected `Testing: one two three four\nfive six!`, but got `%v`.", str) } } + +type StructWithoutTag struct { + Name string + Age int +} + +type StructWithTag struct { + Name string `pongo2:"my_name"` + Age int `pongo2:"my_age"` +} + +func TestIssue319StrutWithTag(t *testing.T) { + s := StructWithTag{ + Name: "Andy Dufresne", + Age: 23, + } + ctx := pongo2.Context{ + "mystruct": s, + } + template := `My name is {{ mystruct.my_name }}, age is {{ mystruct.my_age }}` + out, err := pongo2.FromString(template) + if err != nil { + t.Error(err) + } + execute, err := out.Execute(ctx) + if err != nil { + t.Error(err) + } + mustEqual(t, execute, "My name is Andy Dufresne, age is 23") +} + +func TestIssue319StrutWithoutTag(t *testing.T) { + s := StructWithoutTag{ + Name: "Andy Dufresne", + Age: 23, + } + ctx := pongo2.Context{ + "mystruct": s, + } + template := `My name is {{ mystruct.Name }}, age is {{ mystruct.Age }}` + out, err := pongo2.FromString(template) + if err != nil { + t.Error(err) + } + execute, err := out.Execute(ctx) + if err != nil { + t.Error(err) + } + mustEqual(t, execute, "My name is Andy Dufresne, age is 23") +} diff --git a/variable.go b/variable.go index 96e047e..b847828 100644 --- a/variable.go +++ b/variable.go @@ -324,7 +324,24 @@ func (vr *variableResolver) resolve(ctx *ExecutionContext) (*Value, error) { // Calling a field or key switch current.Kind() { case reflect.Struct: - current = current.FieldByName(part.s) + //save tag and field name into map + tagMap := make(map[string]string) + //get all tags of current struct + fields := current.NumField() + for i := 0; i < fields; i++ { + field := current.Type().Field(i) + tagMap[field.Tag.Get("pongo2")] = field.Name + } + //get all tags of current field + field := current.FieldByName(part.s) + if !field.IsValid() { + //if field is not valid, try to get field by tag + if tagMap[part.s] != "" { + current = current.FieldByName(tagMap[part.s]) + } + } else { + current = field + } case reflect.Map: current = current.MapIndex(reflect.ValueOf(part.s)) default: