|
|
|
@ -0,0 +1,153 @@ |
|
|
|
package forge |
|
|
|
|
|
|
|
import ( |
|
|
|
"errors" |
|
|
|
"fmt" |
|
|
|
) |
|
|
|
|
|
|
|
// List struct used for holding data neede for Reference data type
|
|
|
|
type List struct { |
|
|
|
values []Value |
|
|
|
} |
|
|
|
|
|
|
|
// NewList will create and initialize a new List value
|
|
|
|
func NewList() *List { |
|
|
|
return &List{ |
|
|
|
values: make([]Value, 0), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// GetType will simply return back LIST
|
|
|
|
func (list *List) GetType() ValueType { |
|
|
|
return LIST |
|
|
|
} |
|
|
|
|
|
|
|
// GetValue will resolve and return the value from the underlying list
|
|
|
|
// this is necessary to inherit from Value
|
|
|
|
func (list *List) GetValue() interface{} { |
|
|
|
var values []interface{} |
|
|
|
for _, val := range list.values { |
|
|
|
values = append(values, val.GetValue()) |
|
|
|
} |
|
|
|
return values |
|
|
|
} |
|
|
|
|
|
|
|
// GetValues will return back the list of underlygin values
|
|
|
|
func (list *List) GetValues() []Value { |
|
|
|
return list.values |
|
|
|
} |
|
|
|
|
|
|
|
// UpdateValue will set the underlying list value
|
|
|
|
func (list *List) UpdateValue(value interface{}) error { |
|
|
|
// Valid types
|
|
|
|
switch value.(type) { |
|
|
|
case []Value: |
|
|
|
list.values = value.([]Value) |
|
|
|
default: |
|
|
|
msg := fmt.Sprintf("Unsupported type, %s must be of type []Value", value) |
|
|
|
return errors.New(msg) |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// Get will return the Value at the index
|
|
|
|
func (list *List) Get(idx int) (Value, error) { |
|
|
|
if idx > list.Length() { |
|
|
|
return nil, errors.New("index out of range") |
|
|
|
} |
|
|
|
return list.values[idx], nil |
|
|
|
} |
|
|
|
|
|
|
|
// GetBoolean will try to get the value stored at the index as a bool
|
|
|
|
// will respond with an error if the value does not exist or cannot be converted to a bool
|
|
|
|
func (list *List) GetBoolean(idx int) (bool, error) { |
|
|
|
value, err := list.Get(idx) |
|
|
|
if err != nil { |
|
|
|
return false, err |
|
|
|
} |
|
|
|
|
|
|
|
switch value.(type) { |
|
|
|
case *Primative: |
|
|
|
return value.(*Primative).AsBoolean() |
|
|
|
} |
|
|
|
|
|
|
|
return false, errors.New("could not convert unknown value to boolean") |
|
|
|
} |
|
|
|
|
|
|
|
// GetFloat will try to get the value stored at the index as a float64
|
|
|
|
// will respond with an error if the value does not exist or cannot be converted to a float64
|
|
|
|
func (list *List) GetFloat(idx int) (float64, error) { |
|
|
|
value, err := list.Get(idx) |
|
|
|
if err != nil { |
|
|
|
return float64(0), err |
|
|
|
} |
|
|
|
|
|
|
|
switch value.(type) { |
|
|
|
case *Primative: |
|
|
|
return value.(*Primative).AsFloat() |
|
|
|
} |
|
|
|
|
|
|
|
return float64(0), errors.New("could not convert non-primative value to float") |
|
|
|
} |
|
|
|
|
|
|
|
// GetInteger will try to get the value stored at the index as a int64
|
|
|
|
// will respond with an error if the value does not exist or cannot be converted to a int64
|
|
|
|
func (list *List) GetInteger(idx int) (int64, error) { |
|
|
|
value, err := list.Get(idx) |
|
|
|
if err != nil { |
|
|
|
return int64(0), err |
|
|
|
} |
|
|
|
|
|
|
|
switch value.(type) { |
|
|
|
case *Primative: |
|
|
|
return value.(*Primative).AsInteger() |
|
|
|
} |
|
|
|
|
|
|
|
return int64(0), errors.New("could not convert non-primative value to integer") |
|
|
|
} |
|
|
|
|
|
|
|
// GetList will try to get the value stored at the index as a List
|
|
|
|
// will respond with an error if the value does not exist or is not a List
|
|
|
|
func (list *List) GetList(idx int) (*List, error) { |
|
|
|
value, err := list.Get(idx) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if value.GetType() == LIST { |
|
|
|
return value.(*List), nil |
|
|
|
} |
|
|
|
|
|
|
|
return nil, errors.New("could not fetch value as list") |
|
|
|
} |
|
|
|
|
|
|
|
// GetString will try to get the value stored at the index as a string
|
|
|
|
// will respond with an error if the value does not exist or cannot be converted to a string
|
|
|
|
func (list *List) GetString(idx int) (string, error) { |
|
|
|
value, err := list.Get(idx) |
|
|
|
if err != nil { |
|
|
|
return "", err |
|
|
|
} |
|
|
|
|
|
|
|
switch value.(type) { |
|
|
|
case *Primative: |
|
|
|
return value.(*Primative).AsString() |
|
|
|
} |
|
|
|
|
|
|
|
return "", errors.New("could not convert non-primative value to string") |
|
|
|
} |
|
|
|
|
|
|
|
// Set will set the new Value at the index
|
|
|
|
func (list *List) Set(idx int, value Value) { |
|
|
|
list.values[idx] = value |
|
|
|
} |
|
|
|
|
|
|
|
// Append will append a new Value on the end of the internal list
|
|
|
|
func (list *List) Append(value Value) { |
|
|
|
list.values = append(list.values, value) |
|
|
|
} |
|
|
|
|
|
|
|
// Length will return back the total number of items in the list
|
|
|
|
func (list *List) Length() int { |
|
|
|
return len(list.values) |
|
|
|
} |