This repository has been archived by the owner on Oct 24, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
order_registry.go
79 lines (65 loc) · 1.49 KB
/
order_registry.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
package dola
import (
"log"
"sync"
"sync/atomic"
"github.com/thrasher-corp/gocryptotrader/exchanges/order"
)
type OrderKey struct {
ExchangeName string
OrderID string
}
type OrderValue struct {
SubmitResponse order.SubmitResponse
UserData interface{}
}
type OrderRegistry struct {
length int32
values sync.Map
}
func NewOrderRegistry() *OrderRegistry {
return &OrderRegistry{
length: 0,
values: sync.Map{},
}
}
// Store saves order details. If such an order exists
// (matched by exchange name and order ID), false is returned.
func (r *OrderRegistry) Store(exchangeName string, response order.SubmitResponse, userData interface{}) bool {
key := OrderKey{
ExchangeName: exchangeName,
OrderID: response.OrderID,
}
value := OrderValue{
SubmitResponse: response,
UserData: userData,
}
_, loaded := r.values.LoadOrStore(key, value)
if !loaded {
// If not loaded, then it's stored, so length++.
atomic.AddInt32(&r.length, 1)
}
return !loaded
}
func (r *OrderRegistry) GetOrderValue(exchangeName, orderID string) (OrderValue, bool) {
key := OrderKey{
ExchangeName: exchangeName,
OrderID: orderID,
}
var (
loaded bool
ok bool
pointer interface{}
value OrderValue
)
if pointer, loaded = r.values.Load(key); loaded {
value, ok = pointer.(OrderValue)
if !ok {
log.Fatalf("have %T, want OrderValue", pointer)
}
}
return value, loaded
}
func (r *OrderRegistry) Length() int {
return int(atomic.LoadInt32(&r.length))
}