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 }