1
// This Source Code Form is subject to the terms of the Mozilla Public
2
// License, v. 2.0. If a copy of the MPL was not distributed with this
3
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
13
"github.com/siderolabs/gen/pair/ordered"
16
// CopyInstruction describes a file copy operation.
17
type CopyInstruction = ordered.Pair[string, string]
19
// SourceDestination returns a CopyInstruction that copies src to dest.
20
func SourceDestination(src, dest string) CopyInstruction {
21
return ordered.MakePair[string, string](src, dest)
24
// CopyFiles copies files according to the given instructions.
25
func CopyFiles(printf func(string, ...any), instructions ...CopyInstruction) error {
26
for _, instruction := range instructions {
27
if err := func(instruction CopyInstruction) error {
28
src, dest := instruction.F1, instruction.F2
30
if err := os.MkdirAll(filepath.Dir(dest), 0o755); err != nil {
34
printf("copying %s to %s", src, dest)
36
from, err := os.Open(src)
43
to, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o666)
50
_, err = io.Copy(to, from)
53
}(instruction); err != nil {
54
return fmt.Errorf("error copying %s -> %s: %w", instruction.F1, instruction.F2, err)