assign.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package rules
  2. import (
  3. "cp/node"
  4. "cp/statement"
  5. "rt2/context"
  6. "rt2/frame"
  7. "rt2/nodeframe"
  8. "rt2/scope"
  9. )
  10. func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  11. var fu nodeframe.FrameUtils
  12. a := fu.NodeOf(f)
  13. switch a.(node.AssignNode).Statement() {
  14. case statement.ASSIGN:
  15. m := new(frame.SetDataMsg)
  16. m.Data = make(map[interface{}]interface{})
  17. f.(context.ContextAware).Handle(m)
  18. switch a.Left().(type) {
  19. case node.VariableNode:
  20. switch a.Right().(type) {
  21. case node.ConstantNode:
  22. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  23. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  24. sc.Update(a.Left().Object(), func(interface{}) interface{} {
  25. return a.Right().(node.ConstantNode).Data()
  26. })
  27. return frame.End()
  28. }
  29. ret = frame.DO
  30. case node.VariableNode:
  31. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  32. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  33. sc.Update(a.Left().Object(), func(interface{}) interface{} {
  34. return sc.Select(a.Right().Object())
  35. })
  36. return frame.End()
  37. }
  38. ret = frame.DO
  39. case node.OperationNode:
  40. fu.Push(fu.New(a.Right()), f)
  41. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  42. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  43. sc.Update(a.Left().Object(), func(interface{}) interface{} {
  44. return fu.DataOf(f)[a.Right()]
  45. })
  46. return frame.End()
  47. }
  48. ret = frame.SKIP
  49. default:
  50. panic("wrong right")
  51. }
  52. default:
  53. panic("wrong left")
  54. }
  55. default:
  56. panic("wrong statement")
  57. }
  58. return seq, ret
  59. }