Skip to content

Instantly share code, notes, and snippets.

@AntonStoeckl
Created March 28, 2022 13:20
Show Gist options
  • Save AntonStoeckl/c0dd6dd0dedab2ceade4d8893f862371 to your computer and use it in GitHub Desktop.
Save AntonStoeckl/c0dd6dd0dedab2ceade4d8893f862371 to your computer and use it in GitHub Desktop.
Example for blog post: Domain-Driven Design vs. "Functional Core, Imperative Shell"
package finishcard
import (
"ace-life/hexagon/domain"
"ace-life/hexagon/usecases"
)
type CommandHandler struct {
drawReplacementCard usecases.ForDrawingReplacementCards
loadEventStream usecases.ForLoadingEventStreams
appendEventsToStream usecases.ForAppendingEventsToStreams
eventStreamPrefix string
}
func NewFinishCardCommandHandler(
drawReplacementCard usecases.ForDrawingReplacementCards,
loadEventStream usecases.ForLoadingEventStreams,
appendEventsToStream usecases.ForAppendingEventsToStreams,
eventStreamPrefix string,
) *CommandHandler {
return &CommandHandler{
drawReplacementCard: drawReplacementCard,
loadEventStream: loadEventStream,
appendEventsToStream: appendEventsToStream,
eventStreamPrefix: eventStreamPrefix,
}
}
func (h *CommandHandler) Handle(command Command) error {
streamID := domain.MustBuildStreamID(
h.eventStreamPrefix,
command.PlayerID.String(),
)
eventStream, loadErr := h.loadEventStream(streamID)
if loadErr != nil {
return loadErr
}
recordedEvent := FinishCard(
eventStream,
command,
h.drawReplacementCard,
)
appendErr := h.appendEventsToStream(
streamID,
eventStream.StreamRevision(),
recordedEvent,
)
if appendErr != nil {
return appendErr
}
failureEvent, ok := recordedEvent.(domain.FailureEvent)
if ok {
return failureEvent.MapToError()
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment