base.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package attr
  2. import (
  3. "github.com/kpmy/odf/model"
  4. "github.com/kpmy/ypk/assert"
  5. )
  6. //New is shortcut for factory function model.ModelFactory
  7. var New func(name model.LeafName) model.Leaf
  8. //Attributes interface that is supported by current version of mappers.Attr container
  9. type Attributes interface {
  10. Name(...string) string
  11. Equal(Attributes) bool
  12. Fit() model.LeafName
  13. Write(model.Writer)
  14. }
  15. type named struct {
  16. name string
  17. }
  18. func (n *named) Name(s ...string) string {
  19. if len(s) == 1 {
  20. assert.For(s[0] != "", 20)
  21. n.name = s[0]
  22. }
  23. return n.name
  24. }
  25. type value struct {
  26. name model.AttrName
  27. wr model.Writer
  28. data interface{}
  29. builder func(value)
  30. }
  31. type easy struct {
  32. m map[model.AttrName]value
  33. }
  34. func (e *easy) put(n model.AttrName, x interface{}, foo func(value)) {
  35. if e.m == nil {
  36. e.m = make(map[model.AttrName]value)
  37. }
  38. b := func(v value) {
  39. v.wr.Attr(v.name, v.data)
  40. }
  41. if foo != nil {
  42. b = foo
  43. }
  44. if x != nil {
  45. e.m[n] = value{data: x, builder: b}
  46. } else {
  47. delete(e.m, n)
  48. }
  49. }
  50. func (e *easy) equal(t *easy) (ok bool) {
  51. ok = (e.m != nil) == (t.m != nil)
  52. if ok && (e.m != nil) {
  53. for k, v := range e.m {
  54. ok = t.m[k].data == v.data
  55. if !ok {
  56. break
  57. }
  58. }
  59. }
  60. return
  61. }
  62. func (e *easy) apply(wr model.Writer) {
  63. if e.m != nil {
  64. for k, v := range e.m {
  65. v.wr = wr
  66. v.name = k
  67. v.builder(v)
  68. }
  69. }
  70. }
  71. func triggerBoolAttr(n model.AttrName) func(v value) {
  72. return func(v value) {
  73. if x := v.data.(bool); x {
  74. v.wr.Attr(n, true)
  75. }
  76. }
  77. }
  78. func init() {
  79. New = func(n model.LeafName) model.Leaf {
  80. return model.LeafFactory(n)
  81. }
  82. }