Files
opentf/internal/command/views/hook_module_install.go
2026-02-11 16:29:31 +02:00

83 lines
2.7 KiB
Go

// 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)
}
}