52 lines
868 B
Go
52 lines
868 B
Go
package db
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
const separator = "\x1f"
|
|
|
|
type VSC []string
|
|
|
|
// MarshalJSON replaces `nil` with `[]` for hygiene.
|
|
func (vs VSC) MarshalJSON() ([]byte, error) {
|
|
if vs == nil {
|
|
vs = VSC{}
|
|
}
|
|
return json.Marshal([]string(vs))
|
|
}
|
|
|
|
func (vs VSC) Value() (driver.Value, error) {
|
|
fields := make([]string, len(vs))
|
|
for i, v := range vs {
|
|
fields[i] = strings.ReplaceAll(v, separator, "")
|
|
}
|
|
return strings.Join(fields, separator), nil
|
|
}
|
|
|
|
var ErrWrongVSCType = errors.New("incompatible DB type for VSC")
|
|
|
|
func (vs *VSC) Scan(src any) error {
|
|
var s string
|
|
switch v := src.(type) {
|
|
case string:
|
|
s = v
|
|
case []byte:
|
|
s = string(v)
|
|
case nil:
|
|
*vs = nil
|
|
return nil
|
|
default:
|
|
return ErrWrongVSCType
|
|
}
|
|
if s == "" {
|
|
*vs = VSC{}
|
|
return nil
|
|
}
|
|
*vs = strings.Split(s, separator)
|
|
return nil
|
|
}
|