Skip to content

Commit 4f542c3

Browse files
Merge pull request #6 from jandudulski/decider-pattern-matching
Utilize pattern matching in decider pattern
2 parents d15e9c1 + 875adcb commit 4f542c3

File tree

2 files changed

+17
-65
lines changed

2 files changed

+17
-65
lines changed

examples/decider/lib/project_management/handler.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ def call(cmd)
99
state = @repository.load(cmd.id, @decider)
1010

1111
case @decider.decide(cmd, state)
12-
in StandardError
12+
in [StandardError]
1313
raise Error
14-
in Event => event
14+
in [Event => event]
1515
@repository.store(cmd.id, event)
1616
end
1717
end

examples/decider/lib/project_management/issue.rb

Lines changed: 15 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@ module Issue
55

66
class << self
77
def decide(command, state)
8-
case command
9-
when CreateIssue
10-
open(state)
11-
when ResolveIssue
12-
resolve(state)
13-
when CloseIssue
14-
close(state)
15-
when ReopenIssue
16-
reopen(state)
17-
when StartIssueProgress
18-
start(state)
19-
when StopIssueProgress
20-
stop(state)
8+
case [command, state]
9+
in [CreateIssue, State(id:, status: nil)]
10+
[IssueOpened.new(data: { issue_id: id })]
11+
in [ResolveIssue, State(id:, status: :open | :in_progress | :reopened)]
12+
[IssueResolved.new(data: { issue_id: id })]
13+
in [CloseIssue, State(id:, status: :open | :in_progress | :resolved | :reopened)]
14+
[IssueClosed.new(data: { issue_id: id })]
15+
in [ReopenIssue, State(id:, status: :resolved | :closed)]
16+
[IssueReopened.new(data: { issue_id: id })]
17+
in [StartIssueProgress, State(id:, status: :open | :reopened)]
18+
[IssueProgressStarted.new(data: { issue_id: id })]
19+
in [StopIssueProgress, State(id:, status: :in_progress)]
20+
[IssueProgressStopped.new(data: { issue_id: id })]
21+
else
22+
[InvalidTransition.new]
2123
end
2224
end
2325

@@ -41,56 +43,6 @@ def evolve(state, event)
4143
def initial_state(id)
4244
State.new(id: id, status: nil)
4345
end
44-
45-
private
46-
47-
def open(state)
48-
if state.status
49-
InvalidTransition.new
50-
else
51-
IssueOpened.new(data: { issue_id: state.id })
52-
end
53-
end
54-
55-
def resolve(state)
56-
if %i[open in_progress reopened].include? state.status
57-
IssueResolved.new(data: { issue_id: state.id })
58-
else
59-
InvalidTransition.new
60-
end
61-
end
62-
63-
def close(state)
64-
if %i[open in_progress resolved reopened].include? state.status
65-
IssueClosed.new(data: { issue_id: state.id })
66-
else
67-
InvalidTransition.new
68-
end
69-
end
70-
71-
def reopen(state)
72-
if %i[resolved closed].include? state.status
73-
IssueReopened.new(data: { issue_id: state.id })
74-
else
75-
InvalidTransition.new
76-
end
77-
end
78-
79-
def stop(state)
80-
if %i[in_progress].include? state.status
81-
IssueProgressStopped.new(data: { issue_id: state.id })
82-
else
83-
InvalidTransition.new
84-
end
85-
end
86-
87-
def start(state)
88-
if %i[open reopened].include? state.status
89-
IssueProgressStarted.new(data: { issue_id: state.id })
90-
else
91-
InvalidTransition.new
92-
end
93-
end
9446
end
9547
end
9648
end

0 commit comments

Comments
 (0)