github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/event_listener.go (about) 1 package runtime 2 3 import "fmt" 4 5 type EmptyListener struct{} 6 7 func (l EmptyListener) Send(_ Event, msg Msg) Msg { 8 return msg 9 } 10 11 type Event struct { 12 Type EventType 13 MessageSent *EventMessageSent 14 MessagePending *EventMessagePending 15 MessageReceived *EventMessageReceived 16 } 17 18 func (e Event) String() string { 19 var s string 20 switch e.Type { 21 case MessageSentEvent: 22 s = e.MessageSent.String() 23 case MessagePendingEvent: 24 s = e.MessagePending.String() 25 case MessageReceivedEvent: 26 s = e.MessageReceived.String() 27 } 28 29 return fmt.Sprintf("%v: %v", e.Type.String(), s) 30 } 31 32 type EventMessageSent struct { 33 SenderPortAddr PortAddr 34 ReceiverPortAddrs map[PortAddr]struct{} // We use map to work with breakpoints 35 } 36 37 func (e EventMessageSent) String() string { 38 if len(e.ReceiverPortAddrs) == 1 { 39 for singleReceiver := range e.ReceiverPortAddrs { 40 return fmt.Sprintf("%v -> %v", e.SenderPortAddr, singleReceiver) 41 } 42 } 43 44 i := 0 45 receiversStr := "[ " 46 for receiver := range e.ReceiverPortAddrs { 47 receiversStr += receiver.String() 48 if i != len(e.ReceiverPortAddrs)-1 { 49 receiversStr += ", " 50 } 51 i++ 52 } 53 receiversStr += " ]" 54 55 return fmt.Sprintf("%v -> %v", e.SenderPortAddr, receiversStr) 56 } 57 58 // EventMessagePending describes event when message has reached receiver but not yet passed inside. 59 // It's usefull only for interception and modifying message for specific receiver. 60 type EventMessagePending struct { 61 Meta ConnectionMeta // We can use sender from here and receivers just as a handy metadata 62 ReceiverPortAddr PortAddr // So what we really need is sender and receiver port addrs 63 } 64 65 func (e EventMessagePending) String() string { 66 return fmt.Sprintf("%v -> %v", e.Meta.SenderPortAddr, e.ReceiverPortAddr) 67 } 68 69 type EventMessageReceived struct { 70 Meta ConnectionMeta // Same as with pending event 71 ReceiverPortAddr PortAddr 72 } 73 74 func (e EventMessageReceived) String() string { 75 return fmt.Sprintf("%v -> %v", e.Meta.SenderPortAddr, e.ReceiverPortAddr) 76 } 77 78 type EventType uint8 79 80 const ( 81 MessageSentEvent EventType = 1 // Message is sent from sender to its receivers 82 MessagePendingEvent EventType = 2 // Message has reached receiver but not yet passed inside 83 MessageReceivedEvent EventType = 3 // Message is passed inside receiver 84 ) 85 86 func (e EventType) String() string { 87 switch e { 88 case MessageSentEvent: 89 return "sent" 90 case MessagePendingEvent: 91 return "pending" 92 case MessageReceivedEvent: 93 return "received" 94 } 95 panic("unknown_event_type") 96 } 97 98 type EventListener interface { 99 Send(event Event, msg Msg) Msg 100 }