github.com/Odesyuk/pop@v4.13.1+incompatible/slices/float.go (about)

     1  package slices
     2  
     3  import (
     4  	"database/sql/driver"
     5  	"fmt"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"errors"
    10  )
    11  
    12  // Float is a slice of float64.
    13  type Float []float64
    14  
    15  // Interface implements the nulls.nullable interface.
    16  func (f Float) Interface() interface{} {
    17  	return []float64(f)
    18  }
    19  
    20  // Scan implements the sql.Scanner interface.
    21  // It allows to read the float slice from the database value.
    22  func (f *Float) Scan(src interface{}) error {
    23  	b, ok := src.([]byte)
    24  	if !ok {
    25  		return errors.New("scan source was not []byte")
    26  	}
    27  	str := string(b)
    28  	*f = strToFloat(str)
    29  	return nil
    30  }
    31  
    32  // Value implements the driver.Valuer interface.
    33  // It allows to convert the float slice to a driver.value.
    34  func (f Float) Value() (driver.Value, error) {
    35  	sa := make([]string, len(f))
    36  	for x, i := range f {
    37  		sa[x] = strconv.FormatFloat(i, 'f', -1, 64)
    38  	}
    39  	return fmt.Sprintf("{%s}", strings.Join(sa, ",")), nil
    40  }
    41  
    42  // UnmarshalText will unmarshall text value into
    43  // the float slice representation of this value.
    44  func (f *Float) UnmarshalText(text []byte) error {
    45  	var ss []float64
    46  	for _, x := range strings.Split(string(text), ",") {
    47  		f, err := strconv.ParseFloat(x, 64)
    48  		if err != nil {
    49  			return err
    50  		}
    51  		ss = append(ss, f)
    52  	}
    53  	*f = ss
    54  	return nil
    55  }
    56  
    57  func strToFloat(s string) []float64 {
    58  	r := strings.Trim(s, "{}")
    59  	a := make([]float64, 0, 10)
    60  	for _, t := range strings.Split(r, ",") {
    61  		i, _ := strconv.ParseFloat(t, 64)
    62  		a = append(a, i)
    63  	}
    64  	return a
    65  }