From 004f562b59ea17a453599774d44baff7763a02d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Mileusni=C4=87?= Date: Fri, 14 Apr 2023 13:24:20 +0200 Subject: [PATCH] Parse versions string into struct --- ua.go | 37 +++++++++++++----------------- ua_test.go | 2 +- version.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 22 deletions(-) create mode 100644 version.go diff --git a/ua.go b/ua.go index a50517c..bbfe3d6 100644 --- a/ua.go +++ b/ua.go @@ -8,27 +8,19 @@ import ( // UserAgent struct containing all data extracted from parsed user-agent string type UserAgent struct { - URL string - String string - Name string - Version string - OS string - OSVersion string - Device string - // VersionNo struct { - // Major int - // Minor int - // Patch int - // } - // OSVersionNo struct { - // Major int - // Minor int - // Patch int - // } - Mobile bool - Tablet bool - Desktop bool - Bot bool + VersionNo VersionNo + OSVersionNo VersionNo + URL string + String string + Name string + Version string + OS string + OSVersion string + Device string + Mobile bool + Tablet bool + Desktop bool + Bot bool } // Constants for browsers and operating systems for easier comparison @@ -344,6 +336,9 @@ func Parse(userAgent string) UserAgent { } } + parseVersion(ua.Version, &ua.VersionNo) + parseVersion(ua.OSVersion, &ua.OSVersionNo) + return ua } diff --git a/ua_test.go b/ua_test.go index 52e0a24..de7d712 100644 --- a/ua_test.go +++ b/ua_test.go @@ -164,7 +164,7 @@ func TestParse(t *testing.T) { t.Error("\n", test[0], "Device should be", test[5], "not", ua.Device) } - //fmt.Println(ua.OS, ua.OSVersion, ua.Device) + // fmt.Println(ua.Version, "==>", ua.VersionNoShort()) } } diff --git a/version.go b/version.go new file mode 100644 index 0000000..c98d810 --- /dev/null +++ b/version.go @@ -0,0 +1,66 @@ +package useragent + +import ( + "fmt" + "strconv" + "strings" +) + +type VersionNo struct { + Major int + Minor int + Patch int +} + +func parseVersion(ver string, verno *VersionNo) { + var err error + parts := strings.Split(ver, ".") + if len(parts) > 0 { + if verno.Major, err = strconv.Atoi(parts[0]); err != nil { + return + } + } + if len(parts) > 1 { + if verno.Minor, err = strconv.Atoi(parts[1]); err != nil { + return + } + if len(parts) > 2 { + if verno.Patch, err = strconv.Atoi(parts[2]); err != nil { + return + } + } + } + return +} + +// VersionNoShort return version string in format . +func (ua UserAgent) VersionNoShort() string { + if ua.VersionNo.Major == 0 && ua.VersionNo.Minor == 0 && ua.VersionNo.Patch == 0 { + return "" + } + return fmt.Sprintf("%d.%d", ua.VersionNo.Major, ua.VersionNo.Minor) +} + +// VersionNoFull returns version string in format .. +func (ua UserAgent) VersionNoFull() string { + if ua.VersionNo.Major == 0 && ua.VersionNo.Minor == 0 && ua.VersionNo.Patch == 0 { + return "" + } + return fmt.Sprintf("%d.%d.%d", ua.VersionNo.Major, ua.VersionNo.Minor, ua.VersionNo.Patch) +} + +// OSVersionNoShort returns OS version string in format . +func (ua UserAgent) OSVersionNoShort() string { + if ua.OSVersionNo.Major == 0 && ua.OSVersionNo.Minor == 0 && ua.OSVersionNo.Patch == 0 { + return "" + } + return fmt.Sprintf("%d.%d", ua.OSVersionNo.Major, ua.OSVersionNo.Minor) +} + +// OSVersionNoFull returns OS version string in format .. +func (ua UserAgent) OSVersionNoFull() string { + if ua.OSVersionNo.Major == 0 && ua.OSVersionNo.Minor == 0 && ua.OSVersionNo.Patch == 0 { + return "" + } + return fmt.Sprintf("%d.%d.%d", ua.OSVersionNo.Major, ua.OSVersionNo.Minor, ua.OSVersionNo.Patch) +}