github.com/packtpublishing/learning-functional-programming-in-go@v0.0.0-20230130084745-8b849f6d58c4/Chapter06/04_onion/src/domain/log_file.go (about) 1 package domain 2 3 import ( 4 "os" 5 "io" 6 "encoding/json" 7 "github.com/pkg/errors" 8 ) 9 10 type User struct { 11 UserId int `json:"userId"` 12 Country string `json:"country"` 13 DeviceType string `json:"deviceType"` 14 IP string `json:"ip"` 15 SrcPort int `json:"srcPort"` 16 } 17 18 type LogFile struct { 19 EventId int `json:"eventId"` 20 Timestamp int64 `json:"timestamp"` 21 Description string `json:"description"` 22 User 23 } 24 25 func NewLogFile(logfileJson string) (logFile *LogFile, err error) { 26 err = json.Unmarshal([]byte(logfileJson), &logFile) 27 if err != nil { 28 return nil, errors.Wrap(err, "unable to unmarshal json") 29 } 30 return 31 } 32 33 func (lf *LogFile) ToJson() (logFileJson string, err error) { 34 logFileBytes, err := json.Marshal(lf) 35 if err != nil { 36 return "", errors.Wrap(err, "unable to marshal json") 37 } 38 logFileJson = string(logFileBytes) 39 return 40 } 41 42 func (lf *LogFile) Write(logFilename, contents string) (err error) { 43 overwrite := true 44 flag := os.O_WRONLY | os.O_CREATE 45 if overwrite { 46 flag |= os.O_TRUNC 47 } else { 48 flag |= os.O_EXCL 49 } 50 osFile, err := os.OpenFile(logFilename, flag, 0666) 51 if err != nil { 52 return errors.Wrapf(err, "unable to open %s", logFilename) 53 } 54 bytes := []byte(contents) 55 n, err := osFile.Write(bytes) 56 if err == nil && n < len(bytes) { 57 err = io.ErrShortWrite 58 return errors.Wrapf(io.ErrShortWrite, "not all bytes written for %s", logFilename) 59 } 60 if err1 := osFile.Close(); err1 != nil { 61 return errors.Wrapf(err, "unable to close %s", logFilename) 62 } 63 return 64 }