element.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package ini
  2. import (
  3. "fmt"
  4. )
  5. type elementType int
  6. const (
  7. section elementType = 1 << iota
  8. variable elementType = 1 << iota
  9. )
  10. type element struct {
  11. eType elementType
  12. eKey []byte
  13. eVal []byte
  14. }
  15. func newElement() *element {
  16. return &element{}
  17. }
  18. func (e *element) setValue(v interface{}) bool {
  19. switch v.(type) {
  20. case byte:
  21. e.eVal = append(e.eVal, v.(byte))
  22. return true
  23. case []byte:
  24. e.eVal = v.([]byte)
  25. return true
  26. }
  27. fmt.Printf("Uknown type: %T", v)
  28. return false
  29. }
  30. func (e *element) removeLastValueByteMatching(c byte) {
  31. if n := len(e.eVal); n != 0 && e.eVal[n-1] == c {
  32. e.eVal = e.eVal[0 : n-1]
  33. }
  34. }
  35. func (e *element) setKey(k interface{}) bool {
  36. switch k.(type) {
  37. case byte:
  38. e.eKey = append(e.eKey, k.(byte))
  39. return true
  40. case []byte:
  41. e.eKey = k.([]byte)
  42. return true
  43. }
  44. return false
  45. }
  46. func (e *element) removeLastKeyByteMatching(c byte) {
  47. if n := len(e.eKey); n != 0 && e.eKey[n-1] == c {
  48. e.eKey = e.eKey[0 : n-1]
  49. }
  50. }
  51. func (e *element) setType(t elementType) {
  52. e.eType = t
  53. }
  54. func (e *element) String() string {
  55. switch e.eType {
  56. case section:
  57. return fmt.Sprintf(
  58. "section: %s", e.eKey,
  59. )
  60. case variable:
  61. if len(e.eVal) == 0 {
  62. return fmt.Sprintf(
  63. "variable: %s -> true", e.eKey,
  64. )
  65. }
  66. return fmt.Sprintf(
  67. "variable: %s -> %s", e.eKey, e.eVal,
  68. )
  69. default:
  70. return "unknown element"
  71. }
  72. }