aboutsummaryrefslogtreecommitdiff
path: root/lib/ini
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-11-17 00:05:32 +0700
committerShulhan <ms@kilabit.info>2023-11-17 00:05:32 +0700
commite87516306f4fa8b793451dfd7be34a1f9f91dfd3 (patch)
tree3d564958c5f04ecd6bf1ea65c52c66a472d7939b /lib/ini
parentd648ac73198f3a829c68a179c50643fca6cb66ed (diff)
downloadpakakeh.go-e87516306f4fa8b793451dfd7be34a1f9f91dfd3.tar.xz
lib/ini: create the file if its not exist on Open
Diffstat (limited to 'lib/ini')
-rw-r--r--lib/ini/ini.go50
-rw-r--r--lib/ini/ini_test.go4
2 files changed, 49 insertions, 5 deletions
diff --git a/lib/ini/ini.go b/lib/ini/ini.go
index b23c8025..a663b72f 100644
--- a/lib/ini/ini.go
+++ b/lib/ini/ini.go
@@ -6,8 +6,10 @@ package ini
import (
"bytes"
+ "errors"
"fmt"
"io"
+ "io/fs"
"os"
"reflect"
"sort"
@@ -28,14 +30,56 @@ type Ini struct {
}
// Open and parse INI formatted file.
+// If the file is not exist, it will be created.
//
// On fail it will return incomplete instance of Ini with an error.
func Open(filename string) (in *Ini, err error) {
- reader := newReader()
+ var (
+ logp = `Open`
- in, err = reader.parseFile(filename)
+ f *os.File
+ reader *reader
+ content []byte
+ )
- return
+ f, err = os.Open(filename)
+ if err != nil {
+ if !errors.Is(err, fs.ErrNotExist) {
+ return nil, fmt.Errorf(`%s: %w`, logp, err)
+ }
+
+ // Create the file if not exist.
+
+ f, err = os.Create(filename)
+ if err != nil {
+ return nil, fmt.Errorf(`%s: %w`, logp, err)
+ }
+
+ in = &Ini{}
+
+ return in, nil
+ }
+
+ content, err = io.ReadAll(f)
+ if err != nil {
+ goto out
+ }
+
+ reader = newReader()
+
+ reader.filename = filename
+
+ in, err = reader.Parse(content)
+out:
+ var errClose = f.Close()
+ if errClose != nil {
+ if err == nil {
+ err = fmt.Errorf(`%s: %w`, logp, errClose)
+ } else {
+ err = fmt.Errorf(`%s: %w: %w`, logp, err, errClose)
+ }
+ }
+ return in, err
}
// Parse INI format from text.
diff --git a/lib/ini/ini_test.go b/lib/ini/ini_test.go
index 6b4c3bfd..68ddbf85 100644
--- a/lib/ini/ini_test.go
+++ b/lib/ini/ini_test.go
@@ -138,7 +138,7 @@ func TestOpen(t *testing.T) {
expErr string
}{{
desc: "With no file",
- expErr: "open : no such file or directory",
+ expErr: "Open: open : no such file or directory",
}, {
desc: "With variable without section",
inFile: testdataVarWithoutSection,
@@ -167,7 +167,7 @@ func TestSave(t *testing.T) {
expErr string
}{{
desc: "With no file",
- expErr: "open : no such file or directory",
+ expErr: "Open: open : no such file or directory",
}, {
desc: "With variable without section",
inFile: testdataVarWithoutSection,