file: improve save and packing

This commit is contained in:
Geno 2021-06-01 13:17:51 +02:00
parent 9276f128d9
commit 88ca3d142e
6 changed files with 115 additions and 33 deletions

View File

@ -3,22 +3,9 @@ package file
import (
"encoding/json"
"io/ioutil"
"os"
"github.com/BurntSushi/toml"
)
// ReadTOML reads a config model from path of a yml file
func ReadTOML(path string, data interface{}) error {
file, err := ioutil.ReadFile(path)
if err != nil {
return err
}
return toml.Unmarshal(file, data)
}
// ReadJSON reads a config model from path of a yml file
func ReadJSON(path string, data interface{}) error {
file, err := os.Open(path)

View File

@ -8,24 +8,6 @@ import (
"github.com/stretchr/testify/assert"
)
func TestReadTOML(t *testing.T) {
assert := assert.New(t)
a := struct {
Text string `toml:"text"`
}{}
err := ReadTOML("testfiles/donoexists", &a)
assert.Error(err, "could find file ^^")
err = ReadTOML("testfiles/trash.txt", &a)
assert.Error(err, "could marshel file ^^")
err = ReadTOML("testfiles/ok.toml", &a)
assert.NoError(err)
assert.Equal("hallo", a.Text)
}
func TestReadJSON(t *testing.T) {
assert := assert.New(t)

53
file/toml.go Normal file
View File

@ -0,0 +1,53 @@
package file
import (
"os"
"time"
"github.com/naoina/toml"
)
// TOMLDuration a time.Duration inside toml files
type TOMLDuration time.Duration
// UnmarshalText implements encoding.TextUnmarshaler
func (d *TOMLDuration) UnmarshalText(data []byte) error {
duration, err := time.ParseDuration(string(data))
if err == nil {
*d = TOMLDuration(duration)
}
return err
}
// MarshalText implements encoding.TextMarshaler
func (d TOMLDuration) MarshalText() ([]byte, error) {
return []byte(time.Duration(d).String()), nil
}
// ReadTOML reads a config model from path of a toml file
func ReadTOML(file string, data interface{}) error {
f, err := os.Open(file)
if err != nil {
return err
}
defer f.Close()
return toml.NewDecoder(f).Decode(data)
}
// SaveTOML to path
func SaveTOML(outputFile string, data interface{}) error {
tmpFile := outputFile + ".tmp"
file, err := os.OpenFile(tmpFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
return err
}
err = toml.NewEncoder(file).Encode(data)
if err != nil {
return err
}
file.Close()
return os.Rename(tmpFile, outputFile)
}

53
file/toml_test.go Normal file
View File

@ -0,0 +1,53 @@
package file
import (
"io/ioutil"
"os"
"testing"
"github.com/stretchr/testify/assert"
)
func TestReadTOML(t *testing.T) {
assert := assert.New(t)
a := struct {
Text string `toml:"text"`
}{}
err := ReadTOML("testfiles/donoexists", &a)
assert.Error(err, "could find file ^^")
err = ReadTOML("testfiles/trash.txt", &a)
assert.Error(err, "could marshel file ^^")
err = ReadTOML("testfiles/ok.toml", &a)
assert.NoError(err)
assert.Equal("hallo", a.Text)
}
func TestSaveTOML(t *testing.T) {
assert := assert.New(t)
type to struct {
Value int `toml:"v"`
}
toSave := to{Value: 3}
tmpfile, _ := ioutil.TempFile("/tmp", "lib-json-testfile.json")
err := SaveTOML(tmpfile.Name(), &toSave)
assert.NoError(err, "could not save temp")
err = SaveTOML(tmpfile.Name(), 3)
assert.Error(err, "could not save func")
toSave.Value = 4
err = SaveTOML("/proc/readonly", &toSave)
assert.Error(err, "could not save to /dev/null")
testvalue := to{}
err = ReadTOML(tmpfile.Name(), &testvalue)
assert.NoError(err)
assert.Equal(3, testvalue.Value)
os.Remove(tmpfile.Name())
}

4
go.mod
View File

@ -3,7 +3,6 @@ module dev.sum7.eu/genofire/golang-lib
go 1.16
require (
github.com/BurntSushi/toml v0.3.1
github.com/bdlm/log v0.1.20
github.com/bdlm/std v1.0.1 // indirect
github.com/chenjiandongx/ginprom v0.0.0-20201217063207-fe11b7f55a35
@ -13,6 +12,9 @@ require (
github.com/gin-gonic/gin v1.7.2
github.com/go-gormigrate/gormigrate/v2 v2.0.0
github.com/google/uuid v1.2.0
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/naoina/go-stringutil v0.1.0 // indirect
github.com/naoina/toml v0.1.1
github.com/prometheus/client_golang v1.10.0
github.com/stretchr/testify v1.7.0
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a

7
go.sum
View File

@ -1,6 +1,5 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
@ -288,6 +287,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
@ -333,6 +334,10 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks=
github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8=
github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=