encode.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package ini
  2. import (
  3. "bytes"
  4. "encoding"
  5. "fmt"
  6. "reflect"
  7. )
  8. var (
  9. marshalerType = reflect.TypeOf(new(Marshaler)).Elem()
  10. textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem()
  11. )
  12. type Marshaler interface {
  13. MarshalINI() ([]byte, error)
  14. }
  15. type encoder interface {
  16. encode()
  17. }
  18. type encode struct {
  19. bytes.Buffer
  20. scratch [64]byte
  21. /*cache sync.Map TODO */
  22. }
  23. func Marshal(v interface{}) ([]byte, error) {
  24. fmt.Println("Interface", v)
  25. enc := &encode{}
  26. if err := enc.marshal(v); err != nil {
  27. return nil, err
  28. }
  29. return enc.Bytes(), nil
  30. }
  31. func (e *encode) marshal(v interface{}) error {
  32. s := "Text"
  33. e.reflectValue(reflect.ValueOf(v))
  34. e.reflectValue(reflect.ValueOf(1))
  35. e.reflectValue(reflect.ValueOf(s))
  36. return nil
  37. }
  38. func (e *encode) reflectValue(v reflect.Value) {
  39. fmt.Println("ReflectValue", v)
  40. valueEncoder(e, v).encode()
  41. }
  42. func valueEncoder(e *encode, v reflect.Value) encoder {
  43. if !v.IsValid() {
  44. return invalidValueEncoder{e, v, v.Type()}
  45. }
  46. return e.encoder(v)
  47. }
  48. func (e *encode) encoder(v reflect.Value) encoder {
  49. t := v.Type()
  50. if t.Implements(marshalerType) {
  51. fmt.Println("t.Implements(marshalerType)", t.Implements(marshalerType))
  52. return marshalerEncoder{e, v, t}
  53. }
  54. if t.Kind() != reflect.Ptr {
  55. if reflect.PtrTo(t).Implements(marshalerType) {
  56. fmt.Println("Allow marshalType")
  57. }
  58. }
  59. if t.Implements(textMarshalerType) {
  60. fmt.Println("t.Implements(textMarshalerType)", t.Implements(textMarshalerType))
  61. return &textMarshalerEncoder{e, v, t}
  62. }
  63. if t.Kind() != reflect.Ptr {
  64. if reflect.PtrTo(t).Implements(textMarshalerType) {
  65. fmt.Println("Allow TextmarshalType")
  66. }
  67. }
  68. switch t.Kind() {
  69. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  70. fmt.Println("INT")
  71. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  72. fmt.Println("UINT")
  73. case reflect.Float32, reflect.Float64:
  74. fmt.Println("Float32/64")
  75. case reflect.String:
  76. fmt.Println("STRING")
  77. return &stringEncoder{e, v, t}
  78. case reflect.Struct:
  79. fmt.Println("STRUCT")
  80. return &structEncoder{e, v, t}
  81. case reflect.Interface:
  82. fmt.Println("Interface")
  83. case reflect.Slice, reflect.Array:
  84. fmt.Println("Array or slice")
  85. default:
  86. fmt.Printf("Other kind: %s", t.Kind())
  87. }
  88. return &invalidValueEncoder{e, v, t}
  89. }
  90. type marshalerEncoder struct {
  91. e *encode
  92. v reflect.Value
  93. t reflect.Type
  94. }
  95. func (m marshalerEncoder) encode() {
  96. }
  97. type textMarshalerEncoder struct {
  98. e *encode
  99. v reflect.Value
  100. t reflect.Type
  101. }
  102. func (m textMarshalerEncoder) encode() {
  103. }
  104. type structEncoder struct {
  105. e *encode
  106. v reflect.Value
  107. t reflect.Type
  108. }
  109. func (s structEncoder) encode() {
  110. //fmt.Println("STRUCT", s.t)
  111. fmt.Printf("NAME: %s", s.t)
  112. for i := 0; i < s.v.NumField(); i++ {
  113. s.e.encoder(s.v.Field(i)).encode()
  114. }
  115. }
  116. type stringEncoder struct {
  117. e *encode
  118. v reflect.Value
  119. t reflect.Type
  120. }
  121. func (t *stringEncoder) encode() {
  122. fmt.Println("STRING ENCODER", t.v, t.t)
  123. }
  124. type invalidValueEncoder struct {
  125. e *encode
  126. v reflect.Value
  127. t reflect.Type
  128. }
  129. func (i invalidValueEncoder) encode() {
  130. }