package initwd import ( "fmt" version "github.com/hashicorp/go-version" "github.com/hashicorp/terraform-config-inspect/tfconfig" "github.com/hashicorp/terraform/internal/earlyconfig" "github.com/hashicorp/terraform/internal/modsdir" "github.com/hashicorp/terraform/internal/tfdiags" ) // LoadConfig loads a full configuration tree that has previously had all of // its dependent modules installed to the given modulesDir using a // ModuleInstaller. // // This uses the early configuration loader and thus only reads top-level // metadata from the modules in the configuration. Most callers should use // the configs/configload package to fully load a configuration. func LoadConfig(rootDir, modulesDir string) (*earlyconfig.Config, tfdiags.Diagnostics) { rootMod, diags := earlyconfig.LoadModule(rootDir) if rootMod == nil { return nil, diags } manifest, err := modsdir.ReadManifestSnapshotForDir(modulesDir) if err != nil { diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, "Failed to read module manifest", fmt.Sprintf("Terraform failed to read its manifest of locally-cached modules: %s.", err), )) return nil, diags } return earlyconfig.BuildConfig(rootMod, earlyconfig.ModuleWalkerFunc( func(req *earlyconfig.ModuleRequest) (*tfconfig.Module, *version.Version, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics key := manifest.ModuleKey(req.Path) record, exists := manifest[key] if !exists { diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, "Module not installed", fmt.Sprintf("Module %s is not yet installed. Run \"terraform init\" to install all modules required by this configuration.", req.Path.String()), )) return nil, nil, diags } mod, mDiags := earlyconfig.LoadModule(record.Dir) diags = diags.Append(mDiags) return mod, record.Version, diags }, )) }