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  }