pkg to manage resouce tmp files
This commit is contained in:
parent
c34a76981e
commit
c4afd77777
90
internal/tempdir/tempdir.go
Normal file
90
internal/tempdir/tempdir.go
Normal file
@ -0,0 +1,90 @@
|
||||
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
|
||||
|
||||
package tempdir
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"log/slog"
|
||||
"io"
|
||||
)
|
||||
|
||||
type Path string
|
||||
|
||||
func (t *Path) ValidPath() bool {
|
||||
if filepath.IsAbs(string(*t)) && strings.HasPrefix(string(*t), os.TempDir()) && len(*t) > 1 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *Path) Create() (err error) {
|
||||
slog.Info("tempdir.Create()", "path", string(*t))
|
||||
var TempDir string
|
||||
TempDir, err = os.MkdirTemp("", string(*t))
|
||||
if err != nil || TempDir == "" {
|
||||
err = fmt.Errorf("%w: Failed creating temp dir %s", err, TempDir)
|
||||
}
|
||||
*t = Path(TempDir)
|
||||
return
|
||||
}
|
||||
|
||||
func (t *Path) Remove() {
|
||||
slog.Info("tempdir.Remove()", "path", *t)
|
||||
if t.ValidPath() {
|
||||
os.RemoveAll(string(*t))
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Path) CreateFileFromReader(name string, r io.Reader) (path string, err error) {
|
||||
path = filepath.Join(string(*t), name)
|
||||
_, statErr := os.Stat(path)
|
||||
if os.IsNotExist(statErr) {
|
||||
if file, createErr := os.Create(path); createErr == nil {
|
||||
defer file.Close()
|
||||
buf := make([]byte, 32*1024)
|
||||
_, err = io.CopyBuffer(file, r, buf)
|
||||
} else {
|
||||
err = createErr
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (t *Path) CreateFile(name string, content string) (err error) {
|
||||
path := filepath.Join(string(*t), name)
|
||||
_, statErr := os.Stat(path)
|
||||
if os.IsNotExist(statErr) {
|
||||
if file, createErr := os.Create(path); createErr == nil {
|
||||
defer file.Close()
|
||||
_, err = file.Write([]byte(content))
|
||||
} else {
|
||||
err = createErr
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (t *Path) Mkdir(name string, mode os.FileMode) (err error) {
|
||||
var path string
|
||||
if path, err = filepath.Abs(filepath.Join(string(*t), name)); err == nil {
|
||||
if ! (*Path)(&path).ValidPath() {
|
||||
return fmt.Errorf("Invalid path %s of %s", path, *t)
|
||||
}
|
||||
_, statErr := os.Stat(path)
|
||||
if os.IsNotExist(statErr) {
|
||||
err = os.Mkdir(path, mode)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (t *Path) DirFS() fs.FS {
|
||||
if t.ValidPath() {
|
||||
return os.DirFS(string(*t))
|
||||
}
|
||||
return nil
|
||||
}
|
31
internal/tempdir/tempdir_test.go
Normal file
31
internal/tempdir/tempdir_test.go
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
|
||||
|
||||
package tempdir
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func TestTempDir(t *testing.T) {
|
||||
var TempDir Path = "testtempdir"
|
||||
assert.Nil(t, TempDir.Create())
|
||||
assert.Contains(t, string(TempDir), "/tmp")
|
||||
assert.Nil(t, TempDir.CreateFile("foo.txt", "testdata"))
|
||||
stat, err := os.Stat(filepath.Join(string(TempDir), "foo.txt"))
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, int64(8), stat.Size())
|
||||
assert.Nil(t, TempDir.Mkdir("bar", 0700))
|
||||
dirStat, err := os.Stat(filepath.Join(string(TempDir), "bar"))
|
||||
assert.Nil(t, err)
|
||||
assert.True(t, dirStat.IsDir())
|
||||
TempDir.Remove()
|
||||
var InvalidTempDir Path = ""
|
||||
assert.False(t, InvalidTempDir.ValidPath())
|
||||
assert.Nil(t, InvalidTempDir.Create())
|
||||
assert.Contains(t, string(InvalidTempDir), "/tmp")
|
||||
assert.Greater(t, len(InvalidTempDir), 10)
|
||||
InvalidTempDir.Remove()
|
||||
}
|
Loading…
Reference in New Issue
Block a user