From 272ed2e7e42c0e3125e3975b738d8f07019b4a76 Mon Sep 17 00:00:00 2001 From: tike Date: Wed, 17 Sep 2014 16:23:31 +0200 Subject: [PATCH] Added methods to implement sql related interfaces. Version.Scan -> database/sql.Scanner Version.Value -> database/sql/driver.Valuer Closes #4 Closes #5 --- sql.go | 31 +++++++++++++++++++++++++++++++ sql_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 sql.go create mode 100644 sql_test.go diff --git a/sql.go b/sql.go new file mode 100644 index 0000000..f636f3d --- /dev/null +++ b/sql.go @@ -0,0 +1,31 @@ +package semver + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements the database/sql.Scanner interface. +func (v *Version) Scan(src interface{}) (err error) { + var strVal string + switch src.(type) { + case string: + strVal = src.(string) + case []byte: + strVal = string(src.([]byte)) + default: + return fmt.Errorf("Version.Scan: cannot convert %T to string.", src) + } + + tmpv, err := Parse(strVal) + if err != nil { + return + } + *v = *tmpv + return +} + +// Value implements the database/sql/driver.Valuer interface. +func (s Version) Value() (driver.Value, error) { + return s.String(), nil +} diff --git a/sql_test.go b/sql_test.go new file mode 100644 index 0000000..7c71e59 --- /dev/null +++ b/sql_test.go @@ -0,0 +1,38 @@ +package semver + +import ( + "testing" +) + +type scanTest struct { + val interface{} + shouldError bool + expected string +} + +var scanTests = []scanTest{ + scanTest{"1.2.3", false, "1.2.3"}, + scanTest{[]byte("1.2.3"), false, "1.2.3"}, + scanTest{7, true, ""}, + scanTest{7e4, true, ""}, + scanTest{true, true, ""}, +} + +func TestScanString(t *testing.T) { + for _, tc := range scanTests { + s := &Version{} + err := s.Scan(tc.val) + if tc.shouldError { + if err == nil { + t.Fatalf("Scan did not return an error on %v (%T)", tc.val, tc.val) + } + } else { + if err != nil { + t.Fatalf("Scan returned an unexpected error: %s (%T) on %v (%T)", tc.val, tc.val, tc.val, tc.val) + } + if val, _ := s.Value(); val != tc.expected { + t.Errorf("Wrong Value returned, expected %q, got %q", tc.expected, val) + } + } + } +}