aboutsummaryrefslogtreecommitdiff
path: root/server/store/types/string_slice.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/store/types/string_slice.go')
-rw-r--r--server/store/types/string_slice.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/server/store/types/string_slice.go b/server/store/types/string_slice.go
new file mode 100644
index 0000000..81b38c3
--- /dev/null
+++ b/server/store/types/string_slice.go
@@ -0,0 +1,37 @@
+package types
+
+import (
+ "database/sql/driver"
+ "encoding/json"
+)
+
+// StringSlice is a []string which will be stored in a database as a JSON array.
+type StringSlice []string
+
+var _ driver.Valuer = (*StringSlice)(nil)
+
+// Value implements the driver.Valuer interface, marshalling the raw value to
+// a JSON array.
+func (s StringSlice) Value() (driver.Value, error) {
+ v, err := json.Marshal(s)
+ if err != nil {
+ return nil, err
+ }
+ return string(v), err
+}
+
+// Scan implements the sql.Scanner interface, unmarshalling the value coming
+// off the wire and storing the result in the StringSlice.
+func (s *StringSlice) Scan(value interface{}) error {
+ if value == nil {
+ s = &StringSlice{}
+ return nil
+ }
+ var err error
+ if v, err := driver.String.ConvertValue(value); err == nil {
+ if v, ok := v.([]byte); ok {
+ err = json.Unmarshal(v, s)
+ }
+ }
+ return err
+}