Skip to content

Commit 42f2774

Browse files
authored
refactor: extract util package from main.go (#22)
* refactor: extract util package from main.go Extract TrimQuotes, FixEscapeQuotes, and Contains utility functions to internal/util package with full test coverage. * refactor: remove unused Contains wrapper function The Contains function was dead code - the original was never called, and the wrapper just delegated to slices.Contains which is available in the standard library since Go 1.21.
1 parent 2fb5cf3 commit 42f2774

3 files changed

Lines changed: 87 additions & 40 deletions

File tree

cmd/ocap_recorder/main.go

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/OCAP2/extension/internal/influx"
3535
"github.com/OCAP2/extension/internal/model"
3636
"github.com/OCAP2/extension/internal/queue"
37+
"github.com/OCAP2/extension/internal/util"
3738
"github.com/OCAP2/extension/pkg/a3interface"
3839

3940
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
@@ -489,7 +490,7 @@ func setupA3Interface() (err error) {
489490
a3interface.WriteArmaCallback(ExtensionName, ":GETDIR:OCAPLOG:", OcapLogFilePath)
490491
// RVExtArgsDataChannels
491492
case data := <-RVExtArgsDataChannels[":ADDON:VERSION:"]:
492-
addonVersion = fixEscapeQuotes(trimQuotes(data[0]))
493+
addonVersion = util.FixEscapeQuotes(util.TrimQuotes(data[0]))
493494
Logger.Info().Str("version", addonVersion).Msg("Addon version")
494495
case data := <-RVExtArgsDataChannels[":NEW:MISSION:"]:
495496
go logNewMission(data)
@@ -622,7 +623,7 @@ func processMetricData(data []string) (
622623
point *influxdb2_write.Point,
623624
err error,
624625
) {
625-
return influx.ProcessMetricData(data, fixEscapeQuotes, trimQuotes)
626+
return influx.ProcessMetricData(data, util.FixEscapeQuotes, util.TrimQuotes)
626627
}
627628

628629
///////////////////////
@@ -1032,7 +1033,7 @@ func logNewMission(data []string) (err error) {
10321033

10331034
// fix received data
10341035
for i, v := range data {
1035-
data[i] = fixEscapeQuotes(trimQuotes(v))
1036+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
10361037
}
10371038

10381039
world := model.World{}
@@ -1188,7 +1189,7 @@ func logNewSoldier(data []string) (soldier model.Soldier, err error) {
11881189

11891190
// fix received data
11901191
for i, v := range data {
1191-
data[i] = fixEscapeQuotes(trimQuotes(v))
1192+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
11921193
}
11931194

11941195
// get frame
@@ -1249,7 +1250,7 @@ func logSoldierState(data []string) (soldierState model.SoldierState, err error)
12491250

12501251
// fix received data
12511252
for i, v := range data {
1252-
data[i] = fixEscapeQuotes(trimQuotes(v))
1253+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
12531254
}
12541255

12551256
soldierState.MissionID = CurrentMission.ID
@@ -1375,7 +1376,7 @@ func logNewVehicle(data []string) (vehicle model.Vehicle, err error) {
13751376

13761377
// fix received data
13771378
for i, v := range data {
1378-
data[i] = fixEscapeQuotes(trimQuotes(v))
1379+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
13791380
}
13801381

13811382
// get frame
@@ -1417,7 +1418,7 @@ func logVehicleState(data []string) (vehicleState model.VehicleState, err error)
14171418

14181419
// fix received data
14191420
for i, v := range data {
1420-
data[i] = fixEscapeQuotes(trimQuotes(v))
1421+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
14211422
}
14221423

14231424
vehicleState.MissionID = CurrentMission.ID
@@ -1534,7 +1535,7 @@ func logFiredEvent(data []string) (firedEvent model.FiredEvent, err error) {
15341535

15351536
// fix received data
15361537
for i, v := range data {
1537-
data[i] = fixEscapeQuotes(trimQuotes(v))
1538+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
15381539
}
15391540

15401541
firedEvent.MissionID = CurrentMission.ID
@@ -1607,7 +1608,7 @@ func logProjectileEvent(data []string) (projectileEvent model.ProjectileEvent, e
16071608

16081609
// fix received data
16091610
for i, v := range data {
1610-
data[i] = fixEscapeQuotes(trimQuotes(v))
1611+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
16111612
}
16121613

16131614
projectileEvent.MissionID = CurrentMission.ID
@@ -1806,24 +1807,14 @@ func logProjectileEvent(data []string) (projectileEvent model.ProjectileEvent, e
18061807
return projectileEvent, nil
18071808
}
18081809

1809-
func contains(s []string, str string) bool {
1810-
for _, v := range s {
1811-
if v == str {
1812-
return true
1813-
}
1814-
}
1815-
1816-
return false
1817-
}
1818-
18191810
// function to process events of different kinds
18201811
func logGeneralEvent(data []string) (thisEvent model.GeneralEvent, err error) {
18211812

18221813
functionName := ":EVENT:"
18231814

18241815
// fix received data
18251816
for i, v := range data {
1826-
data[i] = fixEscapeQuotes(trimQuotes(v))
1817+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
18271818
}
18281819

18291820
// get frame
@@ -1871,7 +1862,7 @@ func logHitEvent(data []string) (hitEvent model.HitEvent, err error) {
18711862

18721863
// fix received data
18731864
for i, v := range data {
1874-
data[i] = fixEscapeQuotes(trimQuotes(v))
1865+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
18751866
}
18761867

18771868
// get frame
@@ -1949,7 +1940,7 @@ func logKillEvent(data []string) (killEvent model.KillEvent, err error) {
19491940

19501941
// fix received data
19511942
for i, v := range data {
1952-
data[i] = fixEscapeQuotes(trimQuotes(v))
1943+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
19531944
}
19541945

19551946
// get frame
@@ -2031,7 +2022,7 @@ func logChatEvent(data []string) (chatEvent model.ChatEvent, err error) {
20312022

20322023
// fix received data
20332024
for i, v := range data {
2034-
data[i] = fixEscapeQuotes(trimQuotes(v))
2025+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
20352026
}
20362027

20372028
// get frame
@@ -2107,7 +2098,7 @@ func logRadioEvent(data []string) (radioEvent model.RadioEvent, err error) {
21072098

21082099
// fix received data
21092100
for i, v := range data {
2110-
data[i] = fixEscapeQuotes(trimQuotes(v))
2101+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
21112102
}
21122103

21132104
// get frame
@@ -2180,7 +2171,7 @@ func logFpsEvent(data []string) (fpsEvent model.ServerFpsEvent, err error) {
21802171

21812172
// fix received data
21822173
for i, v := range data {
2183-
data[i] = fixEscapeQuotes(trimQuotes(v))
2174+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
21842175
}
21852176

21862177
// get frame
@@ -2221,7 +2212,7 @@ func logAce3DeathEvent(data []string) (deathEvent model.Ace3DeathEvent, err erro
22212212

22222213
// fix received data
22232214
for i, v := range data {
2224-
data[i] = fixEscapeQuotes(trimQuotes(v))
2215+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
22252216
}
22262217

22272218
// get frame
@@ -2279,7 +2270,7 @@ func logAce3DeathEvent(data []string) (deathEvent model.Ace3DeathEvent, err erro
22792270
func logAce3UnconsciousEvent(data []string) (unconsciousEvent model.Ace3UnconsciousEvent, err error) {
22802271
// fix received data
22812272
for i, v := range data {
2282-
data[i] = fixEscapeQuotes(trimQuotes(v))
2273+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
22832274
}
22842275

22852276
// get frame
@@ -2321,7 +2312,7 @@ func logMarkerCreate(data []string) (marker model.Marker, err error) {
23212312

23222313
// fix received data
23232314
for i, v := range data {
2324-
data[i] = fixEscapeQuotes(trimQuotes(v))
2315+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
23252316
}
23262317

23272318
marker.MissionID = CurrentMission.ID
@@ -2417,7 +2408,7 @@ func logMarkerMove(data []string) (markerState model.MarkerState, err error) {
24172408

24182409
// fix received data
24192410
for i, v := range data {
2420-
data[i] = fixEscapeQuotes(trimQuotes(v))
2411+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
24212412
}
24222413

24232414
markerState.MissionID = CurrentMission.ID
@@ -2487,7 +2478,7 @@ func logMarkerDelete(data []string) (markerName string, frameNo uint, err error)
24872478

24882479
// fix received data
24892480
for i, v := range data {
2490-
data[i] = fixEscapeQuotes(trimQuotes(v))
2481+
data[i] = util.FixEscapeQuotes(util.TrimQuotes(v))
24912482
}
24922483

24932484
markerName = data[0]
@@ -3145,16 +3136,6 @@ func startDBWriters() {
31453136
// EXPORTED FUNCTIONS //
31463137
// /////////////////////
31473138

3148-
func trimQuotes(s string) string {
3149-
// trim the start and end quotes from a string
3150-
return strings.Trim(s, `"`)
3151-
}
3152-
3153-
func fixEscapeQuotes(s string) string {
3154-
// fix the escape quotes in a string
3155-
return strings.Replace(s, `""`, `"`, -1)
3156-
}
3157-
31583139
func writeLog(
31593140
functionName string,
31603141
data string,

internal/util/util.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Package util provides common utility functions used across the OCAP recorder.
2+
package util
3+
4+
import "strings"
5+
6+
// TrimQuotes removes leading and trailing double quotes from a string.
7+
func TrimQuotes(s string) string {
8+
return strings.Trim(s, `"`)
9+
}
10+
11+
// FixEscapeQuotes replaces escaped double quotes ("") with single double quotes (").
12+
func FixEscapeQuotes(s string) string {
13+
return strings.ReplaceAll(s, `""`, `"`)
14+
}
15+

internal/util/util_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package util
2+
3+
import "testing"
4+
5+
func TestTrimQuotes(t *testing.T) {
6+
tests := []struct {
7+
name string
8+
input string
9+
expected string
10+
}{
11+
{"empty string", "", ""},
12+
{"no quotes", "hello", "hello"},
13+
{"double quoted", `"hello"`, "hello"},
14+
{"single quotes only", "'hello'", "'hello'"},
15+
{"quotes in middle", `he"llo`, `he"llo`},
16+
{"only quotes", `""`, ""},
17+
}
18+
19+
for _, tt := range tests {
20+
t.Run(tt.name, func(t *testing.T) {
21+
result := TrimQuotes(tt.input)
22+
if result != tt.expected {
23+
t.Errorf("TrimQuotes(%q) = %q, want %q", tt.input, result, tt.expected)
24+
}
25+
})
26+
}
27+
}
28+
29+
func TestFixEscapeQuotes(t *testing.T) {
30+
tests := []struct {
31+
name string
32+
input string
33+
expected string
34+
}{
35+
{"empty string", "", ""},
36+
{"no escaped quotes", "hello", "hello"},
37+
{"single escaped quote", `he""llo`, `he"llo`},
38+
{"multiple escaped quotes", `a""b""c`, `a"b"c`},
39+
{"consecutive escaped", `a""""b`, `a""b`},
40+
}
41+
42+
for _, tt := range tests {
43+
t.Run(tt.name, func(t *testing.T) {
44+
result := FixEscapeQuotes(tt.input)
45+
if result != tt.expected {
46+
t.Errorf("FixEscapeQuotes(%q) = %q, want %q", tt.input, result, tt.expected)
47+
}
48+
})
49+
}
50+
}
51+

0 commit comments

Comments
 (0)