codex_lvar.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package codex
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. type CodexLVar struct {
  7. id string
  8. PacketLength int
  9. length int
  10. }
  11. func (c *CodexLVar) init(cfg map[string]interface{}) {
  12. if v, ok := cfg["id"].(string); ok {
  13. c.id = v
  14. } else {
  15. panic(fmt.Sprintf("Invalid CodexLVar.ID %+v", cfg))
  16. }
  17. if v, ok := cfg["length"].(int); ok {
  18. c.length = v
  19. } else if cfg["length"] == nil {
  20. c.length = 0
  21. } else {
  22. panic(fmt.Sprintf("Invalid CodexLVar.Length %+v", cfg))
  23. }
  24. }
  25. func (c *CodexLVar) ID() string {
  26. return c.id
  27. }
  28. func (c *CodexLVar) decode(data []byte, pos int) (string, int, error) {
  29. ppos := pos + c.PacketLength
  30. if len(data) < ppos {
  31. return "", pos, fmt.Errorf("incomplete packet field %s %d < %d", c.id, len(data), ppos)
  32. }
  33. plen, err := strconv.Atoi(string(data[pos:ppos]))
  34. if err != nil {
  35. return "", pos, fmt.Errorf("Invalid lvar %s length [%s] %s", c.id, string(data[pos:ppos]), err)
  36. }
  37. ppos1 := ppos
  38. ppos = ppos + plen
  39. if len(data) < ppos {
  40. return "", pos, fmt.Errorf("incomplete packet field %s %d < %d", c.id, len(data), ppos)
  41. }
  42. return string(data[ppos1:ppos]), ppos, nil
  43. }
  44. func (c *CodexLVar) Decode(data []byte, pos int, value interface{}) (int, error) {
  45. var err error
  46. if vm, ok := value.(map[string]interface{}); ok {
  47. vm[c.id], pos, err = c.decode(data, pos)
  48. if err != nil {
  49. return pos, err
  50. }
  51. return pos, nil
  52. }
  53. panic(fmt.Sprintf("Invalid value type %+v", value))
  54. }