github.com/informationsea/shellflow@v0.1.3/flowscript/flowscript_value.go (about)

     1  package flowscript
     2  
     3  import (
     4  	"errors"
     5  	"strconv"
     6  	"strings"
     7  )
     8  
     9  // Value representation in flowscript
    10  type Value interface {
    11  	// String representation of value for debug
    12  	String() string
    13  	// Convert to string to embed
    14  	AsString() (string, error)
    15  	// Convert to int
    16  	AsInt() (int64, error)
    17  }
    18  
    19  type IntValue struct {
    20  	value int64
    21  }
    22  
    23  func NewIntValue(val int64) IntValue {
    24  	return IntValue{val}
    25  }
    26  
    27  func (v IntValue) Value() int64 {
    28  	return v.value
    29  }
    30  
    31  func (v IntValue) String() string {
    32  	return strconv.FormatInt(v.value, 10)
    33  }
    34  
    35  func (v IntValue) AsString() (string, error) {
    36  	return strconv.FormatInt(v.value, 10), nil
    37  }
    38  
    39  func (v IntValue) AsInt() (int64, error) {
    40  	return v.value, nil
    41  }
    42  
    43  type StringValue struct {
    44  	value string
    45  }
    46  
    47  func NewStringValue(str string) StringValue {
    48  	return StringValue{
    49  		value: str,
    50  	}
    51  }
    52  
    53  func (v StringValue) Value() string {
    54  	return v.value
    55  }
    56  
    57  func (v StringValue) String() string {
    58  	return strconv.Quote(v.value)
    59  }
    60  
    61  func (v StringValue) AsString() (string, error) {
    62  	return v.value, nil
    63  }
    64  
    65  func (v StringValue) AsInt() (int64, error) {
    66  	return strconv.ParseInt(v.value, 10, 64)
    67  }
    68  
    69  type ArrayValue struct {
    70  	value []Value
    71  }
    72  
    73  func CreateArrayValue2(v1 Value, v2 Value) ArrayValue {
    74  	array := [...]Value{v1, v2}
    75  	return ArrayValue{array[:]}
    76  }
    77  
    78  func (v ArrayValue) Value() []Value {
    79  	return v.value
    80  }
    81  
    82  func (v ArrayValue) String() string {
    83  	var b strings.Builder
    84  	b.WriteString("[")
    85  	for i, e := range v.value {
    86  		if i != 0 {
    87  			b.WriteString(", ")
    88  		}
    89  		b.WriteString(e.String())
    90  	}
    91  	b.WriteString("]")
    92  	return b.String()
    93  }
    94  
    95  func (v ArrayValue) AsRawArray() []Value {
    96  	return v.value
    97  }
    98  
    99  func (v ArrayValue) AsArray() ([]string, error) {
   100  	array := []string{}
   101  	for _, x := range v.value {
   102  		str, err := x.AsString()
   103  		if err != nil {
   104  			return nil, err
   105  		}
   106  		array = append(array, str)
   107  	}
   108  	return array, nil
   109  }
   110  
   111  func (v ArrayValue) AsString() (string, error) {
   112  	var b strings.Builder
   113  	for i, e := range v.value {
   114  		if i != 0 {
   115  			b.WriteString(" ")
   116  		}
   117  		cv, ce := e.AsString()
   118  		if ce != nil {
   119  			return "", ce
   120  		}
   121  		b.WriteString(cv)
   122  	}
   123  	return b.String(), nil
   124  }
   125  
   126  func (v ArrayValue) AsInt() (int64, error) {
   127  	return 0, errors.New("Cannot convert array to int")
   128  }
   129  
   130  type MapValue struct {
   131  	value map[string]Value
   132  }
   133  
   134  func (v MapValue) Value() map[string]Value {
   135  	return v.value
   136  }
   137  
   138  func (v MapValue) String() string {
   139  	var b strings.Builder
   140  	first := true
   141  	b.WriteString("{")
   142  	for k, v := range v.value {
   143  		if !first {
   144  			b.WriteString(", ")
   145  		}
   146  		b.WriteString(k)
   147  		b.WriteString("=")
   148  		b.WriteString(v.String())
   149  		first = false
   150  	}
   151  	b.WriteString("}")
   152  	return b.String()
   153  }
   154  
   155  func (v MapValue) AsString() (string, error) {
   156  	var b strings.Builder
   157  	first := true
   158  	for k, v := range v.value {
   159  		if !first {
   160  			b.WriteString(" ")
   161  		}
   162  		b.WriteString(k)
   163  		b.WriteString("=")
   164  		cv, ce := v.AsString()
   165  		if ce != nil {
   166  			return "", ce
   167  		}
   168  		b.WriteString(cv)
   169  		first = false
   170  	}
   171  	return b.String(), nil
   172  }
   173  
   174  func (v MapValue) AsInt() (int64, error) {
   175  	return 0, errors.New("Cannot convert map to int")
   176  }
   177  
   178  type FunctionValue struct {
   179  	value *ScriptFunction
   180  }
   181  
   182  func (v FunctionValue) Value() *ScriptFunction {
   183  	return v.value
   184  }
   185  
   186  func (v FunctionValue) String() string {
   187  	return v.value.String()
   188  }
   189  
   190  func (v FunctionValue) AsString() (string, error) {
   191  	return "", errors.New("Cannot convert function to string")
   192  }
   193  
   194  func (v FunctionValue) AsInt() (int64, error) {
   195  	return 0, errors.New("Cannot convert function to int")
   196  }