// Copyright (c) The OpenTofu Authors // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2023 HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package views import ( "fmt" "github.com/hashicorp/go-version" "github.com/opentofu/opentofu/internal/initwd" ) // moduleInstallationHookHuman is the implementation of [initwd.ModuleInstallHooks] that prints the modules // installation progress information in human readable format. type moduleInstallationHookHuman struct { v *View showLocalPaths bool } var _ initwd.ModuleInstallHooks = moduleInstallationHookHuman{} func (h moduleInstallationHookHuman) Download(modulePath, packageAddr string, v *version.Version) { if v != nil { _, _ = h.v.streams.Println(fmt.Sprintf("Downloading %s %s for %s...", packageAddr, v, modulePath)) } else { _, _ = h.v.streams.Println(fmt.Sprintf("Downloading %s for %s...", packageAddr, modulePath)) } } func (h moduleInstallationHookHuman) Install(modulePath string, v *version.Version, localDir string) { if h.showLocalPaths { _, _ = h.v.streams.Println(fmt.Sprintf("- %s in %s", modulePath, localDir)) } else { _, _ = h.v.streams.Println(fmt.Sprintf("- %s", modulePath)) } } // moduleInstallationHookJSON is the implementation of [initwd.ModuleInstallHooks] that prints the modules // installation progress information in JSON format. type moduleInstallationHookJSON struct { v *JSONView showLocalPaths bool } var _ initwd.ModuleInstallHooks = moduleInstallationHookJSON{} func (h moduleInstallationHookJSON) Download(modulePath, packageAddr string, v *version.Version) { if v != nil { h.v.Info(fmt.Sprintf("Downloading %s %s for %s...", packageAddr, v, modulePath)) } else { h.v.Info(fmt.Sprintf("Downloading %s for %s...", packageAddr, modulePath)) } } func (h moduleInstallationHookJSON) Install(modulePath string, _ *version.Version, localDir string) { if h.showLocalPaths { h.v.Info(fmt.Sprintf("installing %s in %s", modulePath, localDir)) } else { h.v.Info(fmt.Sprintf("installing %s", modulePath)) } } // moduleInstallationHookMulti is the implementation of [initwd.ModuleInstallHooks] that wraps multiple // implementation of [initwd.ModuleInstallHooks] and acts as a proxy for all of those. // This is used for the `-json-into` flag. type moduleInstallationHookMulti []initwd.ModuleInstallHooks var _ initwd.ModuleInstallHooks = moduleInstallationHookMulti(nil) func (m moduleInstallationHookMulti) Download(modulePath, packageAddr string, v *version.Version) { for _, h := range m { h.Download(modulePath, packageAddr, v) } } func (m moduleInstallationHookMulti) Install(modulePath string, v *version.Version, localDir string) { for _, h := range m { h.Install(modulePath, v, localDir) } }