diff options
| -rw-r--r-- | lib/ini/ini.go | 50 | ||||
| -rw-r--r-- | lib/ini/ini_test.go | 4 |
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, |
