-
Notifications
You must be signed in to change notification settings - Fork 66
/
Example.elm
108 lines (80 loc) · 2.97 KB
/
Example.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
{-
Copyright 2020 Morgan Stanley
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-}
module Morphir.Dapr.Input.Example exposing (..)
import Morphir.SDK.StatefulApp exposing (StatefulApp)
{- Type aliases for modeling in the language of the business -}
type alias ID =
String
type alias ProductID =
String
type alias Price =
Float
type alias Quantity =
Int
{- Identifies a structure that can be associated to a persistance entity -}
type alias Deal =
{ id : ID
, product : ProductID
, price : Price
, quantity : Quantity
}
{- These define the requests that can be made of this service -}
type DealCmd
= OpenDeal ID ProductID Price Quantity
| CloseDeal ID
{- These define the responses that would result from requests -}
type DealEvent
= DealOpened ID ProductID Price Quantity
| DealClosed ID
| InvalidQuantity ID Quantity
| InvalidPrice ID Price
| DuplicateDeal ID
| DealNotFound ID
{- Defines that this is a stateful application that uses ID as the entity key (for possible partioning),
accepts requests of type DealCmd,
manages data in the form of a Deal,
and produces events of type DealEvent.
Note that there's no indication of whether the API is synchronous or asynchronous. That's up to the implementation to decide.
-}
type alias App =
StatefulApp ID DealCmd Deal DealEvent
app : App
app =
StatefulApp logic
{- Defines the business logic of this app.
That is whether or not to accept a request to open or close a deal.
-}
logic : ID -> Maybe Deal -> DealCmd -> ( ID, Maybe Deal, DealEvent )
logic dealId deal dealCmd =
-- Act accordingly based on whether the deal already exists.
case deal of
Just d ->
case dealCmd of
CloseDeal _ ->
( dealId, Nothing, DealClosed dealId )
OpenDeal _ _ _ _ ->
( dealId, deal, DuplicateDeal dealId )
Nothing ->
case dealCmd of
OpenDeal id productId price qty ->
if price < 0 then
( dealId, deal, InvalidPrice id price )
else if qty < 0 then
( dealId, deal, InvalidQuantity id qty )
else
( dealId
, Deal id productId price qty |> Just
, DealOpened id productId price qty
)
CloseDeal _ ->
( dealId, deal, DealNotFound dealId )