From 160e26623b10c4e7c0df5e797a12fdf12f877463 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Sun, 25 Jan 2026 01:52:35 -0700 Subject: [PATCH] f: trying to find where the pieces go --- net/smsgw/cmd/sendsms/main.go | 19 +++++++++++------ net/smsgw/smscsv/smscsv.go | 40 ++++++++++++++++++++++++++++++----- net/smsgw/smstmpl/smstmpl.go | 24 ++++----------------- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/net/smsgw/cmd/sendsms/main.go b/net/smsgw/cmd/sendsms/main.go index 4893078..628eea5 100644 --- a/net/smsgw/cmd/sendsms/main.go +++ b/net/smsgw/cmd/sendsms/main.go @@ -15,6 +15,7 @@ import ( "github.com/therootcompany/golib/net/smsgw" "github.com/therootcompany/golib/net/smsgw/androidsmsgateway" "github.com/therootcompany/golib/net/smsgw/smscsv" + "github.com/therootcompany/golib/net/smsgw/smstmpl" ) type MainConfig struct { @@ -143,6 +144,12 @@ func main() { } fmt.Fprintf(os.Stderr, "Info: list of %d messages\n", len(messages)) + messages, err = smstmpl.RenderAll(messages) + if err != nil { + fmt.Fprintf(os.Stderr, "\n%sError%s: %v\n", textErr, textReset, err) + os.Exit(1) + } + if now.After(cfg.endTime) || now.Equal(cfg.endTime) { fmt.Fprintf(os.Stderr, "%sWarning%s: Too late now. %sWaiting until tomorrow%s:\n", textWarn, textReset, textWarn, textReset) @@ -232,9 +239,9 @@ func main() { fmt.Fprintf(os.Stderr, "\n") fmt.Fprintf(os.Stderr, "Info: This is what a %ssample message%s from list look like:\n", textInfo, textReset) fmt.Fprintf(os.Stderr, "\n") - fmt.Fprintf(os.Stderr, " To: %s (%s)\n", messages[0].Number, messages[0].Name) - fmt.Fprintf(os.Stderr, " %s%s%s\n", textTmpl, messages[0].Template, textReset) - fmt.Fprintf(os.Stderr, " %s%s%s\n", textInfo, messages[0].Text, textReset) + fmt.Fprintf(os.Stderr, " To: %s (%s)\n", messages[0].Number, messages[0].Name()) + fmt.Fprintf(os.Stderr, " %s%s%s\n", textTmpl, messages[0].Template(), textReset) + fmt.Fprintf(os.Stderr, " %s%s%s\n", textInfo, messages[0].Text(), textReset) fmt.Fprintf(os.Stderr, "\n") if !cfg.confirmed && !cfg.dryRun { @@ -283,16 +290,16 @@ func main() { fmt.Fprintf(os.Stderr, "# Send to %s (%s) %s-%s\n", message.Number[:2], message.Number[2:5], message.Number[5:8], message.Number[8:]) if cfg.printCurl { - curl := sender.CurlString(message.Number, message.Text) + curl := sender.CurlString(message.Number, message.Text()) fmt.Println(curl) } else { - fmt.Fprintf(os.Stderr, "%s\n", message.Text) + fmt.Fprintf(os.Stderr, "%s\n", message.Text()) } if cfg.dryRun { continue } - if err := sender.Send(message.Number, message.Text); err != nil { + if err := sender.Send(message.Number, message.Text()); err != nil { fmt.Fprintf(os.Stderr, "%sError%s: %v\n", textErr, textReset, err) continue } diff --git a/net/smsgw/smscsv/smscsv.go b/net/smsgw/smscsv/smscsv.go index 8763122..77719bf 100644 --- a/net/smsgw/smscsv/smscsv.go +++ b/net/smsgw/smscsv/smscsv.go @@ -5,6 +5,8 @@ import ( "io" "slices" "strings" + + "github.com/therootcompany/golib/net/smsgw" ) type Reader interface { @@ -27,11 +29,27 @@ type Message struct { header []string indices map[string]int fields []string - Name string + name string Number string - Template string + template string Vars map[string]string - Text string + text string +} + +func (m Message) Name() string { + return m.name +} + +func (m Message) Template() string { + return m.template +} + +func (m Message) Text() string { + return m.text +} + +func (m *Message) SetText(text string) { + m.text = text } func (m Message) Size() int { @@ -104,12 +122,24 @@ func ReadOrIgnoreAll(csvr Reader) (messages []Message, warns []CSVWarn, err erro message := Message{ // Index: rowIndex, - Name: strings.TrimSpace(rec[FIELD_NAME]), + name: strings.TrimSpace(rec[FIELD_NAME]), Number: strings.TrimSpace(rec[FIELD_PHONE]), - Template: strings.TrimSpace(rec[FIELD_MESSAGE]), + template: strings.TrimSpace(rec[FIELD_MESSAGE]), Vars: vars, } + message.Number = smsgw.StripFormatting(message.Number) + message.Number, err = smsgw.PrefixUS10Digit(message.Number) + if err != nil { + warns = append(warns, CSVWarn{ + Index: rowIndex, + Code: "PhoneInvalid", + Message: fmt.Sprintf("ignoring row %d (%s): %s", rowIndex, message.Name(), err.Error()), + // Record: rec, + }) + continue + } + messages = append(messages, message) } diff --git a/net/smsgw/smstmpl/smstmpl.go b/net/smsgw/smstmpl/smstmpl.go index 5a8ed45..0e6cfa7 100644 --- a/net/smsgw/smstmpl/smstmpl.go +++ b/net/smsgw/smstmpl/smstmpl.go @@ -7,46 +7,30 @@ import ( "slices" "strings" - "github.com/therootcompany/golib/net/smsgw" "github.com/therootcompany/golib/net/smsgw/smscsv" ) var reUnmatchedVars = regexp.MustCompile(`(\{[^}]+\})`) func RenderAll(messages []smscsv.Message) ([]smscsv.Message, error) { - var err error - var warns []smscsv.CSVWarn - for i, message := range messages { rowIndex := i + 1 - message.Text = ReplaceVar(message.Template, "Name", message.Name) + message.SetText(ReplaceVar(message.Template(), "Name", message.Name())) keyIter := maps.Keys(message.Vars) keys := slices.Sorted(keyIter) for _, key := range keys { val := message.Vars[key] - message.Text = ReplaceVar(message.Text, key, val) + message.SetText(ReplaceVar(message.Text(), key, val)) } - message.Number = smsgw.StripFormatting(message.Number) - message.Number, err = smsgw.PrefixUS10Digit(message.Number) - if err != nil { - warns = append(warns, smscsv.CSVWarn{ - Index: rowIndex, - Code: "PhoneInvalid", - Message: fmt.Sprintf("ignoring row %d (%s): %s", rowIndex, message.Name, err.Error()), - // Record: rec, - }) - continue - } - - if tmpls := reUnmatchedVars.FindAllString(message.Text, -1); len(tmpls) != 0 { + if tmpls := reUnmatchedVars.FindAllString(message.Text(), -1); len(tmpls) != 0 { return nil, &smscsv.CSVWarn{ Index: rowIndex, Code: "UnmatchedVars", Message: fmt.Sprintf( "failing due to row %d (%s): leftover template variable(s): %s", - rowIndex, message.Name, strings.Join(tmpls, " "), + rowIndex, message.Name(), strings.Join(tmpls, " "), ), // Record: rec, }