github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/pkg/config/remoteconfig/storage/file_storage.go (about) 1 package storage 2 3 import ( 4 "encoding/gob" 5 "os" 6 7 "github.com/ddev/ddev/pkg/config/remoteconfig/internal" 8 "github.com/ddev/ddev/pkg/config/remoteconfig/types" 9 ) 10 11 func NewFileStorage(fileName string) types.RemoteConfigStorage { 12 return &fileStorage{ 13 fileName: fileName, 14 loaded: false, 15 } 16 } 17 18 type fileStorage struct { 19 fileName string 20 loaded bool 21 data fileStorageData 22 } 23 24 // fileStorageData is the structure used for the file. 25 type fileStorageData struct { 26 RemoteConfig internal.RemoteConfig 27 } 28 29 func (s *fileStorage) Read() (remoteConfig internal.RemoteConfig, err error) { 30 err = s.loadData() 31 if err != nil { 32 return 33 } 34 35 return s.data.RemoteConfig, nil 36 } 37 38 func (s *fileStorage) Write(remoteConfig internal.RemoteConfig) (err error) { 39 s.data.RemoteConfig = remoteConfig 40 41 err = s.saveData() 42 43 return 44 } 45 46 // loadData reads the messages from the data file. 47 func (s *fileStorage) loadData() error { 48 // The cache is read once per run time, early exit if already loaded. 49 if s.loaded { 50 return nil 51 } 52 53 file, err := os.Open(s.fileName) 54 // If the file does not exists, early exit. 55 if err != nil { 56 s.loaded = true 57 58 return nil 59 } 60 61 defer file.Close() 62 63 decoder := gob.NewDecoder(file) 64 err = decoder.Decode(&s.data) 65 66 // If the file was properly read, mark the cache as loaded. 67 if err == nil { 68 s.loaded = true 69 } 70 71 return err 72 } 73 74 // saveData writes the messages to the message file. 75 func (s *fileStorage) saveData() error { 76 file, err := os.Create(s.fileName) 77 78 if err == nil { 79 defer file.Close() 80 81 encoder := gob.NewEncoder(file) 82 err = encoder.Encode(&s.data) 83 } 84 85 return err 86 }