Added type-specific wrappers for amf.Object.GetProperty, namely GetNumber, GetString and GetObject.

This commit is contained in:
scruzin 2019-01-12 18:43:51 +10:30
parent 5b94ddfbe9
commit 32c281d2dc
3 changed files with 58 additions and 31 deletions

View File

@ -473,19 +473,51 @@ func Decode(obj *Object, buf []byte, decodeName bool) (int, error) {
return sz - len(buf), nil
}
// GetProp returns an object's property, either by its index when idx is non-negative, or by its name otherwise.
// If the requested property is not found an ErrPropertyNotFound error is returned.
func (obj *Object) GetProp(name string, idx int) (*Property, error) {
// GetProperty returns a property, either by its index when idx is non-negative, or by its name otherwise.
// If the requested property is not found or the type does not match, an ErrPropertyNotFound error is returned.
func (obj *Object) GetProperty(name string, idx int, typ uint8) (*Property, error) {
var prop *Property
if idx >= 0 {
if idx < len(obj.Properties) {
return &obj.Properties[idx], nil
prop = &obj.Properties[idx]
}
} else {
for i, p := range obj.Properties {
if p.Name == name {
return &obj.Properties[i], nil
prop = &obj.Properties[i]
break
}
}
}
return nil, ErrPropertyNotFound
if prop == nil || prop.Type != typ {
return nil, ErrPropertyNotFound
}
return prop, nil
}
// GetNumber is a wrapper for GetProperty that returns a Number property's value, if any.
func (obj *Object) GetNumber(name string, idx int) (float64, error) {
prop, err := obj.GetProperty(name, idx, typeNumber)
if err != nil {
return 0, err
}
return prop.Number, nil
}
// GetString is a wrapper for GetProperty that returns a String property's value, if any.
func (obj *Object) GetString(name string, idx int) (string, error) {
prop, err := obj.GetProperty(name, idx, typeString)
if err != nil {
return "", err
}
return prop.String, nil
}
// GetObject is a wrapper for GetProperty that returns an Object property's value, if any.
func (obj *Object) GetObject(name string, idx int) (*Object, error) {
prop, err := obj.GetProperty(name, idx, TypeObject)
if err != nil {
return nil, err
}
return &prop.Object, nil
}

View File

@ -232,32 +232,32 @@ func TestObject(t *testing.T) {
}
// Find some properties that exist.
prop, err := obj2.GetProp("", 2)
prop, err := obj2.GetProperty("", 2, typeString)
if err != nil {
t.Errorf("GetProp(2) failed")
t.Errorf("GetProperty(2) failed")
}
if prop.String != "foo" {
t.Errorf("GetProp(2) returned wrong Property")
t.Errorf("GetProperty(2) returned wrong Property")
}
prop, err = obj2.GetProp("", 3)
prop, err = obj2.GetProperty("", 3, typeNumber)
if err != nil {
t.Errorf("GetProp(1) failed")
t.Errorf("GetProperty(1) failed")
}
if prop.Number != 1 {
t.Errorf("GetProp(1) returned wrong Property")
t.Errorf("GetProperty(1) returned wrong Property")
}
prop, err = obj2.GetProp("", 9)
prop, err = obj2.GetProperty("", 9, typeBoolean)
if err != nil {
t.Errorf("GetProp(9) failed")
t.Errorf("GetProperty(9) failed")
return
}
if prop.Type != typeBoolean && prop.Number != 1 {
t.Errorf("GetProp(9) returned wrong Property")
if prop.Number != 1 {
t.Errorf("GetProperty(9) returned wrong Property")
}
// Try to find one that doesn't exist.
prop, err = obj2.GetProp("", 10)
prop, err = obj2.GetProperty("", 10, TypeObject)
if err != ErrPropertyNotFound {
t.Errorf("GetProp(10) failed")
t.Errorf("GetProperty(10) failed")
}
}

View File

@ -686,16 +686,14 @@ func handleInvoke(s *Session, body []byte) error {
return err
}
prop, err := obj.GetProp("", 0)
meth, err := obj.GetString("", 0)
if err != nil {
return err
}
meth := prop.String
prop, err = obj.GetProp("", 1)
txn, err := obj.GetNumber("", 1)
if err != nil {
return err
}
txn := prop.Number
s.log(DebugLevel, pkg+"invoking method "+meth)
switch meth {
@ -736,15 +734,15 @@ func handleInvoke(s *Session, body []byte) error {
}
case avCreatestream:
prop, err = obj.GetProp("", 3)
n, err := obj.GetNumber("", 3)
if err != nil {
return err
}
s.streamID = int32(prop.Number)
s.streamID = int32(n)
if s.link.protocol&featureWrite == 0 {
return errNotWritable
}
err := sendPublish(s)
err = sendPublish(s)
if err != nil {
return err
}
@ -777,21 +775,18 @@ func handleInvoke(s *Session, body []byte) error {
s.log(FatalLevel, pkg+"unsupported method avClose")
case avOnStatus:
prop, err = obj.GetProp("", 3)
obj2, err := obj.GetObject("", 3)
if err != nil {
return err
}
obj2 := prop.Object
prop, err = obj2.GetProp(avCode, -1)
code, err := obj2.GetString(avCode, -1)
if err != nil {
return err
}
code := prop.String
prop, err = obj2.GetProp(avLevel, -1)
level, err := obj2.GetString(avLevel, -1)
if err != nil {
return err
}
level := prop.String
s.log(DebugLevel, pkg+"onStatus", "code", code, "level", level)
switch code {