forked from quickfixgo/quickfix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
session_settings.go
169 lines (137 loc) · 4.38 KB
/
session_settings.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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
// Copyright (c) quickfixengine.org All rights reserved.
//
// This file may be distributed under the terms of the quickfixengine.org
// license as defined by quickfixengine.org and appearing in the file
// LICENSE included in the packaging of this file.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
// THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE.
//
// See http://www.quickfixengine.org/LICENSE for licensing information.
//
// Contact [email protected] if any conditions of this licensing
// are not clear to you.
package quickfix
import (
"fmt"
"strconv"
"time"
)
// SessionSettings maps session settings to values with typed accessors.
type SessionSettings struct {
settings map[string][]byte
}
// ConditionallyRequiredSetting indicates a missing setting.
type ConditionallyRequiredSetting struct {
Setting string
}
func (e ConditionallyRequiredSetting) Error() string {
return fmt.Sprintf("Conditionally Required Setting: %v", e.Setting)
}
// IncorrectFormatForSetting indicates a setting that is incorrectly formatted.
type IncorrectFormatForSetting struct {
Setting string
Value []byte
Err error
}
func (e IncorrectFormatForSetting) Error() string {
return fmt.Sprintf("%q is invalid for %s", e.Value, e.Setting)
}
// Init initializes or resets SessionSettings.
func (s *SessionSettings) Init() {
s.settings = make(map[string][]byte)
}
// NewSessionSettings returns a newly initialized SessionSettings instance.
func NewSessionSettings() *SessionSettings {
s := &SessionSettings{}
s.Init()
return s
}
// SetRaw assigns a value to a setting on SessionSettings.
func (s *SessionSettings) SetRaw(setting string, val []byte) {
// Lazy init.
if s.settings == nil {
s.Init()
}
s.settings[setting] = val
}
// Set assigns a string value to a setting on SessionSettings.
func (s *SessionSettings) Set(setting string, val string) {
// Lazy init
if s.settings == nil {
s.Init()
}
s.settings[setting] = []byte(val)
}
// HasSetting returns true if a setting is set, false if not.
func (s *SessionSettings) HasSetting(setting string) bool {
_, ok := s.settings[setting]
return ok
}
// RawSetting is a settings accessor that returns the raw byte slice value of
// the setting. Returns an error if the setting is missing.
func (s *SessionSettings) RawSetting(setting string) ([]byte, error) {
val, ok := s.settings[setting]
if !ok {
return nil, ConditionallyRequiredSetting{Setting: setting}
}
return val, nil
}
// Setting is a settings string accessor. Returns an error if the setting is missing.
func (s *SessionSettings) Setting(setting string) (string, error) {
val, err := s.RawSetting(setting)
if err != nil {
return "", err
}
return string(val), nil
}
// IntSetting returns the requested setting parsed as an int. Returns an errror if the setting is not set or cannot be parsed as an int.
func (s *SessionSettings) IntSetting(setting string) (int, error) {
rawVal, err := s.RawSetting(setting)
if err != nil {
return 0, err
}
if val, err := strconv.Atoi(string(rawVal)); err == nil {
return val, nil
}
return 0, IncorrectFormatForSetting{Setting: setting, Value: rawVal, Err: err}
}
// DurationSetting returns the requested setting parsed as a time.Duration.
// Returns an error if the setting is not set or cannot be parsed as a time.Duration.
func (s *SessionSettings) DurationSetting(setting string) (time.Duration, error) {
rawVal, err := s.RawSetting(setting)
if err != nil {
return 0, err
}
if val, err := time.ParseDuration(string(rawVal)); err == nil {
return val, nil
}
return 0, IncorrectFormatForSetting{Setting: setting, Value: rawVal, Err: err}
}
// BoolSetting returns the requested setting parsed as a boolean. Returns an error if the setting is not set or cannot be parsed as a bool.
func (s SessionSettings) BoolSetting(setting string) (bool, error) {
rawVal, err := s.RawSetting(setting)
if err != nil {
return false, err
}
switch string(rawVal) {
case "Y", "y":
return true, nil
case "N", "n":
return false, nil
}
return false, IncorrectFormatForSetting{Setting: setting, Value: rawVal}
}
func (s *SessionSettings) overlay(overlay *SessionSettings) {
for key, val := range overlay.settings {
s.settings[key] = val
}
}
func (s *SessionSettings) clone() *SessionSettings {
sClone := NewSessionSettings()
for k, v := range s.settings {
sClone.settings[k] = v
}
return sClone
}