github.com/pavlo67/common@v0.5.3/common/serialization/any.go (about)

     1  package serialization
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/pavlo67/common/common/filelib"
     8  )
     9  
    10  const onSave = "on serialization.Save()"
    11  
    12  func Save(data interface{}, marshaler Marshaler, filename string) error {
    13  	dataBytes, err := marshaler.Marshal(data)
    14  	if err != nil {
    15  		return fmt.Errorf("saving %#v got: %s / "+onSave, data, err)
    16  	}
    17  
    18  	if err := os.WriteFile(filename, dataBytes, 0644); err != nil {
    19  		return fmt.Errorf("saving %s got: %s / "+onSave, filename, err)
    20  	}
    21  
    22  	return nil
    23  }
    24  
    25  const onRead = "on serialization.Read()"
    26  
    27  func Read(filename string, marshaler Marshaler, data interface{}) error {
    28  	dataBytes, err := os.ReadFile(filename)
    29  	if err != nil {
    30  		return fmt.Errorf("reading %s got: %s / "+onRead, filename, err)
    31  	}
    32  
    33  	if err := marshaler.Unmarshal(dataBytes, data); err != nil {
    34  		return fmt.Errorf("unmarshaling %s got: %s / "+onRead, dataBytes, err)
    35  	}
    36  
    37  	return nil
    38  }
    39  
    40  const onReadIfExists = "on serialization.ReadIfExists()"
    41  
    42  func ReadIfExists(path string, marshaler Marshaler, data interface{}) (ok bool, err error) {
    43  	exists, isDir := filelib.FileExistsAny(path)
    44  	if !exists {
    45  		return false, nil
    46  	} else if isDir {
    47  		return false, fmt.Errorf("%s is a directory / "+onReadIfExists, path)
    48  	}
    49  
    50  	dataBytes, err := os.ReadFile(path)
    51  	if err != nil {
    52  		return false, fmt.Errorf("reading %s got: %s / "+onReadIfExists, path, err)
    53  	}
    54  
    55  	if err := marshaler.Unmarshal(dataBytes, data); err != nil {
    56  		return false, fmt.Errorf("unmarshaling %s got: %s / "+onReadIfExists, dataBytes, err)
    57  	}
    58  
    59  	return true, nil
    60  }