package value import ( "fmt" "strconv" "strings" ) type Data fmt.Stringer type IntData int64 func (i IntData) Get() int64 { return int64(i) } func (i IntData) String() string { return strconv.FormatInt(int64(i), 10) } type FloatData float64 func (f FloatData) Get() float64 { return float64(f) } func (f FloatData) String() string { return strconv.FormatFloat(float64(f), 'f', -1, 64) } type StringData string func (s StringData) Get() string { return string(s) } func (s StringData) String() string { return "\"" + string(s) + "\"" } type BoolData bool func (b BoolData) Get() bool { return bool(b) } func (b BoolData) String() string { return strconv.FormatBool(bool(b)) } type ArrayData struct { arr *[]Value } func (a ArrayData) Get() *[]Value { return a.arr } func (a ArrayData) String() string { builder := strings.Builder{} builder.WriteString("[") for i, v := range *a.arr { if i > 0 { builder.WriteString(", ") } builder.WriteString(v.Data().String()) } builder.WriteString("]") return builder.String() } func (a ArrayData) Len() int { return len(*a.arr) } func (a ArrayData) At(i int) Value { return (*a.arr)[i] } func (a ArrayData) Push(v Value) { *a.arr = append(*a.arr, v) } type NullData struct{} type FunctionData struct{} // TODO type ObjectData struct{} // TODO