@@ -4,20 +4,37 @@ module Cli
4
4
) where
5
5
6
6
import Control.Monad.IO.Class (MonadIO (.. ))
7
- import Core.Context (withContext )
7
+ import Control.Monad.Trans.Class (MonadTrans (.. ))
8
+ import Core.Context (askConfig , askMpfs , askValidation , withContext )
8
9
import Core.Types.Basic (RequestRefId , TokenId )
9
10
import Core.Types.MPFS (MPFSClient (.. ))
10
11
import Core.Types.Tx (TxHash , WithTxHash (.. ))
11
12
import Core.Types.Wallet (Wallet )
13
+ import Data.Functor.Identity (Identity (.. ))
12
14
import Lib.GitHub (getOAUth )
15
+ import Lib.JSON.Canonical.Extra
13
16
import MPFS.API
14
- ( getTokenFacts
17
+ ( MPFS (.. )
18
+ , getTokenFacts
15
19
, mpfsClient
16
20
, retractChange
17
21
)
18
22
import Oracle.Cli (OracleCommand (.. ), oracleCmd )
23
+ import Oracle.Types
24
+ ( RequestValidationFailure
25
+ , Token (.. )
26
+ , TokenState (.. )
27
+ , fmapMToken
28
+ )
29
+ import Oracle.Validate.Request (validateRequest )
30
+ import Oracle.Validate.Types
31
+ ( AValidationResult
32
+ , ValidationResult
33
+ , liftMaybe
34
+ , runValidate
35
+ )
19
36
import Submitting (Submission (.. ))
20
- import Text.JSON.Canonical (JSValue )
37
+ import Text.JSON.Canonical (FromJSON ( .. ), JSValue , ToJSON ( .. ) )
21
38
import User.Agent.Cli
22
39
( AgentCommand (.. )
23
40
, IsReady (NotReady )
@@ -38,6 +55,11 @@ data Command a where
38
55
:: MPFSClient -> Wallet -> RequestRefId -> Command TxHash
39
56
GetFacts :: MPFSClient -> TokenId -> Command JSValue
40
57
Wallet :: WalletCommand a -> Command a
58
+ GetToken
59
+ :: MPFSClient
60
+ -> TokenId
61
+ -> Command
62
+ (AValidationResult TokenInfoFailure (Token WithValidation ))
41
63
42
64
data SetupError = TokenNotSpecified
43
65
deriving (Show , Eq )
@@ -87,3 +109,46 @@ cmd = \case
87
109
GetFacts MPFSClient {runMPFS} tokenId -> do
88
110
runMPFS $ getTokenFacts tokenId
89
111
Wallet walletCommand -> liftIO $ walletCmd walletCommand
112
+ GetToken
113
+ MPFSClient {runMPFS, submitTx}
114
+ tk -> do
115
+ auth <- getOAUth
116
+ runMPFS
117
+ $ withContext
118
+ mpfsClient
119
+ (mkValidation auth)
120
+ submitTx
121
+ $ do
122
+ validation <- askValidation $ Just tk
123
+ mconfig <- askConfig tk
124
+ mpfs <- askMpfs
125
+ lift $ runValidate $ do
126
+ mpendings <- lift $ fromJSON <$> mpfsGetToken mpfs tk
127
+ token <- liftMaybe (TokenInfoTokenNotParsable tk) mpendings
128
+ let oracle = tokenOwner $ tokenState token
129
+ f (Identity req) = do
130
+ r <-
131
+ runValidate
132
+ $ validateRequest oracle mconfig validation req
133
+ pure $ WithValidation r req
134
+ lift $ fmapMToken f token
135
+
136
+ newtype TokenInfoFailure = TokenInfoTokenNotParsable TokenId
137
+ deriving (Show , Eq )
138
+
139
+ instance Monad m => ToJSON m TokenInfoFailure where
140
+ toJSON (TokenInfoTokenNotParsable tk) =
141
+ object [" tokenNotParsable" .= tk]
142
+
143
+ data WithValidation x = WithValidation
144
+ { validation :: ValidationResult RequestValidationFailure
145
+ , request :: x
146
+ }
147
+ deriving (Show , Eq )
148
+
149
+ instance (Monad m , ToJSON m x ) => ToJSON m (WithValidation x ) where
150
+ toJSON (WithValidation mvalidation request) =
151
+ object
152
+ [ " validation" .= mvalidation
153
+ , " request" .= request
154
+ ]
0 commit comments