[haskell] Implemented contract
This commit is contained in:
parent
a775330b4f
commit
b3d57cb6ad
6 changed files with 82 additions and 5 deletions
|
@ -9,6 +9,7 @@ import qualified Data.Text as T
|
|||
import SpaceTraders.APIClient.Agent
|
||||
import SpaceTraders.Database
|
||||
import SpaceTraders.Database.Agents
|
||||
import SpaceTraders.Database.Contracts
|
||||
import SpaceTraders.Database.Tokens
|
||||
|
||||
main :: IO ()
|
||||
|
@ -25,6 +26,7 @@ main = do
|
|||
case r of
|
||||
Right r' -> do
|
||||
setAgent conn $ agent r'
|
||||
addContract conn $ contract r'
|
||||
let t = token r'
|
||||
setToken conn $ t
|
||||
return t
|
||||
|
|
|
@ -23,6 +23,7 @@ dependencies:
|
|||
- http-types
|
||||
- sqlite-simple
|
||||
- text
|
||||
- time
|
||||
- raw-strings-qq
|
||||
|
||||
ghc-options:
|
||||
|
|
|
@ -15,16 +15,18 @@ import Network.HTTP.Simple
|
|||
|
||||
import SpaceTraders.APIClient.Client
|
||||
import SpaceTraders.Model.Agent
|
||||
import SpaceTraders.Model.Contract
|
||||
|
||||
myAgent :: T.Text -> IO (Either APIError Agent)
|
||||
myAgent t = send $ setRequestPath "/v2/my/agent"
|
||||
$ tokenReq t
|
||||
|
||||
data RegisterRequest = RegisterRequest { symbol :: T.Text
|
||||
, faction :: T.Text
|
||||
data RegisterRequest = RegisterRequest { faction :: T.Text
|
||||
, symbol :: T.Text
|
||||
} deriving (ToJSON, Generic, Show)
|
||||
data RegisterMessage = RegisterMessage { token :: T.Text
|
||||
, agent :: Agent
|
||||
data RegisterMessage = RegisterMessage { agent :: Agent
|
||||
, contract :: Contract
|
||||
, token :: T.Text
|
||||
} deriving (FromJSON, Generic, Show)
|
||||
|
||||
register :: T.Text -> T.Text -> IO (Either APIError RegisterMessage)
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE QuasiQuotes #-}
|
||||
|
||||
module SpaceTraders.Database.Agents
|
||||
( setAgent
|
||||
|
|
13
haskell/src/SpaceTraders/Database/Contracts.hs
Normal file
13
haskell/src/SpaceTraders/Database/Contracts.hs
Normal file
|
@ -0,0 +1,13 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module SpaceTraders.Database.Contracts
|
||||
( addContract
|
||||
) where
|
||||
|
||||
import Data.Aeson
|
||||
import qualified Database.SQLite.Simple as S
|
||||
|
||||
import SpaceTraders.Model.Contract
|
||||
|
||||
addContract :: S.Connection -> Contract -> IO ()
|
||||
addContract conn contract = S.execute conn "INSERT INTO contracts(data) VALUES (json(?));" (S.Only (encode contract))
|
60
haskell/src/SpaceTraders/Model/Contract.hs
Normal file
60
haskell/src/SpaceTraders/Model/Contract.hs
Normal file
|
@ -0,0 +1,60 @@
|
|||
{-# LANGUAGE DeriveAnyClass #-}
|
||||
{-# LANGUAGE DeriveGeneric #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module SpaceTraders.Model.Contract
|
||||
( Contract(..)
|
||||
, Delivery(..)
|
||||
, Payment(..)
|
||||
, Terms(..)
|
||||
) where
|
||||
|
||||
import Control.Monad
|
||||
import Data.Aeson
|
||||
import Data.Time
|
||||
import GHC.Generics
|
||||
import qualified Data.Text as T
|
||||
|
||||
data Contract = Contract { accepted :: Bool
|
||||
, contractId :: T.Text
|
||||
, contractType :: T.Text
|
||||
, expiration :: UTCTime
|
||||
, deadlineToAccept :: UTCTime
|
||||
, factionSymbol :: T.Text
|
||||
, fulfilled :: Bool
|
||||
, terms :: Terms
|
||||
} deriving (Generic, Show)
|
||||
instance FromJSON Contract where
|
||||
parseJSON (Object o) = Contract <$> o .: "accepted"
|
||||
<*> o .: "id"
|
||||
<*> o .: "type"
|
||||
<*> o .: "expiration"
|
||||
<*> o .: "deadlineToAccept"
|
||||
<*> o .: "factionSymbol"
|
||||
<*> o .: "fulfilled"
|
||||
<*> o .: "terms"
|
||||
parseJSON _ = mzero
|
||||
instance ToJSON Contract where
|
||||
toEncoding (Contract a i ty e d fa fu te) = pairs ( "accepted" .= a
|
||||
<> "id" .= i
|
||||
<> "type" .= ty
|
||||
<> "expiration" .= e
|
||||
<> "deadlineToAccept" .= d
|
||||
<> "factionSymbol" .= fa
|
||||
<> "fulfilled" .= fu
|
||||
<> "terms" .= te )
|
||||
|
||||
data Delivery = Delivery { destinationSymbol :: T.Text
|
||||
, tradeSymbol :: T.Text
|
||||
, unitsFulfilled :: Int
|
||||
, unitsRequired :: Int
|
||||
} deriving (FromJSON, Generic, Show, ToJSON)
|
||||
|
||||
data Payment = Payment { onAccepted :: Int
|
||||
, onFulfilled :: Int
|
||||
} deriving (FromJSON, Generic, Show, ToJSON)
|
||||
|
||||
data Terms = Terms { deadline :: UTCTime
|
||||
, deliver :: [Delivery]
|
||||
, payment :: Payment
|
||||
} deriving (FromJSON, Generic, Show, ToJSON)
|
Loading…
Add table
Reference in a new issue