iris/mvc/activator/model_control.go

64 lines
1.4 KiB
Go
Raw Normal View History

package activator
import (
"reflect"
"github.com/kataras/iris/context"
)
type modelControl struct {
fields []field
}
func (mc *modelControl) Load(t *TController) error {
matcher := func(f reflect.StructField) bool {
if tag, ok := f.Tag.Lookup("iris"); ok {
if tag == "model" {
return true
}
}
return false
}
fields := lookupFields(t.Type.Elem(), matcher, nil)
if len(fields) == 0 {
// first is the `Controller` so we need to
// check the second and after that.
return ErrControlSkip
}
mc.fields = fields
return nil
}
func (mc *modelControl) Handle(ctx context.Context, c reflect.Value, methodFunc func()) {
elem := c.Elem() // controller should always be a pointer at this state
for _, f := range mc.fields {
index := f.getIndex()
typ := f.getType()
name := f.getTagName()
elemField := elem.FieldByIndex(index)
// check if current controller's element field
// is valid, is not nil and it's type is the same (should be but make that check to be sure).
if !elemField.IsValid() ||
(elemField.Kind() == reflect.Ptr && elemField.IsNil()) ||
elemField.Type() != typ {
continue
}
fieldValue := elemField.Interface()
ctx.ViewData(name, fieldValue)
}
}
// ModelControl returns a TControl which is responsible
// to load and handle the `Model(s)` inside a controller struct
// via the `iris:"model"` tag field.
func ModelControl() TControl {
return &modelControl{}
}