summaryrefslogblamecommitdiffstats
path: root/vendor/github.com/d5/tengo/v2/variable.go
blob: 481b36b8e32a571d7264e66f9d05b6e18e1511c9 (plain) (tree)
1
2
3
4
5
6
7
8
9
             

                



                                                      
                    


                                                                     
                                        

                               
                            
                           








                                                          
                                   


                                                
                                 



                                                       
                              

                
                                                                             
                                  
                                

                
                                                                           
                                    
                                  

                
                                                                              
                                
                               

                
                                                                              
                                
                               

                
                                                                             
                                          
                                      
                    
                                             
                                                         

                          

                  
                                                                             
                                                 
                                      
                  
                                                  
                                                

                         

                  
                                                                               
                                    
                                 

                
                                                                          
                                   
                                    

                
                                                                          
                                  
                                   

                                               

                  

                                                                       
                      


                                                                 
                                        
 
package tengo

import (
	"errors"
)

// Variable is a user-defined variable for the script.
type Variable struct {
	name  string
	value Object
}

// NewVariable creates a Variable.
func NewVariable(name string, value interface{}) (*Variable, error) {
	obj, err := FromInterface(value)
	if err != nil {
		return nil, err
	}
	return &Variable{
		name:  name,
		value: obj,
	}, nil
}

// Name returns the name of the variable.
func (v *Variable) Name() string {
	return v.name
}

// Value returns an empty interface of the variable value.
func (v *Variable) Value() interface{} {
	return ToInterface(v.value)
}

// ValueType returns the name of the value type.
func (v *Variable) ValueType() string {
	return v.value.TypeName()
}

// Int returns int value of the variable value.
// It returns 0 if the value is not convertible to int.
func (v *Variable) Int() int {
	c, _ := ToInt(v.value)
	return c
}

// Int64 returns int64 value of the variable value. It returns 0 if the value
// is not convertible to int64.
func (v *Variable) Int64() int64 {
	c, _ := ToInt64(v.value)
	return c
}

// Float returns float64 value of the variable value. It returns 0.0 if the
// value is not convertible to float64.
func (v *Variable) Float() float64 {
	c, _ := ToFloat64(v.value)
	return c
}

// Char returns rune value of the variable value. It returns 0 if the value is
// not convertible to rune.
func (v *Variable) Char() rune {
	c, _ := ToRune(v.value)
	return c
}

// Bool returns bool value of the variable value. It returns 0 if the value is
// not convertible to bool.
func (v *Variable) Bool() bool {
	c, _ := ToBool(v.value)
	return c
}

// Array returns []interface value of the variable value. It returns 0 if the
// value is not convertible to []interface.
func (v *Variable) Array() []interface{} {
	switch val := v.value.(type) {
	case *Array:
		var arr []interface{}
		for _, e := range val.Value {
			arr = append(arr, ToInterface(e))
		}
		return arr
	}
	return nil
}

// Map returns map[string]interface{} value of the variable value. It returns
// 0 if the value is not convertible to map[string]interface{}.
func (v *Variable) Map() map[string]interface{} {
	switch val := v.value.(type) {
	case *Map:
		kv := make(map[string]interface{})
		for mk, mv := range val.Value {
			kv[mk] = ToInterface(mv)
		}
		return kv
	}
	return nil
}

// String returns string value of the variable value. It returns 0 if the value
// is not convertible to string.
func (v *Variable) String() string {
	c, _ := ToString(v.value)
	return c
}

// Bytes returns a byte slice of the variable value. It returns nil if the
// value is not convertible to byte slice.
func (v *Variable) Bytes() []byte {
	c, _ := ToByteSlice(v.value)
	return c
}

// Error returns an error if the underlying value is error object. If not,
// this returns nil.
func (v *Variable) Error() error {
	err, ok := v.value.(*Error)
	if ok {
		return errors.New(err.String())
	}
	return nil
}

// Object returns an underlying Object of the variable value. Note that
// returned Object is a copy of an actual Object used in the script.
func (v *Variable) Object() Object {
	return v.value
}

// IsUndefined returns true if the underlying value is undefined.
func (v *Variable) IsUndefined() bool {
	return v.value == UndefinedValue
}