forked from ergo-services/ergo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgen_demo.go
144 lines (116 loc) · 3.81 KB
/
gen_demo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package main
import (
"fmt"
"github.com/ergo-services/ergo/etf"
"github.com/ergo-services/ergo/gen"
)
type Demo struct {
gen.Server
}
type DemoProcess struct {
gen.ServerProcess
counter int
}
// DemoBehavior interface
type DemoBehavior interface {
//
// Mandatory callbacks
//
// InitDemo
InitDemo(process *DemoProcess, args ...etf.Term) error
// HandleHello invoked on a 'hello'
HandleHello(process *DemoProcess) DemoStatus
//
// Optional callbacks
//
// HandleDemoCall this callback is invoked on ServerProcess.Call. This method is optional
// for the implementation
HandleDemoCall(process *DemoProcess, from gen.ServerFrom, message etf.Term) (etf.Term, gen.ServerStatus)
// HandleDemoDirect this callback is invoked on Process.Direct. This method is optional
// for the implementation
HandleDemoDirect(process *DemoProcess, message interface{}) (interface{}, error)
// HandleDemoCast this callback is invoked on ServerProcess.Cast. This method is optional
// for the implementation
HandleDemoCast(process *DemoProcess, message etf.Term) gen.ServerStatus
// HandleDemoInfo this callback is invoked on Process.Send. This method is optional
// for the implementation
HandleDemoInfo(process *DemoProcess, message etf.Term) gen.ServerStatus
}
type DemoStatus error
var (
DemoStatusOK DemoStatus = nil
DemoStatusStop DemoStatus = fmt.Errorf("stop")
)
// default Demo callbacks
func (gd *Demo) HandleDemoCall(process *DemoProcess, from gen.ServerFrom, message etf.Term) (etf.Term, gen.ServerStatus) {
fmt.Printf("HandleDemoCall: unhandled message (from %#v) %#v\n", from, message)
return etf.Atom("ok"), gen.ServerStatusOK
}
func (gd *Demo) HandleDemoCast(process *DemoProcess, message etf.Term) gen.ServerStatus {
fmt.Printf("HandleDemoCast: unhandled message %#v\n", message)
return gen.ServerStatusOK
}
func (gd *Demo) HandleDemoInfo(process *DemoProcess, message etf.Term) gen.ServerStatus {
fmt.Printf("HandleDemoInfo: unhandled message %#v\n", message)
return gen.ServerStatusOK
}
//
// API
//
type messageHello struct{}
func (d *Demo) Hello(process gen.Process) error {
_, err := process.Direct(messageHello{})
return err
}
type messageGetStat struct{}
func (d *Demo) Stat(process gen.Process) int {
counter, _ := process.Direct(messageGetStat{})
return counter.(int)
}
//
// Demo methods. Available to use inside actors only.
//
func (dp *DemoProcess) Hi() DemoStatus {
dp.counter = dp.counter * 2
return DemoStatusOK
}
//
// gen.Server callbacks
//
func (d *Demo) Init(process *gen.ServerProcess, args ...etf.Term) error {
demo := &DemoProcess{
ServerProcess: *process,
}
// do not inherit parent State
demo.State = nil
if err := process.Behavior().(DemoBehavior).InitDemo(demo, args...); err != nil {
return err
}
process.State = demo
return nil
}
func (gd *Demo) HandleCall(process *gen.ServerProcess, from gen.ServerFrom, message etf.Term) (etf.Term, gen.ServerStatus) {
demo := process.State.(*DemoProcess)
return process.Behavior().(DemoBehavior).HandleDemoCall(demo, from, message)
}
func (gd *Demo) HandleDirect(process *gen.ServerProcess, message interface{}) (interface{}, error) {
demo := process.State.(*DemoProcess)
switch message.(type) {
case messageGetStat:
return demo.counter, nil
case messageHello:
process.Behavior().(DemoBehavior).HandleHello(demo)
demo.counter++
return nil, nil
default:
return process.Behavior().(DemoBehavior).HandleDemoDirect(demo, message)
}
}
func (gd *Demo) HandleCast(process *gen.ServerProcess, message etf.Term) gen.ServerStatus {
demo := process.State.(*DemoProcess)
return process.Behavior().(DemoBehavior).HandleDemoCast(demo, message)
}
func (gd *Demo) HandleInfo(process *gen.ServerProcess, message etf.Term) gen.ServerStatus {
demo := process.State.(*DemoProcess)
return process.Behavior().(DemoBehavior).HandleDemoInfo(demo, message)
}