github.com/naemono/pop@v4.13.1+incompatible/slices/string.go (about)

     1  package slices
     2  
     3  import (
     4  	"bytes"
     5  	"database/sql/driver"
     6  	"encoding/csv"
     7  	"encoding/json"
     8  	"io"
     9  	"strings"
    10  
    11  	"github.com/lib/pq"
    12  )
    13  
    14  // For reading in arrays from postgres
    15  
    16  // String is a slice of strings.
    17  type String pq.StringArray
    18  
    19  // Interface implements the nulls.nullable interface.
    20  func (s String) Interface() interface{} {
    21  	return []string(s)
    22  }
    23  
    24  // Scan implements the sql.Scanner interface.
    25  // It allows to read the string slice from the database value.
    26  func (s *String) Scan(src interface{}) error {
    27  	ss := pq.StringArray(*s)
    28  	err := ss.Scan(src)
    29  	*s = String(ss)
    30  	return err
    31  }
    32  
    33  // Value implements the driver.Valuer interface.
    34  // It allows to convert the string slice to a driver.value.
    35  func (s String) Value() (driver.Value, error) {
    36  	ss := pq.StringArray(s)
    37  	return ss.Value()
    38  }
    39  
    40  // UnmarshalJSON will unmarshall JSON value into
    41  // the string slice representation of this value.
    42  func (s *String) UnmarshalJSON(data []byte) error {
    43  	var ss pq.StringArray
    44  	if err := json.Unmarshal(data, &ss); err != nil {
    45  		return err
    46  	}
    47  	*s = String(ss)
    48  	return nil
    49  }
    50  
    51  // UnmarshalText will unmarshall text value into
    52  // the string slice representation of this value.
    53  func (s *String) UnmarshalText(text []byte) error {
    54  	r := csv.NewReader(bytes.NewReader(text))
    55  
    56  	var words []string
    57  	for {
    58  		record, err := r.Read()
    59  		if err == io.EOF {
    60  			break
    61  		}
    62  		if err != nil {
    63  			return err
    64  		}
    65  
    66  		words = append(words, record...)
    67  	}
    68  
    69  	*s = String(words)
    70  	return nil
    71  }
    72  
    73  // TagValue implements the tagValuer interface, to work with https://github.com/gobuffalo/tags.
    74  func (s String) TagValue() string {
    75  	return s.Format(",")
    76  }
    77  
    78  // Format presents the slice as a string, using a given separator.
    79  func (s String) Format(sep string) string {
    80  	return strings.Join([]string(s), sep)
    81  }