src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

value.go (1765B)


      1 package ini
      2 
      3 import (
      4 	"fmt"
      5 	"strconv"
      6 	"strings"
      7 )
      8 
      9 // ValueType is an enum that will signify what type
     10 // the Value is
     11 type ValueType int
     12 
     13 func (v ValueType) String() string {
     14 	switch v {
     15 	case NoneType:
     16 		return "NONE"
     17 	case StringType:
     18 		return "STRING"
     19 	}
     20 
     21 	return ""
     22 }
     23 
     24 // ValueType enums
     25 const (
     26 	NoneType = ValueType(iota)
     27 	StringType
     28 	QuotedStringType
     29 )
     30 
     31 // Value is a union container
     32 type Value struct {
     33 	Type ValueType
     34 
     35 	str string
     36 	mp  map[string]string
     37 }
     38 
     39 // NewStringValue returns a Value type generated using a string input.
     40 func NewStringValue(str string) (Value, error) {
     41 	return Value{str: str}, nil
     42 }
     43 
     44 func (v Value) String() string {
     45 	switch v.Type {
     46 	case StringType:
     47 		return fmt.Sprintf("string: %s", string(v.str))
     48 	case QuotedStringType:
     49 		return fmt.Sprintf("quoted string: %s", string(v.str))
     50 	default:
     51 		return "union not set"
     52 	}
     53 }
     54 
     55 // MapValue returns a map value for sub properties
     56 func (v Value) MapValue() map[string]string {
     57 	return v.mp
     58 }
     59 
     60 // IntValue returns an integer value
     61 func (v Value) IntValue() (int64, bool) {
     62 	i, err := strconv.ParseInt(string(v.str), 0, 64)
     63 	if err != nil {
     64 		return 0, false
     65 	}
     66 	return i, true
     67 }
     68 
     69 // FloatValue returns a float value
     70 func (v Value) FloatValue() (float64, bool) {
     71 	f, err := strconv.ParseFloat(string(v.str), 64)
     72 	if err != nil {
     73 		return 0, false
     74 	}
     75 	return f, true
     76 }
     77 
     78 // BoolValue returns a bool value
     79 func (v Value) BoolValue() (bool, bool) {
     80 	// we don't use ParseBool as it recognizes more than what we've
     81 	// historically supported
     82 	if strings.EqualFold(v.str, "true") {
     83 		return true, true
     84 	} else if strings.EqualFold(v.str, "false") {
     85 		return false, true
     86 	}
     87 	return false, false
     88 }
     89 
     90 // StringValue returns the string value
     91 func (v Value) StringValue() string {
     92 	return v.str
     93 }