44 "context"
55 "encoding/json"
66 "os"
7+ "path/filepath"
78
89 "github.com/goark/errs"
910 "github.com/goark/toolbox/db"
@@ -26,33 +27,39 @@ type APOD struct {
2627}
2728
2829// New functions creates new APOD instance from file.
29- func New (ctx context.Context , path , cacheDir string , logger * log.ZapEventLogger ) (* APOD , error ) {
30+ func New (ctx context.Context , path , cacheDir string , logger * log.ZapEventLogger ) (cfg * APOD , err error ) {
3031 // open database
31- repos , err := db .Open (ctx , cacheDir , logger )
32- if err != nil {
33- return nil , errs .Wrap (err , errs .WithContext ("cache_dir" , cacheDir ))
32+ repos , ferr := db .Open (ctx , cacheDir , logger )
33+ if ferr != nil {
34+ err = errs .Wrap (ferr , errs .WithContext ("cache_dir" , cacheDir ))
35+ return
3436 }
3537
3638 // read configuration file
3739 if len (path ) == 0 {
38- return fallthroughCfg (repos , logger ), nil
40+ cfg = fallthroughCfg (repos , logger )
41+ return
3942 }
40- file , err := os .Open (path )
41- if err != nil {
42- return fallthroughCfg (repos , logger ), nil
43+ file , ferr := os .Open (filepath .Clean (path ))
44+ if ferr != nil {
45+ cfg = fallthroughCfg (repos , logger )
46+ return
4347 }
44- defer file .Close ()
45- var cfg APOD
46- if err := json .NewDecoder (file ).Decode (& cfg ); err != nil {
47- return nil , errs .Wrap (err , errs .WithContext ("path" , path ))
48+ defer func () {
49+ err = errs .Join (err , file .Close ())
50+ }()
51+ var vcfg APOD
52+ if jerr := json .NewDecoder (file ).Decode (& vcfg ); jerr != nil {
53+ err = errs .Wrap (jerr , errs .WithContext ("path" , path ))
54+ return
4855 }
49- cfg .logger = logger
50- cfg .cacheDir = cacheDir
51- cfg .repos = repos
52- cfg .cache = map [string ]* nasaapod.Response {}
53- cfg .saveData = []* nasaapod.Response {}
54-
55- return & cfg , nil
56+ vcfg .logger = logger
57+ vcfg .cacheDir = cacheDir
58+ vcfg .repos = repos
59+ vcfg .cache = map [string ]* nasaapod.Response {}
60+ vcfg .saveData = []* nasaapod.Response {}
61+ cfg = & vcfg
62+ return
5663}
5764
5865func fallthroughCfg (repos * db.Repository , logger * log.ZapEventLogger ) * APOD {
@@ -74,23 +81,28 @@ func (cfg *APOD) Logger() *zap.Logger {
7481}
7582
7683// Export methods exports configuration to config file.
77- func (cfg * APOD ) Export (path string ) error {
84+ func (cfg * APOD ) Export (path string ) ( err error ) {
7885 if cfg == nil {
79- return errs .Wrap (ecode .ErrNullPointer )
86+ err = errs .Wrap (ecode .ErrNullPointer )
87+ return
8088 }
81- file , err := os .OpenFile (path , os .O_RDWR | os .O_CREATE , 0600 )
82- if err != nil {
83- return errs .Wrap (err , errs .WithContext ("path" , path ))
89+ file , ferr := os .OpenFile (filepath .Clean (path ), os .O_RDWR | os .O_CREATE , 0600 )
90+ if ferr != nil {
91+ err = errs .Wrap (ferr , errs .WithContext ("path" , path ))
92+ return
8493 }
85- defer file .Close ()
94+ defer func () {
95+ err = errs .Join (err , file .Close ())
96+ }()
8697
87- if err := json .NewEncoder (file ).Encode (cfg ); err != nil {
88- return errs .Wrap (err , errs .WithContext ("path" , path ))
98+ if jerr := json .NewEncoder (file ).Encode (cfg ); jerr != nil {
99+ err = errs .Wrap (jerr , errs .WithContext ("path" , path ))
100+ return
89101 }
90- return nil
102+ return
91103}
92104
93- /* Copyright 2023-2024 Spiegel
105+ /* Copyright 2023-2026 Spiegel
94106 *
95107 * Licensed under the Apache License, Version 2.0 (the "License");
96108 * you may not use this file except in compliance with the License.
0 commit comments