From adba79069cd02fc365463e9d856537b1956c2568 Mon Sep 17 00:00:00 2001 From: Jan Dudulski Date: Sun, 17 Nov 2024 23:38:05 +0100 Subject: [PATCH] Utilize pattern matching in decider pattern :recycle: replace regular case with pattern matching in decide :recycle: return list of events from decide to comply with the pattern --- .../decider/lib/project_management/handler.rb | 4 +- .../decider/lib/project_management/issue.rb | 78 ++++--------------- 2 files changed, 17 insertions(+), 65 deletions(-) diff --git a/examples/decider/lib/project_management/handler.rb b/examples/decider/lib/project_management/handler.rb index b983262..3eb6aef 100644 --- a/examples/decider/lib/project_management/handler.rb +++ b/examples/decider/lib/project_management/handler.rb @@ -9,9 +9,9 @@ def call(cmd) state = @repository.load(cmd.id, @decider) case @decider.decide(cmd, state) - in StandardError + in [StandardError] raise Error - in Event => event + in [Event => event] @repository.store(cmd.id, event) end end diff --git a/examples/decider/lib/project_management/issue.rb b/examples/decider/lib/project_management/issue.rb index f09156b..df9738b 100644 --- a/examples/decider/lib/project_management/issue.rb +++ b/examples/decider/lib/project_management/issue.rb @@ -5,19 +5,21 @@ module Issue class << self def decide(command, state) - case command - when CreateIssue - open(state) - when ResolveIssue - resolve(state) - when CloseIssue - close(state) - when ReopenIssue - reopen(state) - when StartIssueProgress - start(state) - when StopIssueProgress - stop(state) + case [command, state] + in [CreateIssue, State(status: nil)] + [IssueOpened.new(data: { issue_id: state.id })] + in [ResolveIssue, State(status: :open | :in_progress | :reopened)] + [IssueResolved.new(data: { issue_id: state.id })] + in [CloseIssue, State(status: :open | :in_progress | :resolved | :reopened)] + [IssueClosed.new(data: { issue_id: state.id })] + in [ReopenIssue, State(status: :resolved | :closed)] + [IssueReopened.new(data: { issue_id: state.id })] + in [StartIssueProgress, State(status: :open | :reopened)] + [IssueProgressStarted.new(data: { issue_id: state.id })] + in [StopIssueProgress, State(id:, status: :in_progress)] + [IssueProgressStopped.new(data: { issue_id: id })] + else + [InvalidTransition.new] end end @@ -41,56 +43,6 @@ def evolve(state, event) def initial_state(id) State.new(id: id, status: nil) end - - private - - def open(state) - if state.status - InvalidTransition.new - else - IssueOpened.new(data: { issue_id: state.id }) - end - end - - def resolve(state) - if %i[open in_progress reopened].include? state.status - IssueResolved.new(data: { issue_id: state.id }) - else - InvalidTransition.new - end - end - - def close(state) - if %i[open in_progress resolved reopened].include? state.status - IssueClosed.new(data: { issue_id: state.id }) - else - InvalidTransition.new - end - end - - def reopen(state) - if %i[resolved closed].include? state.status - IssueReopened.new(data: { issue_id: state.id }) - else - InvalidTransition.new - end - end - - def stop(state) - if %i[in_progress].include? state.status - IssueProgressStopped.new(data: { issue_id: state.id }) - else - InvalidTransition.new - end - end - - def start(state) - if %i[open reopened].include? state.status - IssueProgressStarted.new(data: { issue_id: state.id }) - else - InvalidTransition.new - end - end end end end