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  }