mirror of
https://github.com/jwetzell/osc-go.git
synced 2026-09-02 12:09:04 +00:00
split message functions out to separate file
This commit is contained in:
@@ -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
|
// TestHelloName calls greetings.Hello with a name, checking
|
||||||
// for a valid return value.
|
// for a valid return value.
|
||||||
func TestOSCEncoding(t *testing.T) {
|
func TestOSCMessageEncoding(t *testing.T) {
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
description string
|
description string
|
||||||
@@ -131,7 +131,7 @@ func TestOSCEncoding(t *testing.T) {
|
|||||||
|
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
|
|
||||||
actual := ToBytes(testCase.message)
|
actual := MessageToBytes(testCase.message)
|
||||||
|
|
||||||
if !reflect.DeepEqual(actual, testCase.expected) {
|
if !reflect.DeepEqual(actual, testCase.expected) {
|
||||||
t.Errorf("Test '%s' failed to encode properly", testCase.description)
|
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 {
|
testCases := []struct {
|
||||||
description string
|
description string
|
||||||
bytes []byte
|
bytes []byte
|
||||||
@@ -265,7 +265,7 @@ func TestOSCDecoding(t *testing.T) {
|
|||||||
|
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
|
|
||||||
actual, error := FromBytes(testCase.bytes)
|
actual, error := MessageFromBytes(testCase.bytes)
|
||||||
|
|
||||||
if error != nil {
|
if error != nil {
|
||||||
fmt.Println(error)
|
fmt.Println(error)
|
||||||
@@ -164,26 +164,6 @@ func argsToBuffer(args []OSCArg) []byte {
|
|||||||
return argBuffers
|
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) {
|
func readOSCString(bytes []byte) (string, []byte) {
|
||||||
//TODO(jwetzell): add error handling
|
//TODO(jwetzell): add error handling
|
||||||
oscString := ""
|
oscString := ""
|
||||||
@@ -350,32 +330,3 @@ func readOSCArg(bytes []byte, oscType string) (OSCArg, []byte, error) {
|
|||||||
}
|
}
|
||||||
return oscArg, remainingBytes, readArgError
|
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
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user