github.com/mithrandie/csvq@v1.18.1/lib/value/type.go (about)

     1  package value
     2  
     3  import (
     4  	"strconv"
     5  	"time"
     6  
     7  	"github.com/mithrandie/csvq/lib/option"
     8  
     9  	"github.com/mithrandie/ternary"
    10  )
    11  
    12  var ternaryTrue = &Ternary{value: ternary.TRUE}
    13  var ternaryFalse = &Ternary{value: ternary.FALSE}
    14  var ternaryUnknown = &Ternary{value: ternary.UNKNOWN}
    15  var booleanTrue = &Boolean{value: true}
    16  var booleanFalse = &Boolean{value: false}
    17  var null = &Null{}
    18  
    19  func IsTrue(v Primary) bool {
    20  	return v == ternaryTrue
    21  }
    22  
    23  func IsFalse(v Primary) bool {
    24  	return v == ternaryFalse
    25  }
    26  
    27  func IsUnknown(v Primary) bool {
    28  	return v == ternaryUnknown
    29  }
    30  
    31  func IsNull(v Primary) bool {
    32  	return v == null
    33  }
    34  
    35  type RowValue []Primary
    36  
    37  type Primary interface {
    38  	String() string
    39  	Ternary() ternary.Value
    40  }
    41  
    42  type String struct {
    43  	literal string
    44  }
    45  
    46  func (s String) String() string {
    47  	return option.QuoteString(s.literal)
    48  }
    49  
    50  func NewString(s string) *String {
    51  	p := getString()
    52  	p.literal = s
    53  	return p
    54  }
    55  
    56  func (s String) Raw() string {
    57  	return s.literal
    58  }
    59  
    60  func (s String) Ternary() ternary.Value {
    61  	lit := option.TrimSpace(s.Raw())
    62  	if b, err := strconv.ParseBool(lit); err == nil {
    63  		return ternary.ConvertFromBool(b)
    64  	}
    65  	return ternary.UNKNOWN
    66  }
    67  
    68  type Integer struct {
    69  	value int64
    70  }
    71  
    72  func NewIntegerFromString(s string) *Integer {
    73  	i, _ := strconv.ParseInt(s, 10, 64)
    74  	return NewInteger(i)
    75  }
    76  
    77  func NewInteger(i int64) *Integer {
    78  	p := getInteger()
    79  	p.value = i
    80  	return p
    81  }
    82  
    83  func (i Integer) String() string {
    84  	return Int64ToStr(i.value)
    85  }
    86  
    87  func (i Integer) Raw() int64 {
    88  	return i.value
    89  }
    90  
    91  func (i Integer) Ternary() ternary.Value {
    92  	switch i.Raw() {
    93  	case 0:
    94  		return ternary.FALSE
    95  	case 1:
    96  		return ternary.TRUE
    97  	default:
    98  		return ternary.UNKNOWN
    99  	}
   100  }
   101  
   102  type Float struct {
   103  	value float64
   104  }
   105  
   106  func NewFloatFromString(s string) *Float {
   107  	f, _ := strconv.ParseFloat(s, 64)
   108  	return NewFloat(f)
   109  }
   110  
   111  func NewFloat(f float64) *Float {
   112  	p := getFloat()
   113  	p.value = f
   114  	return p
   115  }
   116  
   117  func (f Float) String() string {
   118  	return Float64ToStr(f.value, false)
   119  }
   120  
   121  func (f Float) Raw() float64 {
   122  	return f.value
   123  }
   124  
   125  func (f Float) Ternary() ternary.Value {
   126  	switch f.Raw() {
   127  	case 0:
   128  		return ternary.FALSE
   129  	case 1:
   130  		return ternary.TRUE
   131  	default:
   132  		return ternary.UNKNOWN
   133  	}
   134  }
   135  
   136  type Boolean struct {
   137  	value bool
   138  }
   139  
   140  func NewBoolean(b bool) *Boolean {
   141  	switch b {
   142  	case true:
   143  		return booleanTrue
   144  	default:
   145  		return booleanFalse
   146  	}
   147  }
   148  
   149  func (b Boolean) String() string {
   150  	return strconv.FormatBool(b.value)
   151  }
   152  
   153  func (b Boolean) Raw() bool {
   154  	return b.value
   155  }
   156  
   157  func (b Boolean) Ternary() ternary.Value {
   158  	return ternary.ConvertFromBool(b.Raw())
   159  }
   160  
   161  type Ternary struct {
   162  	value ternary.Value
   163  }
   164  
   165  func NewTernaryFromString(s string) *Ternary {
   166  	t, _ := ternary.ConvertFromString(s)
   167  	return NewTernary(t)
   168  }
   169  
   170  func NewTernary(t ternary.Value) *Ternary {
   171  	switch t {
   172  	case ternary.TRUE:
   173  		return ternaryTrue
   174  	case ternary.FALSE:
   175  		return ternaryFalse
   176  	default:
   177  		return ternaryUnknown
   178  	}
   179  }
   180  
   181  func (t Ternary) String() string {
   182  	return t.value.String()
   183  }
   184  
   185  func (t Ternary) Ternary() ternary.Value {
   186  	return t.value
   187  }
   188  
   189  type Datetime struct {
   190  	value time.Time
   191  }
   192  
   193  func NewDatetimeFromString(s string, formats []string, location *time.Location) *Datetime {
   194  	t, _ := StrToTime(s, formats, location)
   195  	return NewDatetime(t)
   196  }
   197  
   198  func NewDatetime(t time.Time) *Datetime {
   199  	p := getDatetime()
   200  	p.value = t
   201  	return p
   202  }
   203  
   204  func (dt Datetime) String() string {
   205  	return option.QuoteString(dt.value.Format(time.RFC3339Nano))
   206  }
   207  
   208  func (dt Datetime) Raw() time.Time {
   209  	return dt.value
   210  }
   211  
   212  func (dt Datetime) Ternary() ternary.Value {
   213  	return ternary.UNKNOWN
   214  }
   215  
   216  func (dt Datetime) Format(s string) string {
   217  	return dt.value.Format(s)
   218  }
   219  
   220  type Null struct{}
   221  
   222  func NewNull() *Null {
   223  	return null
   224  }
   225  
   226  func (n Null) String() string {
   227  	return "NULL"
   228  }
   229  
   230  func (n Null) Ternary() ternary.Value {
   231  	return ternary.UNKNOWN
   232  }