aboutsummaryrefslogtreecommitdiff
path: root/lib/ini
diff options
context:
space:
mode:
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,