|  | package tfexec | 
|  |  | 
|  | import ( | 
|  | "context" | 
|  | "os/exec" | 
|  | "strconv" | 
|  | ) | 
|  |  | 
|  | type statePushConfig struct { | 
|  | force       bool | 
|  | lock        bool | 
|  | lockTimeout string | 
|  | } | 
|  |  | 
|  | var defaultStatePushOptions = statePushConfig{ | 
|  | lock:        false, | 
|  | lockTimeout: "0s", | 
|  | } | 
|  |  | 
|  | // StatePushCmdOption represents options used in the Refresh method. | 
|  | type StatePushCmdOption interface { | 
|  | configureStatePush(*statePushConfig) | 
|  | } | 
|  |  | 
|  | func (opt *ForceOption) configureStatePush(conf *statePushConfig) { | 
|  | conf.force = opt.force | 
|  | } | 
|  |  | 
|  | func (opt *LockOption) configureStatePush(conf *statePushConfig) { | 
|  | conf.lock = opt.lock | 
|  | } | 
|  |  | 
|  | func (opt *LockTimeoutOption) configureStatePush(conf *statePushConfig) { | 
|  | conf.lockTimeout = opt.timeout | 
|  | } | 
|  |  | 
|  | func (tf *Terraform) StatePush(ctx context.Context, path string, opts ...StatePushCmdOption) error { | 
|  | cmd, err := tf.statePushCmd(ctx, path, opts...) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | return tf.runTerraformCmd(ctx, cmd) | 
|  | } | 
|  |  | 
|  | func (tf *Terraform) statePushCmd(ctx context.Context, path string, opts ...StatePushCmdOption) (*exec.Cmd, error) { | 
|  | c := defaultStatePushOptions | 
|  |  | 
|  | for _, o := range opts { | 
|  | o.configureStatePush(&c) | 
|  | } | 
|  |  | 
|  | args := []string{"state", "push"} | 
|  |  | 
|  | if c.force { | 
|  | args = append(args, "-force") | 
|  | } | 
|  |  | 
|  | args = append(args, "-lock="+strconv.FormatBool(c.lock)) | 
|  |  | 
|  | if c.lockTimeout != "" { | 
|  | args = append(args, "-lock-timeout="+c.lockTimeout) | 
|  | } | 
|  |  | 
|  | args = append(args, path) | 
|  |  | 
|  | return tf.buildTerraformCmd(ctx, nil, args...), nil | 
|  | } |