func()

in internal/kernel/callbacks.go [78:121]


func (g *getCallback) handle(cookie string) (retval reflect.Value, err error) {
	client := GetClient()

	receiver := reflect.ValueOf(client.GetObject(g.ObjRef))

	if strings.HasPrefix(cookie, ".") {
		// Ready to catch an error if the access panics...
		defer func() {
			if r := recover(); r != nil {
				if err == nil {
					var ok bool
					if err, ok = r.(error); !ok {
						err = fmt.Errorf("%v", r)
					}
				} else {
					// This is not expected - so we panic!
					panic(r)
				}
			}
		}()

		// Need to access the underlying struct...
		receiver = receiver.Elem()
		retval = receiver.FieldByName(cookie[1:])

		if retval.IsZero() {
			// Omit zero-values if a json tag instructs so...
			field, _ := receiver.Type().FieldByName(cookie[1:])
			if tag := field.Tag.Get("json"); tag != "" {
				for _, attr := range strings.Split(tag, ",")[1:] {
					if attr == "omitempty" {
						retval = reflect.ValueOf(nil)
						break
					}
				}
			}
		}

		return
	} else {
		method := receiver.MethodByName(cookie)
		return client.invoke(method, nil)
	}
}