entity.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package world
  2. import "os"
  3. import "encoding/xml"
  4. // Anything inside the WOE World can be identified by a unique short string
  5. // description, the Label
  6. type Labeled interface {
  7. Label() string // Returns a unique label of the thing.
  8. }
  9. type Typed interface {
  10. Type() string // Returns a string description of the type of the thing.
  11. }
  12. // An entity is anything that can exist in a World
  13. type Entity struct {
  14. ID ID `xml:"id,attr"`
  15. Name string `xml:"name,attr"`
  16. Short string `xml:"short,attr"`
  17. Long string
  18. Aliases []string
  19. }
  20. func (me * Entity) Label() string {
  21. return string(me.ID)
  22. }
  23. // Interface
  24. type Savable interface {
  25. Labeled
  26. Typed
  27. }
  28. type Loadable interface {
  29. Typed
  30. }
  31. func SaveSavable(dirname string, savable Savable) (err error) {
  32. path := SavePathFor(dirname, savable.Type(), savable.Label())
  33. file, err := os.Create(path)
  34. if err != nil {
  35. return err
  36. }
  37. enc := xml.NewEncoder(file)
  38. enc.Indent(" ", " ")
  39. return enc.Encode(savable)
  40. }
  41. func LoadLoadable(dirname string, nameid string, result Loadable) (Loadable) {
  42. path := SavePathFor(dirname, result.Type(), nameid)
  43. file, err := os.Open(path)
  44. if err != nil {
  45. return nil
  46. }
  47. dec := xml.NewDecoder(file)
  48. err = dec.Decode(result)
  49. if err != nil { return nil }
  50. return result
  51. }
  52. // A list of Identifier items mapped to their ID's
  53. type LabeledLister interface {
  54. Get(ID) Labeled
  55. Put(Labeled)
  56. Size() int
  57. Index(int) Labeled
  58. PutIndex(int)
  59. }
  60. type LabeledList struct {
  61. byList []Labeled
  62. byLabel map[ID] Labeled
  63. }
  64. func NewLabeledList() * LabeledList {
  65. byname := make(map[ID] Labeled)
  66. return &LabeledList{nil, byname}
  67. }
  68. func (me * LabeledList) Get(id ID) Labeled {
  69. val, ok := me.byLabel[id]
  70. if !ok { return nil }
  71. return val
  72. }
  73. func (me * LabeledList) Index(index int) Labeled {
  74. if index < 0 { return nil }
  75. if index > len(me.byList) { return nil }
  76. val := me.byList[index]
  77. return val
  78. }