Skip to content

Commit e0badeb

Browse files
committed
Removed all panics. Instead error will be returned in case any error is run into. In addition to this, some methods used to create instances have been renamed with Create prefix.
1 parent 3d4a6be commit e0badeb

File tree

6 files changed

+112
-59
lines changed

6 files changed

+112
-59
lines changed

executor.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,13 @@ func (executor *SimpleTaskExecutor) Schedule(task Task, delay time.Duration) (Sc
6666
}
6767

6868
executor.nextSequence++
69-
scheduledTask := NewScheduledRunnableTask(executor.nextSequence, task, executor.calculateTriggerTime(delay), 0, false)
69+
scheduledTask, err := CreateScheduledRunnableTask(executor.nextSequence, task, executor.calculateTriggerTime(delay), 0, false)
7070
executor.executorMu.Unlock()
7171

72+
if err != nil {
73+
return nil, err
74+
}
75+
7276
executor.addNewTask(scheduledTask)
7377

7478
return scheduledTask, nil
@@ -87,9 +91,13 @@ func (executor *SimpleTaskExecutor) ScheduleWithFixedDelay(task Task, initialDel
8791
}
8892

8993
executor.nextSequence++
90-
scheduledTask := NewScheduledRunnableTask(executor.nextSequence, task, executor.calculateTriggerTime(initialDelay), delay, false)
94+
scheduledTask, err := CreateScheduledRunnableTask(executor.nextSequence, task, executor.calculateTriggerTime(initialDelay), delay, false)
9195
executor.executorMu.Unlock()
9296

97+
if err != nil {
98+
return nil, err
99+
}
100+
93101
executor.addNewTask(scheduledTask)
94102

95103
return scheduledTask, nil
@@ -108,9 +116,13 @@ func (executor *SimpleTaskExecutor) ScheduleAtFixedRate(task Task, initialDelay
108116
}
109117

110118
executor.nextSequence++
111-
scheduledTask := NewScheduledRunnableTask(executor.nextSequence, task, executor.calculateTriggerTime(initialDelay), period, true)
119+
scheduledTask, err := CreateScheduledRunnableTask(executor.nextSequence, task, executor.calculateTriggerTime(initialDelay), period, true)
112120
executor.executorMu.Unlock()
113121

122+
if err != nil {
123+
return nil, err
124+
}
125+
114126
executor.addNewTask(scheduledTask)
115127

116128
return scheduledTask, nil

scheduler.go

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,59 @@ func NewDefaultTaskScheduler() TaskScheduler {
3535
}
3636

3737
func (scheduler *SimpleTaskScheduler) Schedule(task Task, options ...Option) (ScheduledTask, error) {
38-
schedulerTask := NewSchedulerTask(task, options...)
38+
schedulerTask, err := CreateSchedulerTask(task, options...)
39+
40+
if err != nil {
41+
return nil, err
42+
}
43+
3944
return scheduler.taskExecutor.Schedule(task, schedulerTask.GetInitialDelay())
4045
}
4146

4247
func (scheduler *SimpleTaskScheduler) ScheduleWithCron(task Task, expression string, options ...Option) (ScheduledTask, error) {
43-
schedulerTask := NewSchedulerTask(task, options...)
44-
triggerTask := NewTriggerTask(schedulerTask.task, scheduler.taskExecutor, NewCronTrigger(expression, schedulerTask.location))
48+
var schedulerTask *SchedulerTask
49+
var err error
50+
51+
schedulerTask, err = CreateSchedulerTask(task, options...)
52+
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
var cronTrigger *CronTrigger
58+
cronTrigger, err = CreateCronTrigger(expression, schedulerTask.location)
59+
60+
if err != nil {
61+
return nil, err
62+
}
63+
64+
var triggerTask *TriggerTask
65+
triggerTask, err = CreateTriggerTask(schedulerTask.task, scheduler.taskExecutor, cronTrigger)
66+
67+
if err != nil {
68+
return nil, err
69+
}
70+
4571
return triggerTask.Schedule()
4672
}
4773

4874
func (scheduler *SimpleTaskScheduler) ScheduleWithFixedDelay(task Task, delay time.Duration, options ...Option) (ScheduledTask, error) {
49-
schedulerTask := NewSchedulerTask(task, options...)
75+
schedulerTask, err := CreateSchedulerTask(task, options...)
76+
77+
if err != nil {
78+
return nil, err
79+
}
80+
5081
return scheduler.taskExecutor.ScheduleWithFixedDelay(schedulerTask.task, schedulerTask.GetInitialDelay(), delay)
5182
}
5283

5384
func (scheduler *SimpleTaskScheduler) ScheduleAtFixedRate(task Task, period time.Duration, options ...Option) (ScheduledTask, error) {
54-
schedulerTask := NewSchedulerTask(task, options...)
85+
schedulerTask, err := CreateSchedulerTask(task, options...)
86+
87+
if err != nil {
88+
return nil, err
89+
}
90+
5591
return scheduler.taskExecutor.ScheduleAtFixedRate(schedulerTask.task, schedulerTask.GetInitialDelay(), period)
5692
}
5793

task.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package chrono
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"sort"
78
"sync"
89
"time"
@@ -16,9 +17,9 @@ type SchedulerTask struct {
1617
location *time.Location
1718
}
1819

19-
func NewSchedulerTask(task Task, options ...Option) *SchedulerTask {
20+
func CreateSchedulerTask(task Task, options ...Option) (*SchedulerTask, error) {
2021
if task == nil {
21-
panic("task cannot be nil")
22+
return nil, errors.New("task cannot be nil")
2223
}
2324

2425
runnableTask := &SchedulerTask{
@@ -28,10 +29,14 @@ func NewSchedulerTask(task Task, options ...Option) *SchedulerTask {
2829
}
2930

3031
for _, option := range options {
31-
option(runnableTask)
32+
err := option(runnableTask)
33+
34+
if err != nil {
35+
return nil, err
36+
}
3237
}
3338

34-
return runnableTask
39+
return runnableTask, nil
3540
}
3641

3742
func (task *SchedulerTask) GetInitialDelay() time.Duration {
@@ -50,23 +55,25 @@ func (task *SchedulerTask) GetInitialDelay() time.Duration {
5055
return diff
5156
}
5257

53-
type Option func(task *SchedulerTask)
58+
type Option func(task *SchedulerTask) error
5459

5560
func WithStartTime(year int, month time.Month, day, hour, min, sec int) Option {
56-
return func(task *SchedulerTask) {
61+
return func(task *SchedulerTask) error {
5762
task.startTime = time.Date(year, month, day, hour, min, sec, 0, time.Local)
63+
return nil
5864
}
5965
}
6066

6167
func WithLocation(location string) Option {
62-
return func(task *SchedulerTask) {
68+
return func(task *SchedulerTask) error {
6369
loadedLocation, err := time.LoadLocation(location)
6470

6571
if err != nil {
66-
panic(err)
72+
return fmt.Errorf("location not loaded : %s", location)
6773
}
6874

6975
task.location = loadedLocation
76+
return nil
7077
}
7178
}
7279

@@ -85,9 +92,9 @@ type ScheduledRunnableTask struct {
8592
cancelled bool
8693
}
8794

88-
func NewScheduledRunnableTask(id int, task Task, triggerTime time.Time, period time.Duration, fixedRate bool) *ScheduledRunnableTask {
95+
func CreateScheduledRunnableTask(id int, task Task, triggerTime time.Time, period time.Duration, fixedRate bool) (*ScheduledRunnableTask, error) {
8996
if task == nil {
90-
panic("task cannot be nil")
97+
return nil, errors.New("task cannot be nil")
9198
}
9299

93100
if period < 0 {
@@ -100,7 +107,7 @@ func NewScheduledRunnableTask(id int, task Task, triggerTime time.Time, period t
100107
triggerTime: triggerTime,
101108
period: period,
102109
fixedRate: fixedRate,
103-
}
110+
}, nil
104111
}
105112

106113
func (scheduledRunnableTask *ScheduledRunnableTask) Cancel() {
@@ -155,25 +162,25 @@ type TriggerTask struct {
155162
nextTriggerTime time.Time
156163
}
157164

158-
func NewTriggerTask(task Task, executor TaskExecutor, trigger Trigger) *TriggerTask {
165+
func CreateTriggerTask(task Task, executor TaskExecutor, trigger Trigger) (*TriggerTask, error) {
159166
if task == nil {
160-
panic("task cannot be nil")
167+
return nil, errors.New("task cannot be nil")
161168
}
162169

163170
if executor == nil {
164-
panic("executor cannot be nil")
171+
return nil, errors.New("executor cannot be nil")
165172
}
166173

167174
if trigger == nil {
168-
panic("trigger cannot be nil")
175+
return nil, errors.New("trigger cannot be nil")
169176
}
170177

171178
return &TriggerTask{
172179
task: task,
173180
executor: executor,
174181
triggerContext: NewSimpleTriggerContext(),
175182
trigger: trigger,
176-
}
183+
}, nil
177184
}
178185

179186
func (task *TriggerTask) Cancel() {

task_test.go

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,55 +10,50 @@ import (
1010
)
1111

1212
func TestNewSchedulerTask(t *testing.T) {
13-
assert.Panics(t, func() {
14-
NewSchedulerTask(nil)
15-
})
13+
_, err := CreateSchedulerTask(nil)
14+
assert.Error(t, err)
1615
}
1716

1817
func TestNewSchedulerTask_WithLocation(t *testing.T) {
19-
assert.NotPanics(t, func() {
20-
NewSchedulerTask(func(ctx context.Context) {
18+
_, err := CreateSchedulerTask(func(ctx context.Context) {
2119

22-
}, WithLocation("Europe/Istanbul"))
23-
})
20+
}, WithLocation("Europe/Istanbul"))
21+
assert.Nil(t, err)
2422
}
2523

2624
func TestNewSchedulerTask_WithInvalidLocation(t *testing.T) {
27-
assert.Panics(t, func() {
28-
NewSchedulerTask(func(ctx context.Context) {
25+
_, err := CreateSchedulerTask(func(ctx context.Context) {
2926

30-
}, WithLocation("Europe"))
31-
})
27+
}, WithLocation("Europe"))
28+
assert.Error(t, err)
3229
}
3330

3431
func TestNewScheduledRunnableTask(t *testing.T) {
35-
task := NewScheduledRunnableTask(0, func(ctx context.Context) {
32+
task, _ := CreateScheduledRunnableTask(0, func(ctx context.Context) {
3633

3734
}, time.Now(), -1, true)
3835

3936
assert.Equal(t, task.period, 0*time.Second)
4037

41-
assert.Panics(t, func() {
42-
NewScheduledRunnableTask(0, nil, time.Now(), -1, true)
43-
})
38+
_, err := CreateScheduledRunnableTask(0, nil, time.Now(), -1, true)
39+
assert.Error(t, err)
4440
}
4541

4642
func TestNewTriggerTask(t *testing.T) {
47-
assert.Panics(t, func() {
48-
NewTriggerTask(nil, NewDefaultTaskExecutor(), NewCronTrigger("* * * * * *", time.Local))
49-
})
43+
trigger, err := CreateCronTrigger("* * * * * *", time.Local)
44+
assert.Nil(t, err)
5045

51-
assert.Panics(t, func() {
52-
NewTriggerTask(func(ctx context.Context) {
46+
_, err = CreateTriggerTask(nil, NewDefaultTaskExecutor(), trigger)
47+
assert.Error(t, err)
5348

54-
}, nil, NewCronTrigger("* * * * * *", time.Local))
55-
})
49+
_, err = CreateTriggerTask(func(ctx context.Context) {
5650

57-
assert.Panics(t, func() {
58-
NewTriggerTask(func(ctx context.Context) {
51+
}, nil, trigger)
52+
assert.Error(t, err)
5953

60-
}, NewDefaultTaskExecutor(), nil)
61-
})
54+
_, err = CreateTriggerTask(func(ctx context.Context) {
55+
56+
}, NewDefaultTaskExecutor(), nil)
6257
}
6358

6459
type zeroTrigger struct {
@@ -69,7 +64,7 @@ func (trigger *zeroTrigger) NextExecutionTime(ctx TriggerContext) time.Time {
6964
}
7065

7166
func TestTriggerTask_Schedule(t *testing.T) {
72-
task := NewTriggerTask(func(ctx context.Context) {}, NewDefaultTaskExecutor(), &zeroTrigger{})
67+
task, _ := CreateTriggerTask(func(ctx context.Context) {}, NewDefaultTaskExecutor(), &zeroTrigger{})
7368
_, err := task.Schedule()
7469
assert.NotNil(t, err)
7570
}
@@ -109,8 +104,11 @@ func TestTriggerTask_ScheduleWithError(t *testing.T) {
109104
scheduledExecutorMock.On("Schedule", mock.AnythingOfType("Task"), mock.AnythingOfType("time.Duration")).
110105
Return((*ScheduledRunnableTask)(nil), errors.New("test error"))
111106

112-
task := NewTriggerTask(func(ctx context.Context) {}, scheduledExecutorMock, NewCronTrigger("* * * * * * ", time.Local))
113-
_, err := task.Schedule()
107+
trigger, err := CreateCronTrigger("* * * * * *", time.Local)
108+
assert.Nil(t, err)
109+
110+
task, _ := CreateTriggerTask(func(ctx context.Context) {}, scheduledExecutorMock, trigger)
111+
_, err = task.Schedule()
114112

115113
assert.NotNil(t, err)
116114
}

trigger.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ type CronTrigger struct {
4545
location *time.Location
4646
}
4747

48-
func NewCronTrigger(expression string, location *time.Location) *CronTrigger {
48+
func CreateCronTrigger(expression string, location *time.Location) (*CronTrigger, error) {
4949
cron, err := ParseCronExpression(expression)
5050

5151
if err != nil {
52-
panic(err)
52+
return nil, err
5353
}
5454

5555
trigger := &CronTrigger{
@@ -61,7 +61,7 @@ func NewCronTrigger(expression string, location *time.Location) *CronTrigger {
6161
trigger.location = location
6262
}
6363

64-
return trigger
64+
return trigger, nil
6565
}
6666

6767
func (trigger *CronTrigger) NextExecutionTime(ctx TriggerContext) time.Time {

trigger_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestSimpleTriggerContext(t *testing.T) {
1919
}
2020

2121
func TestNewCronTrigger(t *testing.T) {
22-
assert.Panics(t, func() {
23-
NewCronTrigger("", time.Local)
24-
})
22+
trigger, err := CreateCronTrigger("", time.Local)
23+
assert.Error(t, err)
24+
assert.Nil(t, trigger)
2525
}

0 commit comments

Comments
 (0)