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  }