package os import "os" import "io" import "time" import "io/fs" import "html/template" import "git.tebibyte.media/sashakoshka/step" var _ step.FuncProvider = new(Provider) // FileInfo is like the fs.FileInfo interface, but it directly contains the // values instead of having getters for them. type FileInfo struct { Name string Size int64 Mode fs.FileMode ModTime time.Time IsDir bool } // Provider provides OS functions. type Provider struct { } // FuncMap fulfills the step.FuncProvider interface. func (this *Provider) FuncMap () template.FuncMap { return template.FuncMap { "env": funcEnv, "fileExists": funcFileExists, "statFile": funcStatFile, "readFile": funcReadFile, "readDir": funcReadDir, "writeFile": funcWriteFile, "renameFile": funcRenameFile, "removeFile": funcRemoveFile, } } func funcEnv (name string) string { return os.Getenv(name) } func funcFileExists (name string) (bool) { _, err := os.Stat(name) return err == nil } func funcStatFile (name string) (FileInfo, error) { info, err := os.Stat(name) if err != nil { return FileInfo { }, err } return FileInfo { Name: info.Name(), Size: info.Size(), Mode: info.Mode(), ModTime: info.ModTime(), IsDir: info.IsDir(), }, nil } func funcReadFile (name string) (string, error) { file, err := os.Open(name) if err != nil { return "", err } defer file.Close() buffer, err := io.ReadAll(file) if err != nil { return "", err } return string(buffer), nil } func funcReadDir (name string) ([]string, error) { entries, err := os.ReadDir(name) if err != nil { return nil, err } names := make([]string, len(entries)) for index, entry := range entries { names[index] = entry.Name() } return names, nil } func funcWriteFile (name, content string) error { file, err := os.Create(name) if err != nil { return err } _, err = io.WriteString(file, content) return err } func funcRenameFile (name, newName string) error { return os.Rename(name, newName) } func funcRemoveFile (name string) error { return os.Remove(name) }