package tfexec import ( "context" "fmt" "os/exec" ) type providersLockConfig struct { fsMirror string netMirror string platforms []string providers []string } var defaultProvidersLockOptions = providersLockConfig{} type ProvidersLockOption interface { configureProvidersLock(*providersLockConfig) } func (opt *FSMirrorOption) configureProvidersLock(conf *providersLockConfig) { conf.fsMirror = opt.fsMirror } func (opt *NetMirrorOption) configureProvidersLock(conf *providersLockConfig) { conf.netMirror = opt.netMirror } func (opt *PlatformOption) configureProvidersLock(conf *providersLockConfig) { conf.platforms = append(conf.platforms, opt.platform) } func (opt *ProviderOption) configureProvidersLock(conf *providersLockConfig) { conf.providers = append(conf.providers, opt.provider) } // ProvidersLock represents the `terraform providers lock` command func (tf *Terraform) ProvidersLock(ctx context.Context, opts ...ProvidersLockOption) error { err := tf.compatible(ctx, tf0_14_0, nil) if err != nil { return fmt.Errorf("terraform providers lock was added in 0.14.0: %w", err) } lockCmd := tf.providersLockCmd(ctx, opts...) err = tf.runTerraformCmd(ctx, lockCmd) if err != nil { return err } return err } func (tf *Terraform) providersLockCmd(ctx context.Context, opts ...ProvidersLockOption) *exec.Cmd { c := defaultProvidersLockOptions for _, o := range opts { o.configureProvidersLock(&c) } args := []string{"providers", "lock"} // string options, only pass if set if c.fsMirror != "" { args = append(args, "-fs-mirror="+c.fsMirror) } if c.netMirror != "" { args = append(args, "-net-mirror="+c.netMirror) } for _, p := range c.platforms { args = append(args, "-platform="+p) } // positional providers argument for _, p := range c.providers { args = append(args, p) } return tf.buildTerraformCmd(ctx, nil, args...) }