Skip to content

Commit 5eef164

Browse files
author
Chris Busbey
committed
simplifies settings error handling
1 parent b3e1ec2 commit 5eef164

File tree

6 files changed

+69
-60
lines changed

6 files changed

+69
-60
lines changed

errors.go

-5
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,3 @@ func compIDProblem() MessageRejectError {
145145
func sendingTimeAccuracyProblem() MessageRejectError {
146146
return NewMessageRejectError("SendingTime accuracy problem", rejectReasonSendingTimeAccuracyProblem, nil)
147147
}
148-
149-
//requiredConfigurationMissing indicates a missing required conditional configuration option.
150-
func requiredConfigurationMissing(setting string) error {
151-
return fmt.Errorf("missing configuration: %v", setting)
152-
}

file_log.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ func NewFileLogFactory(settings *Settings) (LogFactory, error) {
4242

4343
var err error
4444
if logFactory.globalLogPath, err = settings.GlobalSettings().Setting(config.FileLogPath); err != nil {
45-
return logFactory, requiredConfigurationMissing(config.FileLogPath)
45+
return logFactory, err
4646
}
4747

4848
logFactory.sessionLogPaths = make(map[SessionID]string)
4949

5050
for sid, sessionSettings := range settings.SessionSettings() {
5151
logPath, err := sessionSettings.Setting(config.FileLogPath)
5252
if err != nil {
53-
return logFactory, requiredConfigurationMissing(config.FileLogPath)
53+
return logFactory, err
5454
}
5555
logFactory.sessionLogPaths[sid] = logPath
5656
}

filestore.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func (f fileStoreFactory) Create(sessionID SessionID) (msgStore MessageStore, er
4949
}
5050
dirname, err := sessionSettings.Setting(config.FileStorePath)
5151
if err != nil {
52-
return nil, requiredConfigurationMissing(config.FileStorePath)
52+
return nil, err
5353
}
5454
return newFileStore(sessionID, dirname)
5555
}

initiator.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,16 @@ func NewInitiator(app Application, storeFactory MessageStoreFactory, appSettings
9191
for sessionID, s := range i.sessionSettings {
9292

9393
//fail fast
94-
if ok := s.HasSetting(config.SocketConnectHost); !ok {
95-
return nil, requiredConfigurationMissing(config.SocketConnectHost)
94+
if _, err := s.Setting(config.SocketConnectHost); err != nil {
95+
return nil, err
9696
}
9797

98-
if ok := s.HasSetting(config.SocketConnectPort); !ok {
99-
return nil, requiredConfigurationMissing(config.SocketConnectPort)
98+
if _, err := s.Setting(config.SocketConnectPort); err != nil {
99+
return nil, err
100100
}
101101

102-
if ok := s.HasSetting(config.HeartBtInt); !ok {
103-
return nil, requiredConfigurationMissing(config.HeartBtInt)
102+
if _, err := s.IntSetting(config.HeartBtInt); err != nil {
103+
return nil, err
104104
}
105105

106106
session, err := createSession(sessionID, storeFactory, s, logFactory, app)

session.go

+22-34
Original file line numberDiff line numberDiff line change
@@ -102,34 +102,36 @@ func newSession(sessionID SessionID, storeFactory MessageStoreFactory, settings
102102

103103
if sessionID.IsFIXT() {
104104
if session.defaultApplVerID, err = settings.Setting(config.DefaultApplVerID); err != nil {
105-
return session, requiredConfigurationMissing(config.DefaultApplVerID)
105+
return session, err
106106
}
107107

108108
if applVerID, ok := applVerIDLookup[session.defaultApplVerID]; ok {
109109
session.defaultApplVerID = applVerID
110110
}
111111

112112
//If the transport or app data dictionary setting is set, the other also needs to be set.
113-
hasTransportDataDictionary := settings.HasSetting(config.TransportDataDictionary)
114-
hasAppDataDictionary := settings.HasSetting(config.AppDataDictionary)
115-
if hasTransportDataDictionary && hasAppDataDictionary {
116-
transportDataDictionaryPath, _ := settings.Setting(config.TransportDataDictionary)
113+
if settings.HasSetting(config.TransportDataDictionary) || settings.HasSetting(config.AppDataDictionary) {
114+
transportDataDictionaryPath, err := settings.Setting(config.TransportDataDictionary)
115+
if err != nil {
116+
return session, err
117+
}
118+
117119
transportDataDictionary, err := datadictionary.Parse(transportDataDictionaryPath)
118120
if err != nil {
119121
return session, err
120122
}
121123

122-
appDataDictionaryPath, _ := settings.Setting(config.AppDataDictionary)
124+
appDataDictionaryPath, err := settings.Setting(config.AppDataDictionary)
125+
if err != nil {
126+
return session, err
127+
}
128+
123129
appDataDictionary, err := datadictionary.Parse(appDataDictionaryPath)
124130
if err != nil {
125131
return session, err
126132
}
127133

128134
session.validator = &fixtValidator{transportDataDictionary, appDataDictionary, validatorSettings}
129-
} else if hasTransportDataDictionary {
130-
return session, requiredConfigurationMissing(config.AppDataDictionary)
131-
} else if hasAppDataDictionary {
132-
return session, requiredConfigurationMissing(config.TransportDataDictionary)
133135
}
134136
} else {
135137
var dataDictionary *datadictionary.DataDictionary
@@ -170,10 +172,7 @@ func newSession(sessionID SessionID, storeFactory MessageStoreFactory, settings
170172
}
171173
}
172174

173-
switch {
174-
case !settings.HasSetting(config.StartTime) && !settings.HasSetting(config.EndTime):
175-
//no session times
176-
case settings.HasSetting(config.StartTime) && settings.HasSetting(config.EndTime):
175+
if settings.HasSetting(config.StartTime) || settings.HasSetting(config.EndTime) {
177176
var startTimeStr, endTimeStr string
178177
if startTimeStr, err = settings.Setting(config.StartTime); err != nil {
179178
return session, err
@@ -185,12 +184,12 @@ func newSession(sessionID SessionID, storeFactory MessageStoreFactory, settings
185184

186185
start, err := internal.ParseTimeOfDay(startTimeStr)
187186
if err != nil {
188-
return session, err
187+
return session, IncorrectFormatForSetting{Setting: config.StartTime, Value: startTimeStr, Err: err}
189188
}
190189

191190
end, err := internal.ParseTimeOfDay(endTimeStr)
192191
if err != nil {
193-
return session, err
192+
return session, IncorrectFormatForSetting{Setting: config.EndTime, Value: endTimeStr, Err: err}
194193
}
195194

196195
loc := time.UTC
@@ -202,15 +201,13 @@ func newSession(sessionID SessionID, storeFactory MessageStoreFactory, settings
202201

203202
loc, err = time.LoadLocation(locStr)
204203
if err != nil {
205-
return session, err
204+
return session, IncorrectFormatForSetting{Setting: config.TimeZone, Value: locStr, Err: err}
206205
}
207206
}
208207

209-
switch {
210-
case !settings.HasSetting(config.StartDay) && !settings.HasSetting(config.EndDay):
208+
if !settings.HasSetting(config.StartDay) && !settings.HasSetting(config.EndDay) {
211209
session.sessionTime = internal.NewTimeRangeInLocation(start, end, loc)
212-
213-
case settings.HasSetting(config.StartDay) && settings.HasSetting(config.EndDay):
210+
} else {
214211
var startDayStr, endDayStr string
215212
if startDayStr, err = settings.Setting(config.StartDay); err != nil {
216213
return session, err
@@ -220,35 +217,26 @@ func newSession(sessionID SessionID, storeFactory MessageStoreFactory, settings
220217
return session, err
221218
}
222219

223-
parseDay := func(dayStr string) (day time.Weekday, err error) {
220+
parseDay := func(setting, dayStr string) (day time.Weekday, err error) {
224221
day, ok := dayLookup[dayStr]
225222
if !ok {
226-
err = fmt.Errorf("Cannot parse %v", dayStr)
223+
return day, IncorrectFormatForSetting{Setting: setting, Value: dayStr}
227224
}
228225
return
229226
}
230227

231-
startDay, err := parseDay(startDayStr)
228+
startDay, err := parseDay(config.StartDay, startDayStr)
232229
if err != nil {
233230
return session, err
234231
}
235232

236-
endDay, err := parseDay(endDayStr)
233+
endDay, err := parseDay(config.EndDay, endDayStr)
237234
if err != nil {
238235
return session, err
239236
}
240237

241238
session.sessionTime = internal.NewWeekRangeInLocation(start, end, startDay, endDay, loc)
242-
case settings.HasSetting(config.StartDay):
243-
return session, requiredConfigurationMissing(config.EndDay)
244-
case settings.HasSetting(config.EndDay):
245-
return session, requiredConfigurationMissing(config.StartDay)
246239
}
247-
248-
case settings.HasSetting(config.StartTime):
249-
return session, requiredConfigurationMissing(config.EndTime)
250-
case settings.HasSetting(config.EndTime):
251-
return session, requiredConfigurationMissing(config.StartTime)
252240
}
253241

254242
if session.log, err = logFactory.CreateSessionLog(session.sessionID); err != nil {

session_settings.go

+38-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package quickfix
22

33
import (
4-
"errors"
54
"fmt"
65
"strconv"
76
"time"
@@ -12,6 +11,25 @@ type SessionSettings struct {
1211
settings map[string]string
1312
}
1413

14+
//ConditionallyRequiredSetting indicates a missing setting
15+
type ConditionallyRequiredSetting struct {
16+
Setting string
17+
}
18+
19+
func (e ConditionallyRequiredSetting) Error() string {
20+
return fmt.Sprintf("Conditionally Required Setting: %v", e.Setting)
21+
}
22+
23+
//IncorrectFormatForSetting indicates a setting that is incorrectly formatted
24+
type IncorrectFormatForSetting struct {
25+
Setting, Value string
26+
Err error
27+
}
28+
29+
func (e IncorrectFormatForSetting) Error() string {
30+
return fmt.Sprintf("%q is invalid for %s", e.Value, e.Setting)
31+
}
32+
1533
//Init initializes or resets SessionSettings
1634
func (s *SessionSettings) Init() {
1735
s.settings = make(map[string]string)
@@ -45,32 +63,41 @@ func (s *SessionSettings) HasSetting(setting string) bool {
4563
func (s *SessionSettings) Setting(setting string) (string, error) {
4664
val, ok := s.settings[setting]
4765
if !ok {
48-
return val, errors.New("setting not found")
66+
return val, ConditionallyRequiredSetting{setting}
4967
}
5068

5169
return val, nil
5270
}
5371

5472
//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.
55-
func (s *SessionSettings) IntSetting(setting string) (int, error) {
73+
func (s *SessionSettings) IntSetting(setting string) (val int, err error) {
5674
stringVal, err := s.Setting(setting)
5775

5876
if err != nil {
59-
return 0, err
77+
return
78+
}
79+
80+
if val, err = strconv.Atoi(stringVal); err != nil {
81+
return val, IncorrectFormatForSetting{Setting: setting, Value: stringVal, Err: err}
6082
}
6183

62-
return strconv.Atoi(stringVal)
84+
return
6385
}
6486

65-
//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.
87+
//DurationSetting returns the requested setting parsed as a time.Duration.
88+
//Returns an error if the setting is not set or cannot be parsed as a time.Duration.
6689
func (s *SessionSettings) DurationSetting(setting string) (val time.Duration, err error) {
6790
stringVal, err := s.Setting(setting)
6891

6992
if err != nil {
7093
return
7194
}
7295

73-
return time.ParseDuration(stringVal)
96+
if val, err = time.ParseDuration(stringVal); err != nil {
97+
return val, IncorrectFormatForSetting{Setting: setting, Value: stringVal, Err: err}
98+
}
99+
100+
return
74101
}
75102

76103
//BoolSetting returns the requested setting parsed as a boolean. Returns an errror if the setting is not set or cannot be parsed as a bool.
@@ -81,15 +108,14 @@ func (s SessionSettings) BoolSetting(setting string) (bool, error) {
81108
return false, err
82109
}
83110

84-
if stringVal == "Y" || stringVal == "y" {
111+
switch stringVal {
112+
case "Y", "y":
85113
return true, nil
86-
}
87-
88-
if stringVal == "N" || stringVal == "n" {
114+
case "N", "n":
89115
return false, nil
90116
}
91117

92-
return false, fmt.Errorf("%v cannot be parsed as a bool", stringVal)
118+
return false, IncorrectFormatForSetting{Setting: setting, Value: stringVal}
93119
}
94120

95121
func (s *SessionSettings) overlay(overlay *SessionSettings) {

0 commit comments

Comments
 (0)