| @ -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) | |||
| } | |||