iris/mvc2/service.go

93 lines
2.2 KiB
Go

package mvc2
import (
"reflect"
)
// // Service is a `reflect.Value` value.
// // We keep that type here,
// // if we ever need to change this type we will not have
// // to refactor the whole mvc's codebase.
// type Service struct {
// reflect.Value
// typ reflect.Type
// }
// // Valid checks if the service's Value's Value is valid for set or get.
// func (s Service) Valid() bool {
// return goodVal(s.Value)
// }
// // Equal returns if the
// func (s Service) Equal(other Service) bool {
// return equalTypes(s.typ, other.typ)
// }
// func (s Service) String() string {
// return s.Type().String()
// }
// func wrapService(service interface{}) Service {
// if s, ok := service.(Service); ok {
// return s // if it's a Service already.
// }
// return Service{
// Value: reflect.ValueOf(service),
// typ: reflect.TypeOf(service),
// }
// }
// // WrapServices wrap a generic services into structured Service slice.
// func WrapServices(services ...interface{}) []Service {
// if l := len(services); l > 0 {
// out := make([]Service, l, l)
// for i, s := range services {
// out[i] = wrapService(s)
// }
// return out
// }
// return nil
// }
// MustMakeServiceInputBinder calls the `MakeServiceInputBinder` and returns its first result, see its docs.
// It panics on error.
func MustMakeServiceInputBinder(service interface{}) *InputBinder {
s, err := MakeServiceInputBinder(service)
if err != nil {
panic(err)
}
return s
}
// MakeServiceInputBinder uses a difference/or strange approach,
// we make the services as bind functions
// in order to keep the rest of the code simpler, however we have
// a performance penalty when calling the function instead
// of just put the responsible service to the certain handler's input argument.
func MakeServiceInputBinder(service interface{}) (*InputBinder, error) {
if service == nil {
return nil, errNil
}
var (
val = reflect.ValueOf(service)
typ = val.Type()
)
if !goodVal(val) {
return nil, errBad
}
if indirectTyp(typ).Kind() != reflect.Struct {
// if the pointer's struct is not a struct then return err bad.
return nil, errBad
}
return &InputBinder{
BindType: typ,
BindFunc: func(_ []reflect.Value) reflect.Value {
return val
},
}, nil
}