go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/cron/job_builder.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package cron 9 10 import ( 11 "context" 12 "fmt" 13 "time" 14 ) 15 16 // Interface assertions. 17 var ( 18 _ Job = (*JobBuilder)(nil) 19 _ ScheduleProvider = (*JobBuilder)(nil) 20 _ LifecycleProvider = (*JobBuilder)(nil) 21 _ BackgroundProvider = (*JobBuilder)(nil) 22 _ ConfigProvider = (*JobBuilder)(nil) 23 ) 24 25 // NewJob returns a new job builder. 26 func NewJob(options ...JobBuilderOption) *JobBuilder { 27 var jb JobBuilder 28 for _, option := range options { 29 option(&jb) 30 } 31 if jb.JobName == "" { 32 jb.JobName = newRandomID() 33 } 34 return &jb 35 } 36 37 // JobBuilderOption is a job builder option. 38 type JobBuilderOption func(*JobBuilder) 39 40 // OptJobName sets the job name. 41 func OptJobName(name string) JobBuilderOption { 42 return func(jb *JobBuilder) { jb.JobName = name } 43 } 44 45 // OptJobNamef sets the job name by a format and args using `fmt.Sprintf` 46 func OptJobNamef(format string, args ...interface{}) JobBuilderOption { 47 return func(jb *JobBuilder) { jb.JobName = fmt.Sprintf(format, args...) } 48 } 49 50 // OptJobAction sets the job action. 51 func OptJobAction(action func(context.Context) error) JobBuilderOption { 52 return func(jb *JobBuilder) { jb.JobAction = action } 53 } 54 55 // OptJobConfig sets the job config. 56 func OptJobConfig(cfg JobConfig) JobBuilderOption { 57 return func(jb *JobBuilder) { jb.JobConfig = cfg } 58 } 59 60 // OptJobLabels is a job builder sets the job labels. 61 func OptJobLabels(labels map[string]string) JobBuilderOption { 62 return func(jb *JobBuilder) { jb.JobConfig.Labels = labels } 63 } 64 65 // OptJobSchedule is a job builder sets the job schedule provder. 66 func OptJobSchedule(schedule Schedule) JobBuilderOption { 67 return func(jb *JobBuilder) { jb.JobScheduleProvider = func() Schedule { return schedule } } 68 } 69 70 // OptJobTimeout is a job builder sets the job timeout provder. 71 func OptJobTimeout(d time.Duration) JobBuilderOption { 72 return func(jb *JobBuilder) { jb.JobConfig.Timeout = d } 73 } 74 75 // OptJobShutdownGracePeriod is a job builder sets the job shutdown grace period provder. 76 func OptJobShutdownGracePeriod(d time.Duration) JobBuilderOption { 77 return func(jb *JobBuilder) { jb.JobConfig.ShutdownGracePeriod = d } 78 } 79 80 // OptJobDisabled is a job builder sets the job timeout provder. 81 func OptJobDisabled(disabled bool) JobBuilderOption { 82 return func(jb *JobBuilder) { jb.JobConfig.Disabled = disabled } 83 } 84 85 // OptJobOnBegin sets a lifecycle hook. 86 func OptJobOnBegin(handler func(context.Context)) JobBuilderOption { 87 return func(jb *JobBuilder) { jb.JobLifecycle.OnBegin = handler } 88 } 89 90 // OptJobOnComplete sets a lifecycle hook. 91 func OptJobOnComplete(handler func(context.Context)) JobBuilderOption { 92 return func(jb *JobBuilder) { jb.JobLifecycle.OnComplete = handler } 93 } 94 95 // OptJobOnError sets a lifecycle hook. 96 func OptJobOnError(handler func(context.Context)) JobBuilderOption { 97 return func(jb *JobBuilder) { jb.JobLifecycle.OnError = handler } 98 } 99 100 // OptJobOnCancellation sets the on cancellation lifecycle hook. 101 func OptJobOnCancellation(handler func(context.Context)) JobBuilderOption { 102 return func(jb *JobBuilder) { jb.JobLifecycle.OnCancellation = handler } 103 } 104 105 // OptJobOnSuccess sets a lifecycle hook. 106 func OptJobOnSuccess(handler func(context.Context)) JobBuilderOption { 107 return func(jb *JobBuilder) { jb.JobLifecycle.OnSuccess = handler } 108 } 109 110 // OptJobOnBroken sets a lifecycle hook. 111 func OptJobOnBroken(handler func(context.Context)) JobBuilderOption { 112 return func(jb *JobBuilder) { jb.JobLifecycle.OnBroken = handler } 113 } 114 115 // OptJobOnFixed sets a lifecycle hook. 116 func OptJobOnFixed(handler func(context.Context)) JobBuilderOption { 117 return func(jb *JobBuilder) { jb.JobLifecycle.OnFixed = handler } 118 } 119 120 // OptJobOnEnabled sets a lifecycle hook. 121 func OptJobOnEnabled(handler func(context.Context)) JobBuilderOption { 122 return func(jb *JobBuilder) { jb.JobLifecycle.OnEnabled = handler } 123 } 124 125 // OptJobOnDisabled sets a lifecycle hook. 126 func OptJobOnDisabled(handler func(context.Context)) JobBuilderOption { 127 return func(jb *JobBuilder) { jb.JobLifecycle.OnDisabled = handler } 128 } 129 130 // OptJobOnRegister sets a lifecycle hook. 131 func OptJobOnRegister(handler func(context.Context) error) JobBuilderOption { 132 return func(jb *JobBuilder) { jb.JobLifecycle.OnRegister = handler } 133 } 134 135 // OptJobOnRemove sets a lifecycle hook. 136 func OptJobOnRemove(handler func(context.Context) error) JobBuilderOption { 137 return func(jb *JobBuilder) { jb.JobLifecycle.OnRemove = handler } 138 } 139 140 // OptJobBackground sets the background provider. 141 func OptJobBackground(provider func(context.Context) context.Context) JobBuilderOption { 142 return func(jb *JobBuilder) { jb.BackgroundProvider = provider } 143 } 144 145 // JobBuilder allows for job creation w/o a fully formed struct. 146 type JobBuilder struct { 147 JobName string 148 JobConfig JobConfig 149 JobLifecycle JobLifecycle 150 JobAction Action 151 JobScheduleProvider func() Schedule 152 BackgroundProvider func(context.Context) context.Context 153 } 154 155 // Name returns the job name. 156 func (jb *JobBuilder) Name() string { 157 return jb.JobName 158 } 159 160 // Background implements BackgroundProvider. 161 func (jb *JobBuilder) Background(ctx context.Context) context.Context { 162 if jb.BackgroundProvider != nil { 163 return jb.BackgroundProvider(ctx) 164 } 165 return ctx 166 } 167 168 // Schedule returns the job schedule if a provider is set. 169 func (jb *JobBuilder) Schedule() Schedule { 170 if jb.JobScheduleProvider != nil { 171 return jb.JobScheduleProvider() 172 } 173 return nil 174 } 175 176 // Config returns the job config. 177 func (jb *JobBuilder) Config() JobConfig { 178 return jb.JobConfig 179 } 180 181 // Lifecycle returns the job lifecycle hooks. 182 func (jb *JobBuilder) Lifecycle() JobLifecycle { 183 return jb.JobLifecycle 184 } 185 186 // Execute runs the job action if it's set. 187 func (jb *JobBuilder) Execute(ctx context.Context) error { 188 if jb.JobAction != nil { 189 return jb.JobAction(ctx) 190 } 191 return nil 192 }