split message functions out to separate file

This commit is contained in:
2024-12-15 23:27:45 -06:00
parent 3e1449f374
commit 757eb8f4c1
3 changed files with 62 additions and 53 deletions
+58
View File
@@ -0,0 +1,58 @@
package osc
import (
"errors"
"strings"
)
func MessageToBytes(message OSCMessage) []byte {
//TODO(jwetzell): add error handling
oscBuffer := []byte{}
oscBuffer = append(oscBuffer, stringToOSCBytes(message.Address)...)
var sb strings.Builder
sb.WriteString(",")
for _, arg := range message.Args {
sb.WriteString(arg.Type)
}
oscBuffer = append(oscBuffer, stringToOSCBytes(sb.String())...)
oscBuffer = append(oscBuffer, argsToBuffer(message.Args)...)
return oscBuffer
}
func MessageFromBytes(bytes []byte) (OSCMessage, error) {
address, typeAndArgBytes := readOSCString(bytes)
if address[0] != 47 {
return OSCMessage{}, errors.New("OSC Message address must start with /")
}
oscMessage := OSCMessage{
Address: address,
Args: []OSCArg{},
}
typeString, argBytes := readOSCString(typeAndArgBytes)
for index, oscType := range typeString {
if index == 0 {
if oscType != ',' {
return OSCMessage{}, errors.New("type string is malformed")
}
} else {
oscArg, remainingBytes, error := readOSCArg(argBytes, string(oscType))
if error != nil {
return oscMessage, error
}
argBytes = remainingBytes
oscMessage.Args = append(oscMessage.Args, oscArg)
}
}
return oscMessage, nil
}
@@ -9,7 +9,7 @@ import (
// TestHelloName calls greetings.Hello with a name, checking
// for a valid return value.
func TestOSCEncoding(t *testing.T) {
func TestOSCMessageEncoding(t *testing.T) {
testCases := []struct {
description string
@@ -131,7 +131,7 @@ func TestOSCEncoding(t *testing.T) {
for _, testCase := range testCases {
actual := ToBytes(testCase.message)
actual := MessageToBytes(testCase.message)
if !reflect.DeepEqual(actual, testCase.expected) {
t.Errorf("Test '%s' failed to encode properly", testCase.description)
@@ -142,7 +142,7 @@ func TestOSCEncoding(t *testing.T) {
}
func TestOSCDecoding(t *testing.T) {
func TestOSCMessageDecoding(t *testing.T) {
testCases := []struct {
description string
bytes []byte
@@ -265,7 +265,7 @@ func TestOSCDecoding(t *testing.T) {
for _, testCase := range testCases {
actual, error := FromBytes(testCase.bytes)
actual, error := MessageFromBytes(testCase.bytes)
if error != nil {
fmt.Println(error)
-49
View File
@@ -164,26 +164,6 @@ func argsToBuffer(args []OSCArg) []byte {
return argBuffers
}
func ToBytes(message OSCMessage) []byte {
//TODO(jwetzell): add error handling
oscBuffer := []byte{}
oscBuffer = append(oscBuffer, stringToOSCBytes(message.Address)...)
var sb strings.Builder
sb.WriteString(",")
for _, arg := range message.Args {
sb.WriteString(arg.Type)
}
oscBuffer = append(oscBuffer, stringToOSCBytes(sb.String())...)
oscBuffer = append(oscBuffer, argsToBuffer(message.Args)...)
return oscBuffer
}
func readOSCString(bytes []byte) (string, []byte) {
//TODO(jwetzell): add error handling
oscString := ""
@@ -350,32 +330,3 @@ func readOSCArg(bytes []byte, oscType string) (OSCArg, []byte, error) {
}
return oscArg, remainingBytes, readArgError
}
func FromBytes(bytes []byte) (OSCMessage, error) {
//TODO(jwetzell): add Message and Bundle support
address, typeAndArgBytes := readOSCString(bytes)
oscMessage := OSCMessage{
Address: address,
Args: []OSCArg{},
}
typeString, argBytes := readOSCString(typeAndArgBytes)
for index, oscType := range typeString {
if index == 0 {
if oscType != ',' {
return OSCMessage{}, errors.New("type string is malformed")
}
} else {
oscArg, remainingBytes, error := readOSCArg(argBytes, string(oscType))
if error != nil {
return oscMessage, error
}
argBytes = remainingBytes
oscMessage.Args = append(oscMessage.Args, oscArg)
}
}
return oscMessage, nil
}