From a96961ddd574658c50575f6381d6271f2141261e Mon Sep 17 00:00:00 2001 From: vault-thirteen <54213347+vault-thirteen@users.noreply.github.com> Date: Mon, 23 Sep 2024 15:11:09 +0300 Subject: [PATCH] Better error handling --- cmd/hasher/check.go | 16 +++++--- cmd/hasher/main.go | 4 +- pkg/Models/Check/Check.go | 12 +++--- pkg/Models/Check/CheckCounter.go | 7 ++-- .../CommandLineArguments.go | 4 +- pkg/Models/Hashing/Hashing.go | 37 ++++++------------- pkg/Models/Hashing/calculate.go | 4 +- 7 files changed, 37 insertions(+), 47 deletions(-) diff --git a/cmd/hasher/check.go b/cmd/hasher/check.go index c13c506..7a2b862 100644 --- a/cmd/hasher/check.go +++ b/cmd/hasher/check.go @@ -1,7 +1,9 @@ package main import ( + "fmt" "io" + "log" "os" ch "github.com/vault-thirteen/Hasher/pkg/Models/Check" @@ -15,6 +17,7 @@ import ( const ( ErrFolderCheckIsNotPossible = "folder check is not possible, use file check" + ErrFErrorOnLine = "Error on line %v." ) func checkHash(args *cla.CommandLineArguments) (results *ch.Check, err error) { @@ -51,11 +54,18 @@ func checkHashesInFile(args *cla.CommandLineArguments) (results *ch.Check, err e var rdr = reader.New(f) var line []byte + var lineN int = 1 results = ch.NewCheck() var hashText string var hash any var result *ch.CheckedFile + defer func() { + if err != nil { + log.Println(fmt.Sprintf(ErrFErrorOnLine, lineN)) + } + }() + for { line, err = rdr.ReadLineEndingWithCRLF() if err != nil { @@ -66,11 +76,6 @@ func checkHashesInFile(args *cla.CommandLineArguments) (results *ch.Check, err e } } - if len(line) == 0 { - results.AddFile(nil) - continue - } - result = &ch.CheckedFile{} hashText, result.Path, err = hasher.ParseFileLine(line) @@ -89,6 +94,7 @@ func checkHashesInFile(args *cla.CommandLineArguments) (results *ch.Check, err e } results.AddFile(result) + lineN++ continue } diff --git a/cmd/hasher/main.go b/cmd/hasher/main.go index c7a7711..fb80763 100644 --- a/cmd/hasher/main.go +++ b/cmd/hasher/main.go @@ -34,8 +34,8 @@ Notes: func main() { args, err := cla.New() if err != nil { - log.Println(err) showIntro() + log.Println(err) showUsage() os.Exit(1) return @@ -72,7 +72,7 @@ func work(args *cla.CommandLineArguments) (err error) { func mustBeNoError(err error) { if err != nil { - panic(err) + log.Fatalln(err.Error()) } } diff --git a/pkg/Models/Check/Check.go b/pkg/Models/Check/Check.go index fe41645..95698d2 100644 --- a/pkg/Models/Check/Check.go +++ b/pkg/Models/Check/Check.go @@ -25,7 +25,7 @@ func (c *Check) AddFile(file *CheckedFile) { c.Counter.Total++ if file == nil { - c.Counter.Damaged++ + c.Counter.Bad++ return } @@ -39,11 +39,9 @@ func (c *Check) AddFile(file *CheckedFile) { } func (c *Check) PrintReport() { - nBD := c.Counter.Bad + c.Counter.Damaged - - // IF all files are good. - if nBD == 0 { - fmt.Println(fmt.Sprintf(TplSummary, c.Counter.Total, c.Counter.Good, nBD)) + // If all files are good. + if c.Counter.Bad == 0 { + fmt.Println(fmt.Sprintf(TplSummary, c.Counter.Total, c.Counter.Good, c.Counter.Bad)) fmt.Println(MsgAllClear) return } @@ -69,5 +67,5 @@ func (c *Check) PrintReport() { // 3. Summary. fmt.Println(TplHr) - fmt.Println(fmt.Sprintf(TplSummary, c.Counter.Total, c.Counter.Good, nBD)) + fmt.Println(fmt.Sprintf(TplSummary, c.Counter.Total, c.Counter.Good, c.Counter.Bad)) } diff --git a/pkg/Models/Check/CheckCounter.go b/pkg/Models/Check/CheckCounter.go index 72ca805..5e8237f 100644 --- a/pkg/Models/Check/CheckCounter.go +++ b/pkg/Models/Check/CheckCounter.go @@ -1,8 +1,7 @@ package ch type CheckCounter struct { - Good int - Bad int - Damaged int - Total int + Good int + Bad int + Total int } diff --git a/pkg/Models/CommandLineArguments/CommandLineArguments.go b/pkg/Models/CommandLineArguments/CommandLineArguments.go index 39b3ae6..e50a7fe 100644 --- a/pkg/Models/CommandLineArguments/CommandLineArguments.go +++ b/pkg/Models/CommandLineArguments/CommandLineArguments.go @@ -11,8 +11,8 @@ import ( ) const ( - ErrSyntax = "syntax error" - ErrObjectIsNotFound = "object is not found" + ErrSyntax = "syntax error in command line arguments" + ErrObjectIsNotFound = "target object is not found" ) type CommandLineArguments struct { diff --git a/pkg/Models/Hashing/Hashing.go b/pkg/Models/Hashing/Hashing.go index 1f6245d..29d073b 100644 --- a/pkg/Models/Hashing/Hashing.go +++ b/pkg/Models/Hashing/Hashing.go @@ -41,67 +41,53 @@ func (h *Hashing) GetType() (ht ht.HashType) { func (h *Hashing) Calculate(file string) (result *HashingResult, err error) { var data any + var resultType HashingResultType switch h.typ.ID() { case ht.Id_FileExistence: + resultType = HashingResultType_Boolean data, err = checkFileExistence(file) if err != nil { return nil, err } - result, err = NewHashingResult(data, HashingResultType_Boolean) - if err != nil { - return nil, err - } - case ht.Id_FileSize: + resultType = HashingResultType_Integer data, err = getFileSize(file) if err != nil { return nil, err } - result, err = NewHashingResult(data, HashingResultType_Integer) - if err != nil { - return nil, err - } - case ht.Id_CRC32: + resultType = HashingResultType_Binary data, err = calculateBinaryFileHash(file, ht.Id_CRC32) if err != nil { return nil, err } - result, err = NewHashingResult(data, HashingResultType_Binary) - if err != nil { - return nil, err - } - case ht.Id_MD5: + resultType = HashingResultType_Binary data, err = calculateBinaryFileHash(file, ht.Id_MD5) if err != nil { return nil, err } - result, err = NewHashingResult(data, HashingResultType_Binary) - if err != nil { - return nil, err - } - case ht.Id_SHA256: + resultType = HashingResultType_Binary data, err = calculateBinaryFileHash(file, ht.Id_SHA256) if err != nil { return nil, err } - result, err = NewHashingResult(data, HashingResultType_Binary) - if err != nil { - return nil, err - } - default: return nil, c.Error(ht.ErrUnknownHashType) } + result, err = NewHashingResult(data, resultType) + if err != nil { + return nil, err + } + return result, nil } @@ -188,6 +174,7 @@ func (h *Hashing) ParseFileLine(line []byte) (hashText string, filePath string, return hashText, filePath, nil } + // Hash sum is not a byte array. var p1, p2 string p1, p2, err = splitLine(line) if err != nil { diff --git a/pkg/Models/Hashing/calculate.go b/pkg/Models/Hashing/calculate.go index 1b9c2de..f5170a7 100644 --- a/pkg/Models/Hashing/calculate.go +++ b/pkg/Models/Hashing/calculate.go @@ -12,7 +12,7 @@ func calculateBinaryFileHash(filePath string, hti ht.HashTypeId) (sum []byte, er var data []byte data, err = af.GetFileContents(filePath) if err != nil { - return sum, err + return nil, err } switch hti { @@ -46,7 +46,7 @@ func getFileSize(filePath string) (fileSize int, err error) { var fi os.FileInfo fi, err = os.Stat(filePath) if err != nil { - return 0, err + return -1, err } x := fi.Size()