blocky/helpertest/tmpdata.go

169 lines
2.4 KiB
Go

package helpertest
import (
"bufio"
"io/fs"
"os"
"path/filepath"
)
type TmpFolder struct {
Path string
Error error
prefix string
}
type TmpFile struct {
Path string
Error error
Folder *TmpFolder
}
func NewTmpFolder(prefix string) *TmpFolder {
ipref := prefix
if len(ipref) == 0 {
ipref = "blocky"
}
path, err := os.MkdirTemp("", ipref)
res := &TmpFolder{
Path: path,
Error: err,
prefix: ipref,
}
return res
}
func (tf *TmpFolder) Clean() error {
if len(tf.Path) > 0 {
return os.RemoveAll(tf.Path)
}
return nil
}
func (tf *TmpFolder) CreateSubFolder(name string) *TmpFolder {
var path string
var err error
if len(name) > 0 {
path = filepath.Join(tf.Path, name)
err = os.Mkdir(path, fs.ModePerm)
} else {
path, err = os.MkdirTemp(tf.Path, tf.prefix)
}
res := &TmpFolder{
Path: path,
Error: err,
prefix: tf.prefix,
}
return res
}
func (tf *TmpFolder) CreateEmptyFile(name string) *TmpFile {
f, err := tf.createFile(name)
if err != nil {
return tf.newErrorTmpFile(err)
}
return tf.checkState(f, err)
}
func (tf *TmpFolder) CreateStringFile(name string, lines ...string) *TmpFile {
f, err := tf.createFile(name)
if err != nil {
return tf.newErrorTmpFile(err)
}
first := true
w := bufio.NewWriter(f)
for _, l := range lines {
if first {
first = false
} else {
_, err = w.WriteString("\n")
}
if err != nil {
break
}
_, err = w.WriteString(l)
if err != nil {
break
}
}
w.Flush()
return tf.checkState(f, err)
}
func (tf *TmpFolder) JoinPath(name string) string {
return filepath.Join(tf.Path, name)
}
func (tf *TmpFolder) CountFiles() (int, error) {
files, err := os.ReadDir(tf.Path)
if err != nil {
return 0, err
}
return len(files), nil
}
func (tf *TmpFolder) createFile(name string) (*os.File, error) {
if len(name) > 0 {
return os.Create(filepath.Join(tf.Path, name))
}
return os.CreateTemp(tf.Path, "temp")
}
func (tf *TmpFolder) newErrorTmpFile(err error) *TmpFile {
return &TmpFile{
Path: "",
Error: err,
Folder: tf,
}
}
func (tf *TmpFolder) checkState(file *os.File, ierr error) *TmpFile {
err := ierr
filepath := ""
if file != nil {
filepath = file.Name()
file.Close()
_, err = os.Stat(filepath)
}
return &TmpFile{
Path: filepath,
Error: err,
Folder: tf,
}
}
func (tf *TmpFile) Stat() error {
if tf.Error != nil {
return tf.Error
}
_, res := os.Stat(tf.Path)
return res
}