action.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package ami
  2. import (
  3. "bytes"
  4. "fmt"
  5. )
  6. type ActionData map[string]string
  7. func (s ActionData) raw() (res []byte) {
  8. for key, val := range s {
  9. res = append(res, []byte(fmt.Sprintf("%v: %v\r\n", key, val))...)
  10. }
  11. res = append(res, []byte("\r\n")...)
  12. return
  13. }
  14. func (s ActionData) isEvent() bool {
  15. _, check := s["Event"]
  16. return check
  17. }
  18. func (s ActionData) ActionID() string {
  19. return s["ActionID"]
  20. }
  21. func actionDataFromRaw(src []byte) (res ActionData) {
  22. res, lines := make(ActionData), bytes.Split(src, []byte("\r\n"))
  23. /// todo...
  24. for _, line := range lines {
  25. parts := bytes.SplitN(line, []byte(":"), 2)
  26. if len(parts) == 2 {
  27. res[string(bytes.TrimSpace(parts[0]))] = string(bytes.TrimSpace(parts[1]))
  28. }
  29. }
  30. return
  31. }
  32. func actionsFromRaw(src []byte, accept func(ActionData)) (res []byte) {
  33. if bytes.Index(src, []byte("\r\n\r\n")) < 0 {
  34. return src
  35. }
  36. actionsRaw := bytes.Split(src, []byte("\r\n\r\n"))
  37. for i := 0; i < len(actionsRaw)-1; i++ {
  38. action := actionDataFromRaw(actionsRaw[i])
  39. accept(action)
  40. }
  41. res = actionsRaw[len(actionsRaw)-1]
  42. return
  43. }