1package ssg
2
3import (
4 "io"
5 "os"
6 "path/filepath"
7)
8
9func CopyDir(source string, destination string) error {
10 srcInfo, err := os.Stat(source)
11 if err != nil {
12 return err
13 }
14 if err := os.MkdirAll(destination, srcInfo.Mode()); err != nil {
15 return err
16 }
17 entries, err := os.ReadDir(source)
18 if err != nil {
19 return err
20 }
21 for _, entry := range entries {
22 entrySrc := filepath.Join(source, entry.Name())
23 entryDest := filepath.Join(destination, entry.Name())
24 if entry.IsDir() {
25 if err := CopyDir(entrySrc, entryDest); err != nil {
26 return err
27 }
28 } else {
29 if err := CopyFile(entrySrc, entryDest); err != nil {
30 return err
31 }
32 }
33 }
34 return nil
35}
36
37func CopyFile(srcPath string, destPath string) error {
38 info, err := os.Stat(srcPath)
39 if err != nil {
40 return err
41 }
42 src, err := os.Open(srcPath)
43 if err != nil {
44 return err
45 }
46 defer src.Close()
47 dest, err := os.OpenFile(destPath, os.O_WRONLY|os.O_CREATE, info.Mode())
48 if err != nil {
49 return err
50 }
51 defer dest.Close()
52 _, err = io.Copy(dest, src)
53 if err != nil {
54 return err
55 }
56 return nil
57}
58
59func RemoveDuplicateItems[T comparable](items []T) []T {
60 result := make([]T, 0)
61 seen := make(map[T]bool, 0)
62 for _, item := range items {
63 if !seen[item] {
64 result = append(result, item)
65 seen[item] = true
66 }
67 }
68 return result
69}