main soggy/glerc / ssg / utils.go
 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}