decode.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package ini
  2. import (
  3. "encoding"
  4. "fmt"
  5. "reflect"
  6. "strconv"
  7. )
  8. var (
  9. unmarshalerType = reflect.TypeOf(new(Unmarshaler)).Elem()
  10. textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem()
  11. )
  12. type Unmarshaler interface {
  13. UnmarshalINI([]byte) error
  14. }
  15. type valueDecoder func([]byte) error
  16. type field struct {
  17. ns string
  18. t reflect.Type
  19. v reflect.Value
  20. p interface{}
  21. f valueDecoder
  22. }
  23. type decoder struct {
  24. scan *scanner
  25. ns map[string]*field
  26. nss string
  27. }
  28. func Unmarshal(d []byte, v interface{}) error {
  29. dec := &decoder{
  30. scan: newScanner(d),
  31. ns: make(map[string]*field),
  32. }
  33. if err := dec.scan.valid(); err != nil {
  34. fmt.Println("ERROR, invalid", err)
  35. return err
  36. }
  37. return dec.unmarshal(v)
  38. }
  39. func (d *decoder) unmarshal(v interface{}) error {
  40. rv := reflect.ValueOf(v)
  41. d.imap("", rv, nil, 0)
  42. fmt.Println(d.ns)
  43. ns := d.nss
  44. for elem, err := d.scan.next(); err == EOL; elem, err = d.scan.next() {
  45. switch elem.t {
  46. case section:
  47. ns = d.nss + "." + string(elem.key)
  48. case variable:
  49. key := ns + "." + string(elem.key)
  50. if f, ok := d.ns[key]; ok {
  51. if err := f.f(elem.val); err != nil {
  52. fmt.Println(err)
  53. }
  54. }
  55. }
  56. }
  57. return nil
  58. }
  59. func (d *decoder) ns_append(ns string, f *field) string {
  60. if f.p == nil {
  61. f.ns = ns + "." + f.t.Name()
  62. return f.ns
  63. }
  64. if tag := f.p.(reflect.StructField).Tag.Get("ini"); len(tag) != 0 {
  65. f.ns = ns + "." + tag
  66. return f.ns
  67. }
  68. f.ns = ns + "." + f.p.(reflect.StructField).Name
  69. return f.ns
  70. }
  71. func (d *decoder) imap(ns string, v reflect.Value, p interface{}, i int) {
  72. f := &field{
  73. t: v.Type(),
  74. v: v,
  75. p: nil,
  76. }
  77. if p != nil {
  78. f.p = p.(reflect.Type).Field(i)
  79. }
  80. if f.t.Implements(unmarshalerType) {
  81. f.f = f.unmDecoder
  82. d.ns[d.ns_append(ns, f)] = f
  83. return
  84. }
  85. switch f.v.Kind() {
  86. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  87. f.f = f.uintDecoder
  88. d.ns[d.ns_append(ns, f)] = f
  89. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  90. f.f = f.intDecoder
  91. d.ns[d.ns_append(ns, f)] = f
  92. case reflect.String:
  93. f.f = f.strDecoder
  94. d.ns[d.ns_append(ns, f)] = f
  95. case reflect.Bool:
  96. f.f = f.boolDecoder
  97. d.ns[d.ns_append(ns, f)] = f
  98. case reflect.Struct:
  99. if len(d.nss) == 0 {
  100. d.nss = d.ns_append(ns, f)
  101. }
  102. for i := 0; i < f.v.NumField(); i++ {
  103. d.imap(d.ns_append(ns, f), f.v.Field(i), f.t, i)
  104. }
  105. case reflect.Ptr:
  106. if f.v.IsNil() {
  107. return
  108. }
  109. d.imap(ns, f.v.Elem(), nil, i)
  110. default:
  111. fmt.Printf("OTHER TYPE: %v", f.t.Name())
  112. }
  113. }
  114. func (f *field) valid() error {
  115. if f.v.CanAddr() {
  116. return nil
  117. }
  118. return fmt.Errorf("Field '%s' not addressable", f.ns)
  119. }
  120. func (f *field) uintDecoder(b []byte) error {
  121. if err := f.valid(); err != nil {
  122. return err
  123. }
  124. i, err := strconv.ParseUint(string(b), 10, 64)
  125. if err != nil {
  126. return err
  127. }
  128. f.v.SetUint(i)
  129. return nil
  130. }
  131. func (f *field) intDecoder(b []byte) error {
  132. if err := f.valid(); err != nil {
  133. return err
  134. }
  135. i, err := strconv.ParseInt(string(b), 10, 64)
  136. if err != nil {
  137. return err
  138. }
  139. f.v.SetInt(i)
  140. return nil
  141. }
  142. func (f *field) strDecoder(b []byte) error {
  143. if err := f.valid(); err != nil {
  144. return err
  145. }
  146. f.v.SetString(string(b))
  147. return nil
  148. }
  149. func (f *field) boolDecoder(b []byte) error {
  150. if err := f.valid(); err != nil {
  151. return err
  152. }
  153. f.v.SetBool(true)
  154. return nil
  155. }
  156. func (f *field) unmDecoder(b []byte) error {
  157. if err := f.valid(); err != nil {
  158. return err
  159. }
  160. v := f.v
  161. if v.Kind() != reflect.Ptr && v.Type().Name() != "" {
  162. v = v.Addr()
  163. }
  164. if v.IsNil() {
  165. v.Set(reflect.New(v.Type().Elem()))
  166. }
  167. if i, ok := v.Interface().(Unmarshaler); ok {
  168. err := i.UnmarshalINI(b)
  169. return err
  170. }
  171. return fmt.Errorf("Cannot load Unmarshaler")
  172. }