@@ -12,32 +12,29 @@ type Message struct {
1212 args * datatypes.List
1313}
1414
15- func New (term interface {}) (* Message , error ) {
16- var ok bool
17- var msgTuple * datatypes.Tuple
15+ func NewFromBytes (data []byte ) (* Message , error ) {
16+ t , err := datatypes .FromBytes (data )
17+ if err != nil {
18+ log .Error (err )
19+ return nil , err
20+ }
21+ return New (t )
22+ }
23+
24+ func NewFromTerm (term interface {}) (* Message , error ) {
1825 t , err := datatypes .FromTerm (term )
1926 if err != nil {
2027 log .Error (err )
2128 return nil , err
2229 }
23- log .Tracef ("Got Go/Erlang ports data: %+v" , t )
24- parts , ok := t .(* datatypes.List )
25- if ok {
26- if parts .Len () > 2 {
27- log .Error (ErrMsgListFormat )
28- return nil , ErrMsgListFormat
29- }
30- msgTuple , ok = parts .Nth (0 ).(* datatypes.Tuple )
31- if ! ok {
32- log .Error (ErrMsgTupleFormat )
33- return nil , ErrMsgTupleFormat
34- }
35- } else {
36- msgTuple , ok = t .(* datatypes.Tuple )
37- if ! ok {
38- log .Error (ErrMsgTupleFormat )
39- return nil , ErrMsgTupleFormat
40- }
30+ return New (t )
31+ }
32+
33+ func New (t interface {}) (* Message , error ) {
34+ var ok bool
35+ msgTuple , err := messageTuple (t )
36+ if err != nil {
37+ return nil , err
4138 }
4239 log .Debugf ("Got message tuple: %+v" , msgTuple )
4340 msgType , ok := msgTuple .Key ().(* datatypes.Atom )
@@ -47,28 +44,17 @@ func New(term interface{}) (*Message, error) {
4744 }
4845 log .Debugf ("Got message type %v" , msgType )
4946
50- var name * datatypes.Atom
5147 args := datatypes .NewList ([]interface {}{})
52- name , ok = msgTuple .Value ().(* datatypes.Atom )
48+ name , ok : = msgTuple .Value ().(* datatypes.Atom )
5349 if ok {
50+ // This is the case for a simple message with just a name and no args
5451 log .Debugf ("Got message name %s" , name )
5552 } else {
56- msgData , ok := msgTuple .Value ().(* datatypes.List )
57- if ! ok {
58- log .Error (ErrMsgValueFormat )
59- return nil , ErrMsgValueFormat
60- }
61- if len (msgData .Elements ()) == 0 {
62- log .Error (ErrMsgValueFormat )
63- return nil , ErrMsgValueFormat
64- }
65- name , ok = msgData .Elements ()[0 ].(* datatypes.Atom )
66- if ! ok {
67- log .Error (ErrMsgNameFormat )
68- return nil , ErrMsgNameFormat
53+ // This is the case for more highly-structured messages
54+ name , args , err = messageNameArgs (msgTuple )
55+ if err != nil {
56+ return nil , err
6957 }
70- log .Debugf ("Got message name %s" , name )
71- args = datatypes .NewList (msgData .Elements ()[1 :])
7258 }
7359 // If this is a MIDI message
7460 return & Message {
@@ -98,3 +84,57 @@ func (m *Message) Args() []interface{} {
9884}
9985
10086// Private functions
87+
88+ func messageTuple (t interface {}) (* datatypes.Tuple , error ) {
89+ var msgTuple * datatypes.Tuple
90+ log .Tracef ("Got Go/Erlang ports data: %+v" , t )
91+ parts , ok := t .(* datatypes.List )
92+ if ok {
93+ if parts .Len () > 2 {
94+ log .Error (ErrMsgListFormat )
95+ return nil , ErrMsgListFormat
96+ }
97+ msgTuple , ok = parts .Nth (0 ).(* datatypes.Tuple )
98+ if ! ok {
99+ log .Error (ErrMsgTupleFormat )
100+ return nil , ErrMsgTupleFormat
101+ }
102+ } else {
103+ msgTuple , ok = t .(* datatypes.Tuple )
104+ if ! ok {
105+ log .Error (ErrMsgTupleFormat )
106+ return nil , ErrMsgTupleFormat
107+ }
108+ }
109+ return msgTuple , nil
110+ }
111+
112+ func messageNameArgs (msgTuple * datatypes.Tuple ) (* datatypes.Atom , * datatypes.List , error ) {
113+ var msgData []interface {}
114+ var name * datatypes.Atom
115+ var ok bool
116+ msgVal := msgTuple .Value ()
117+ x , ok := msgVal .(* datatypes.List )
118+ if ok {
119+ msgData = x .Elements ()
120+ } else {
121+ x , ok := msgVal .(* datatypes.Tuple )
122+ if ! ok {
123+ log .Error (ErrMsgValueFormat )
124+ return nil , nil , ErrMsgValueFormat
125+ }
126+ msgData = x .Elements ()
127+ }
128+ if len (msgData ) == 0 {
129+ log .Error (ErrMsgValueFormat )
130+ return nil , nil , ErrMsgValueFormat
131+ }
132+ name , ok = msgData [0 ].(* datatypes.Atom )
133+ if ! ok {
134+ log .Error (ErrMsgNameFormat )
135+ return nil , nil , ErrMsgNameFormat
136+ }
137+ log .Debugf ("Got message name %s" , name )
138+ args := datatypes .NewList (msgData [1 :])
139+ return name , args , nil
140+ }
0 commit comments