func NewHttpHandler()

in fc/http_handler.go [74:113]


func NewHttpHandler(handlerFunc interface{}) HttpHandler {
	if handlerFunc == nil {
		return errorHttpHandler(fmt.Errorf("handler is nil"))
	}
	handler := reflect.ValueOf(handlerFunc)
	handlerType := reflect.TypeOf(handlerFunc)
	if handlerType.Kind() != reflect.Func {
		return errorHttpHandler(fmt.Errorf("handler kind %s is not %s", handlerType.Kind(), reflect.Func))
	}

	err := validateHttpArguments(handlerType)
	if err != nil {
		return errorHttpHandler(err)
	}

	if err := validateHttpReturns(handlerType); err != nil {
		return errorHttpHandler(err)
	}

	return fcHttpHandler(func(ctx context.Context, rsp http.ResponseWriter, req *http.Request) error {
		// construct arguments
		args := []reflect.Value{
			reflect.ValueOf(ctx),
			reflect.ValueOf(rsp),
			reflect.ValueOf(req),
		}

		response := handler.Call(args)

		// convert return values into ( error)
		var err error
		if len(response) > 0 {
			if errVal, ok := response[len(response)-1].Interface().(error); ok {
				err = errVal
			}
		}

		return err
	})
}