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 }