module Spark.Core.Internal.Client where
import Spark.Core.StructuresInternal
import Spark.Core.Dataset(UntypedNode)
import Spark.Core.Internal.Utilities
import Data.Text(Text, pack)
import Data.Aeson
import Data.Aeson.Types(Parser)
import GHC.Generics
data LocalSessionId = LocalSessionId {
unLocalSession :: !Text
} deriving (Eq, Show)
data ComputationID = ComputationID {
unComputationID :: !Text
} deriving (Eq, Show, Generic)
data Computation = Computation {
cSessionId :: !LocalSessionId,
cId :: !ComputationID,
cNodes :: ![UntypedNode],
cTerminalNodes :: ![NodeName],
cCollectingNode :: NodeName
} deriving (Show, Generic)
data PossibleNodeStatus =
NodeQueued
| NodeRunning
| NodeFinishedSuccess NodeComputationSuccess
| NodeFinishedFailure NodeComputationFailure deriving (Show, Generic)
data NodeComputationSuccess = NodeComputationSuccess {
ncsData :: Value
} deriving (Show, Generic)
data NodeComputationFailure = NodeComputationFailure {
ncfMessage :: !Text
} deriving (Show, Generic)
instance ToJSON Computation
instance ToJSON LocalSessionId where
toJSON = toJSON . unLocalSession
instance ToJSON ComputationID where
toJSON = toJSON . unComputationID
instance FromJSON PossibleNodeStatus where
parseJSON =
let parseSuccess :: Object -> Parser PossibleNodeStatus
parseSuccess o =
(NodeFinishedSuccess . NodeComputationSuccess) <$> o .: pack "finalResult"
parseFailure :: Object -> Parser PossibleNodeStatus
parseFailure o =
(NodeFinishedFailure . NodeComputationFailure) <$> o .: pack "finalError"
in
withObject "PossibleNodeStatus" $ \o -> do
status <- o .: pack "status"
case status of
"running" -> return NodeRunning
"finished_success" -> parseSuccess o
"finished_failure" -> parseFailure o
"scheduled" -> return NodeQueued
_ -> failure $ pack ("FromJSON PossibleNodeStatus " ++ show status)