github.com/s7techlab/cckit@v0.10.5/state/mapping/mapper.go (about) 1 package mapping 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/s7techlab/cckit/state" 8 ) 9 10 var ( 11 ErrEventPayloadEmpty = errors.New(`event payload empty`) 12 ) 13 14 type ( 15 EntryMapper struct { 16 Commands Commands 17 Event *Event 18 } 19 Commands []Command 20 21 Command interface { 22 Execute(state.State) error 23 fmt.Stringer 24 } 25 26 Query interface { 27 Query(state.State) error 28 } 29 30 CommandInsert struct { 31 Entry interface{} 32 } 33 34 CommandPut struct { 35 Entry interface{} 36 } 37 ) 38 39 func NewEntryMapper() *EntryMapper { 40 return &EntryMapper{ 41 Event: &Event{}, 42 } 43 } 44 45 func (em *EntryMapper) Apply(state state.State, event state.Event) error { 46 for _, cmd := range em.Commands { 47 if err := cmd.Execute(state); err != nil { 48 return fmt.Errorf(`execute command=%s: %w`, cmd, err) 49 } 50 } 51 52 if em.Event != nil { 53 if em.Event.Name != `` && em.Event.Payload == nil { 54 return ErrEventPayloadEmpty 55 } 56 57 if em.Event.Payload != nil { 58 if em.Event.Name != `` { 59 return event.Set(em.Event.Name, em.Event.Payload) 60 } 61 return event.Set(em.Event.Payload) 62 } 63 } 64 65 return nil 66 } 67 68 func (cc *Commands) Insert(entry interface{}) *Commands { 69 *cc = append(*cc, &CommandInsert{ 70 Entry: entry, 71 }) 72 return cc 73 } 74 75 func (cc *Commands) Put(entry interface{}) *Commands { 76 *cc = append(*cc, &CommandPut{ 77 Entry: entry, 78 }) 79 return cc 80 } 81 82 func (ci *CommandInsert) Execute(state state.State) error { 83 return state.Insert(ci.Entry) 84 } 85 86 func (ci *CommandInsert) String() string { 87 return fmt.Sprintf(`insert<%T>`, ci.Entry) 88 } 89 90 func (ci *CommandPut) Execute(state state.State) error { 91 return state.Put(ci.Entry) 92 } 93 94 func (ci *CommandPut) String() string { 95 return fmt.Sprintf(`put<%T>`, ci.Entry) 96 }