From e87516306f4fa8b793451dfd7be34a1f9f91dfd3 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Fri, 17 Nov 2023 00:05:32 +0700 Subject: lib/ini: create the file if its not exist on Open --- lib/ini/ini.go | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- lib/ini/ini_test.go | 4 ++-- 2 files changed, 49 insertions(+), 5 deletions(-) (limited to 'lib/ini') 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, -- cgit v1.3