package objects import ( "fmt" "github.com/d5/tengo/compiler/token" ) // String represents a string value. type String struct { Value string } // TypeName returns the name of the type. func (o *String) TypeName() string { return "string" } func (o *String) String() string { return fmt.Sprintf("%q", o.Value) } // BinaryOp returns another object that is the result of // a given binary operator and a right-hand side object. func (o *String) BinaryOp(op token.Token, rhs Object) (Object, error) { switch rhs := rhs.(type) { case *String: switch op { case token.Add: if rhs.Value == "" { return o, nil } return &String{Value: o.Value + rhs.Value}, nil } case *Char: switch op { case token.Add: return &String{Value: o.Value + string(rhs.Value)}, nil } } return nil, ErrInvalidOperator } // IsFalsy returns true if the value of the type is falsy. func (o *String) IsFalsy() bool { return len(o.Value) == 0 } // Copy returns a copy of the type. func (o *String) Copy() Object { return &String{Value: o.Value} } // Equals returns true if the value of the type // is equal to the value of another object. func (o *String) Equals(x Object) bool { t, ok := x.(*String) if !ok { return false } return o.Value == t.Value }