From 30535269cef5c4ae318975be130d5c429bce95ee Mon Sep 17 00:00:00 2001 From: Jean-Marc MEESSEN Date: Tue, 9 Jun 2020 13:35:34 +0200 Subject: [PATCH] Added Date field parsing --- cmd/fle_date.go | 38 ++++++++++++++++++++++++++++++++++++++ cmd/fle_date_test.go | 38 ++++++++++++++++++++++++++++++++++++++ cmd/load.go | 20 ++++++++++++++++++-- 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 cmd/fle_date.go create mode 100644 cmd/fle_date_test.go diff --git a/cmd/fle_date.go b/cmd/fle_date.go new file mode 100644 index 0000000..e2ab9e5 --- /dev/null +++ b/cmd/fle_date.go @@ -0,0 +1,38 @@ +package cmd +/* +Copyright © 2020 Jean-Marc Meessen, ON4KJM + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import ( + "strings" + "fmt" + "time" +) + +// ValidateDate verifies whether the string is a valid date (YYYY-MM-DD). +func ValidateDate(inputStr string) (ref, errorMsg string) { + + const RFC3339FullDate = "2006-01-02" + + inputStr = strings.ToUpper(strings.TrimSpace(inputStr)) + wrongInputStr := "*" + inputStr + _, err := time.Parse(RFC3339FullDate, inputStr) + + if err == nil { + return inputStr, "" + } + + return wrongInputStr, fmt.Sprint(err) +} \ No newline at end of file diff --git a/cmd/fle_date_test.go b/cmd/fle_date_test.go new file mode 100644 index 0000000..62b7426 --- /dev/null +++ b/cmd/fle_date_test.go @@ -0,0 +1,38 @@ +package cmd + +import "testing" + +func TestValidateDate(t *testing.T) { + type args struct { + inputStr string + } + tests := []struct { + name string + args args + wantRef string + wantErrorMsg string + }{ + { + "Good date (simple)", + args{ inputStr: "2020-06-10", }, + "2020-06-10", "", + }, + { + "Bad date (simple)", + args{ inputStr: "2020-13-10", }, + "*2020-13-10", "parsing time \"2020-13-10\": month out of range", + }, + + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotRef, gotErrorMsg := ValidateDate(tt.args.inputStr) + if gotRef != tt.wantRef { + t.Errorf("ValidateDate() gotRef = %v, want %v", gotRef, tt.wantRef) + } + if gotErrorMsg != tt.wantErrorMsg { + t.Errorf("ValidateDate() gotErrorMsg = %v, want %v", gotErrorMsg, tt.wantErrorMsg) + } + }) + } +} diff --git a/cmd/load.go b/cmd/load.go index 7935f2a..ba77403 100644 --- a/cmd/load.go +++ b/cmd/load.go @@ -84,7 +84,7 @@ func loadFile() { regexpHeaderMySota, _ := regexp.Compile("(?i)^mysota ") regexpHeaderQslMsg, _ := regexp.Compile("(?i)^qslmsg ") regexpHeaderNickname, _ := regexp.Compile("(?i)^nickname ") - // regexpHeaderDate, _ := regexp.Compile("(?i)^date ") + regexpHeaderDate, _ := regexp.Compile("(?i)^date ") headerMyCall := "" headerOperator := "" @@ -92,6 +92,7 @@ func loadFile() { headerMySOTA := "" headerQslMsg := "" headerNickname := "" + headerDate := "" lineCount := 0 var isInMultiLine = false @@ -208,7 +209,7 @@ func loadFile() { continue } - //QSL Message + //Nickname if(regexpHeaderNickname.MatchString(eachline)) { myNicknameList := regexpHeaderNickname.Split(eachline,-1) if(len(myNicknameList[1]) > 0) { @@ -219,6 +220,21 @@ func loadFile() { continue } + // Date + if(regexpHeaderDate.MatchString(eachline)) { + errorMsg := "" + myDateList := regexpHeaderDate.Split(eachline,-1) + if(len(myDateList[1]) > 0) { + headerDate, errorMsg = ValidateDate(myDateList[1]) + cleanedInput = append(cleanedInput, fmt.Sprintf("Date: %s", headerDate)) + if(len(errorMsg) != 0) { + errorLog = append(errorLog, fmt.Sprintf("Invalid Date at line %d: %s (%s)",lineCount, myDateList[1], errorMsg)) + } + } + //If there is no data after the marker, we just skip the data. + continue + } + // **** // ** Process the data block // ****