package parser import ( "bufio" "encoding/json" "fmt" "log" "os" "strings" "unicode" "git.kundeng.us/phoenix/textsender-models/pkg/contact" ) const Letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" type NumberParser struct { FilePath string } func (prsr *NumberParser) FileDump() []contact.Contact { fmt.Println("Dumping files") objs := []contact.Contact{} for _, line := range prsr.readLines(prsr.FilePath) { if strings.ContainsAny(line, Letters) { continue } myObj := contact.Contact{PhoneNumber: line} if myObj.PhoneNumber != "" { objs = append(objs, myObj) } } objs = prsr.updateContacts(objs) objs = prsr.removeDups(objs) return objs } func (prsr *NumberParser) updateContacts(contacts []contact.Contact) []contact.Contact { updated := []contact.Contact{} for _, ct := range contacts { parsed := ct.PhoneNumber if len(parsed) < 2 { fmt.Println("Invalid number:", parsed) continue } pars := prsr.removeSomeData(parsed) parsed = pars fmt.Println(parsed) updatedParsed := prsr.addPrefix(parsed) updated = append(updated, contact.Contact{PhoneNumber: updatedParsed}) } return updated } func (prsr *NumberParser) removeDups(contacts []contact.Contact) []contact.Contact { updated := []contact.Contact{} uniqueItems := make(map[string]string) for _, val := range contacts { uniqueItems[val.PhoneNumber] = val.PhoneNumber } for _, item := range uniqueItems { updated = append(updated, contact.Contact{PhoneNumber: item}) } return updated } func (prsr NumberParser) PrintValues(contacts []contact.Contact, printTotal bool) { fmt.Println("Printing numbers") for _, ct := range contacts { fmt.Println("Number:", ct.PhoneNumber) } if printTotal { fmt.Println("Total Numbers:", len(contacts)) } } func (prsr NumberParser) SaveFile(vals []contact.Contact) { filename := "numbers.json" // Create json and save it to the filesystem jsonData, err := json.MarshalIndent(&vals, "", " ") if err != nil { fmt.Println("Error marshaling JSON:", err) return } err = os.WriteFile(filename, jsonData, 0644) if err != nil { fmt.Println("Error writing file:", err) return } } func (prsr NumberParser) readLines(filename string) []string { // Open the file file, err := os.Open(filename) if err != nil { log.Fatal(err) } defer file.Close() // Create a scanner to read the file line by line scanner := bufio.NewScanner(file) lines := []string{} // Read line by line for scanner.Scan() { line := scanner.Text() lines = append(lines, line) } // Check for any errors during scanning if err := scanner.Err(); err != nil { log.Fatal(err) } return lines } func (prsr NumberParser) removeSomeData(unparsed string) string { parsed := "" for _, ch := range unparsed { if ch == ' ' { continue } else { if unicode.IsDigit(ch) { parsed += string(ch) } } } fmt.Println("Parsed:", parsed) return parsed } func (prsr NumberParser) addPrefix(raw string) string { parsed := raw firstChar := raw[0] secondChar := raw[1] if firstChar == '1' { parsed = "+" + parsed } else if firstChar != '+' { if secondChar != '1' { parsed = "+1" + parsed } else { parsed = "+1" + parsed } } return parsed }