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  }