Skip to content

Commit 54517be

Browse files
committed
add MessageHandler interface
1 parent 876161d commit 54517be

File tree

4 files changed

+45
-35
lines changed

4 files changed

+45
-35
lines changed

dispatcher.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,18 @@ var (
1515
// Method is an OSC method
1616
type Method func(msg Message) error
1717

18+
// Handle handles an OSC message.
19+
func (method Method) Handle(m Message) error {
20+
return method(m)
21+
}
22+
23+
// MessageHandler is any type that can handle an OSC message.
24+
type MessageHandler interface {
25+
Handle(Message) error
26+
}
27+
1828
// Dispatcher dispatches OSC packets.
19-
type Dispatcher map[string]Method
29+
type Dispatcher map[string]MessageHandler
2030

2131
// Dispatch invokes an OSC bundle's messages.
2232
func (d Dispatcher) Dispatch(b Bundle) error {
@@ -60,13 +70,13 @@ func (d Dispatcher) invoke(p Packet) error {
6070

6171
// Invoke invokes an OSC message.
6272
func (d Dispatcher) Invoke(msg Message) error {
63-
for address, method := range d {
73+
for address, handler := range d {
6474
matched, err := msg.Match(address)
6575
if err != nil {
6676
return err
6777
}
6878
if matched {
69-
return method(msg)
79+
return handler.Handle(msg)
7080
}
7181
}
7282
return nil

dispatcher_test.go

+12-12
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import (
1111
func TestDispatcherDispatchOK(t *testing.T) {
1212
c := make(chan struct{})
1313
d := Dispatcher{
14-
"/bar": func(msg Message) error {
14+
"/bar": Method(func(msg Message) error {
1515
close(c)
1616
return nil
17-
},
17+
}),
1818
}
1919
later := time.Now().Add(20 * time.Millisecond)
2020
b := Bundle{
@@ -32,9 +32,9 @@ func TestDispatcherDispatchOK(t *testing.T) {
3232
// Test a method that returns an error.
3333
func TestDispatcherDispatchError(t *testing.T) {
3434
d := Dispatcher{
35-
"/foo": func(msg Message) error {
35+
"/foo": Method(func(msg Message) error {
3636
return errors.New("oops")
37-
},
37+
}),
3838
}
3939
later := time.Now().Add(20 * time.Millisecond)
4040
b := Bundle{
@@ -51,10 +51,10 @@ func TestDispatcherDispatchError(t *testing.T) {
5151
func TestDispatcherDispatchNestedBundle(t *testing.T) {
5252
c := make(chan struct{})
5353
d := Dispatcher{
54-
"/foo": func(msg Message) error {
54+
"/foo": Method(func(msg Message) error {
5555
close(c)
5656
return nil
57-
},
57+
}),
5858
}
5959
later := time.Now().Add(20 * time.Millisecond)
6060
b := Bundle{
@@ -76,9 +76,9 @@ func TestDispatcherDispatchNestedBundle(t *testing.T) {
7676

7777
func TestDispatcherMiss(t *testing.T) {
7878
d := Dispatcher{
79-
"/foo": func(msg Message) error {
79+
"/foo": Method(func(msg Message) error {
8080
return nil
81-
},
81+
}),
8282
}
8383
b := Bundle{
8484
Timetag: FromTime(time.Now()),
@@ -90,12 +90,12 @@ func TestDispatcherMiss(t *testing.T) {
9090

9191
func TestDispatcherInvoke(t *testing.T) {
9292
d := Dispatcher{
93-
"/foo": func(msg Message) error {
93+
"/foo": Method(func(msg Message) error {
9494
return errors.New("foo error")
95-
},
96-
"/bar": func(msg Message) error {
95+
}),
96+
"/bar": Method(func(msg Message) error {
9797
return nil
98-
},
98+
}),
9999
}
100100
msg := Message{Address: "/foo"}
101101
if err := d.Invoke(msg); err == nil {

udp_example_test.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -67,33 +67,33 @@ func ExampleUDPConn_pingpong() {
6767

6868
func serverDispatch(server *UDPConn, errChan chan error) {
6969
errChan <- server.Serve(Dispatcher{
70-
"/ping": func(msg Message) error {
70+
"/ping": Method(func(msg Message) error {
7171
fmt.Println("Server received ping.")
7272
return server.SendTo(msg.Sender, Message{Address: "/pong"})
73-
},
74-
"/close": func(msg Message) error {
73+
}),
74+
"/close": Method(func(msg Message) error {
7575
if err := server.SendTo(msg.Sender, Message{Address: "/close"}); err != nil {
7676
_ = server.Close()
7777
return err
7878
}
7979
fmt.Println("Server closing.")
8080
return server.Close()
81-
},
81+
}),
8282
})
8383
}
8484

8585
func clientDispatch(client *UDPConn, errChan chan error, pongChan chan struct{}, closeChan chan struct{}) {
8686
errChan <- client.Serve(Dispatcher{
87-
"/pong": func(msg Message) error {
87+
"/pong": Method(func(msg Message) error {
8888
fmt.Println("Client received pong.")
8989
close(pongChan)
9090
return nil
91-
},
92-
"/close": func(msg Message) error {
91+
}),
92+
"/close": Method(func(msg Message) error {
9393
fmt.Println("Client closing.")
9494
close(closeChan)
9595
return client.Close()
96-
},
96+
}),
9797
})
9898
}
9999

udp_test.go

+12-12
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ func TestInvalidAddress(t *testing.T) {
2121
}
2222
defer func() { _ = server.Close() }() // Best effort.
2323

24-
if err := server.Serve(map[string]Method{
25-
"/[": func(msg Message) error {
24+
if err := server.Serve(Dispatcher{
25+
"/[": Method(func(msg Message) error {
2626
return nil
27-
},
27+
}),
2828
}); err != ErrInvalidAddress {
2929
t.Fatal("expected invalid address error")
3030
}
@@ -95,9 +95,9 @@ func testUDPServer(t *testing.T, dispatcher Dispatcher) (*UDPConn, *UDPConn, cha
9595
if dispatcher == nil {
9696
dispatcher = Dispatcher{}
9797
}
98-
dispatcher["/server/close"] = func(msg Message) error {
98+
dispatcher["/server/close"] = Method(func(msg Message) error {
9999
return server.Close()
100-
}
100+
})
101101
errChan := make(chan error)
102102

103103
go func() {
@@ -180,10 +180,10 @@ func TestUDPConnServe_ReadError(t *testing.T) {
180180
ctx: context.Background(),
181181
}
182182
go func() {
183-
errChan <- server.Serve(map[string]Method{
184-
"/close": func(msg Message) error {
183+
errChan <- server.Serve(Dispatcher{
184+
"/close": Method(func(msg Message) error {
185185
return server.Close()
186-
},
186+
}),
187187
})
188188
}()
189189

@@ -227,9 +227,9 @@ func TestUDPConnServe_BadInboundAddr(t *testing.T) {
227227
} {
228228
// Send a message with a bad address.
229229
_, conn, errChan := testUDPServer(t, Dispatcher{
230-
"/foo": func(msg Message) error {
230+
"/foo": Method(func(msg Message) error {
231231
return nil
232-
},
232+
}),
233233
})
234234
if err := conn.Send(packet); err != nil {
235235
t.Fatal(err)
@@ -297,9 +297,9 @@ func TestUDPConnSendBundle_DispatchError(t *testing.T) {
297297
},
298298
}
299299
_, conn, errChan := testUDPServer(t, Dispatcher{
300-
"/foo": func(msg Message) error {
300+
"/foo": Method(func(msg Message) error {
301301
return errors.New("oops")
302-
},
302+
}),
303303
})
304304
if err := conn.Send(b); err != nil {
305305
t.Fatal(err)

0 commit comments

Comments
 (0)