httpstan-0.3.0.0: lib/Httpstan/Types.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-unused-imports #-}
module Httpstan.Types (
CreateFitRequest (..),
CreateModelRequest (..),
Fit (..),
Model (..),
Operation (..),
Parameter (..),
Status (..),
V1ModelsGet200Response (..),
V1ModelsModelIdLogProbGradPost200Response (..),
V1ModelsModelIdLogProbPost200Response (..),
V1ModelsModelIdParamsPost200Response (..),
V1ModelsModelIdTransformInitsPost200Response (..),
V1ModelsModelIdWriteArrayPost200Response (..),
) where
import Data.Data (Data)
import Data.UUID (UUID)
import Data.List (stripPrefix)
import Data.Maybe (fromMaybe)
import Data.Aeson (Value, FromJSON(..), ToJSON(..), genericToJSON, genericParseJSON)
import Data.Aeson.Types (Options(..), defaultOptions)
import Data.Set (Set)
import Data.Text (Text)
import Data.Time
import Data.Swagger (ToSchema, declareNamedSchema)
import qualified Data.Swagger as Swagger
import qualified Data.Char as Char
import qualified Data.Text as T
import qualified Data.Map as Map
import GHC.Generics (Generic)
import Data.Function ((&))
-- |
data CreateFitRequest = CreateFitRequest
{ createFitRequestChain :: Maybe Int -- ^
, createFitRequestData :: Maybe Value -- ^
, createFitRequestDelta :: Maybe Double -- ^
, createFitRequestFunction :: Text -- ^
, createFitRequestGamma :: Maybe Double -- ^
, createFitRequestInit :: Maybe Value -- ^
, createFitRequestInitUnderscorebuffer :: Maybe Int -- ^
, createFitRequestInitUnderscoreradius :: Maybe Double -- ^
, createFitRequestKappa :: Maybe Double -- ^
, createFitRequestMaxUnderscoredepth :: Maybe Int -- ^
, createFitRequestNumUnderscoresamples :: Maybe Int -- ^
, createFitRequestNumUnderscorethin :: Maybe Int -- ^
, createFitRequestNumUnderscorewarmup :: Maybe Int -- ^
, createFitRequestRandomUnderscoreseed :: Maybe Int -- ^
, createFitRequestRefresh :: Maybe Int -- ^
, createFitRequestSaveUnderscorewarmup :: Maybe Bool -- ^
, createFitRequestStepsize :: Maybe Double -- ^
, createFitRequestStepsizeUnderscorejitter :: Maybe Double -- ^
, createFitRequestT0 :: Maybe Double -- ^
, createFitRequestTermUnderscorebuffer :: Maybe Int -- ^
, createFitRequestWindow :: Maybe Int -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON CreateFitRequest where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "createFitRequest")
instance ToJSON CreateFitRequest where
toJSON = genericToJSON (removeFieldLabelPrefix False "createFitRequest")
-- |
data CreateModelRequest = CreateModelRequest
{ createModelRequestProgramUnderscorecode :: Text -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON CreateModelRequest where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "createModelRequest")
instance ToJSON CreateModelRequest where
toJSON = genericToJSON (removeFieldLabelPrefix False "createModelRequest")
-- |
data Fit = Fit
{ fitName :: Text -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON Fit where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "fit")
instance ToJSON Fit where
toJSON = genericToJSON (removeFieldLabelPrefix False "fit")
-- |
data Model = Model
{ modelCompilerUnderscoreoutput :: Text -- ^
, modelName :: Text -- ^
, modelStancUnderscorewarnings :: Text -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON Model where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "model")
instance ToJSON Model where
toJSON = genericToJSON (removeFieldLabelPrefix False "model")
-- |
data Operation = Operation
{ operationDone :: Bool -- ^
, operationMetadata :: Maybe Value -- ^
, operationName :: Text -- ^
, operationResult :: Maybe Value -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON Operation where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "operation")
instance ToJSON Operation where
toJSON = genericToJSON (removeFieldLabelPrefix False "operation")
-- |
data Parameter = Parameter
{ parameterConstrainedUnderscorenames :: [Text] -- ^
, parameterDims :: [Int] -- ^
, parameterName :: Text -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON Parameter where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "parameter")
instance ToJSON Parameter where
toJSON = genericToJSON (removeFieldLabelPrefix False "parameter")
-- |
data Status = Status
{ statusCode :: Int -- ^
, statusDetails :: Maybe [Value] -- ^
, statusMessage :: Text -- ^
, statusStatus :: Text -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON Status where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "status")
instance ToJSON Status where
toJSON = genericToJSON (removeFieldLabelPrefix False "status")
-- |
data V1ModelsGet200Response = V1ModelsGet200Response
{ v1ModelsGet200ResponseModels :: Maybe [Model] -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON V1ModelsGet200Response where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "v1ModelsGet200Response")
instance ToJSON V1ModelsGet200Response where
toJSON = genericToJSON (removeFieldLabelPrefix False "v1ModelsGet200Response")
-- |
data V1ModelsModelIdLogProbGradPost200Response = V1ModelsModelIdLogProbGradPost200Response
{ v1ModelsModelIdLogProbGradPost200ResponseGradUnderscorelogUnderscoreprob :: Maybe [Double] -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON V1ModelsModelIdLogProbGradPost200Response where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "v1ModelsModelIdLogProbGradPost200Response")
instance ToJSON V1ModelsModelIdLogProbGradPost200Response where
toJSON = genericToJSON (removeFieldLabelPrefix False "v1ModelsModelIdLogProbGradPost200Response")
-- |
data V1ModelsModelIdLogProbPost200Response = V1ModelsModelIdLogProbPost200Response
{ v1ModelsModelIdLogProbPost200ResponseLogUnderscoreprob :: Maybe Double -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON V1ModelsModelIdLogProbPost200Response where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "v1ModelsModelIdLogProbPost200Response")
instance ToJSON V1ModelsModelIdLogProbPost200Response where
toJSON = genericToJSON (removeFieldLabelPrefix False "v1ModelsModelIdLogProbPost200Response")
-- |
data V1ModelsModelIdParamsPost200Response = V1ModelsModelIdParamsPost200Response
{ v1ModelsModelIdParamsPost200ResponseId :: Maybe Text -- ^
, v1ModelsModelIdParamsPost200ResponseParams :: Maybe [Parameter] -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON V1ModelsModelIdParamsPost200Response where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "v1ModelsModelIdParamsPost200Response")
instance ToJSON V1ModelsModelIdParamsPost200Response where
toJSON = genericToJSON (removeFieldLabelPrefix False "v1ModelsModelIdParamsPost200Response")
-- |
data V1ModelsModelIdTransformInitsPost200Response = V1ModelsModelIdTransformInitsPost200Response
{ v1ModelsModelIdTransformInitsPost200ResponseParamsUnderscorerUnderscoreunconstrained :: Maybe [Double] -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON V1ModelsModelIdTransformInitsPost200Response where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "v1ModelsModelIdTransformInitsPost200Response")
instance ToJSON V1ModelsModelIdTransformInitsPost200Response where
toJSON = genericToJSON (removeFieldLabelPrefix False "v1ModelsModelIdTransformInitsPost200Response")
-- |
data V1ModelsModelIdWriteArrayPost200Response = V1ModelsModelIdWriteArrayPost200Response
{ v1ModelsModelIdWriteArrayPost200ResponseParamsUnderscorerUnderscoreconstrained :: Maybe [Double] -- ^
} deriving (Show, Eq, Generic, Data)
instance FromJSON V1ModelsModelIdWriteArrayPost200Response where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "v1ModelsModelIdWriteArrayPost200Response")
instance ToJSON V1ModelsModelIdWriteArrayPost200Response where
toJSON = genericToJSON (removeFieldLabelPrefix False "v1ModelsModelIdWriteArrayPost200Response")
uncapitalize :: String -> String
uncapitalize (first:rest) = Char.toLower first : rest
uncapitalize [] = []
-- | Remove a field label prefix during JSON parsing.
-- Also perform any replacements for special characters.
-- The @forParsing@ parameter is to distinguish between the cases in which we're using this
-- to power a @FromJSON@ or a @ToJSON@ instance. In the first case we're parsing, and we want
-- to replace special characters with their quoted equivalents (because we cannot have special
-- chars in identifier names), while we want to do vice versa when sending data instead.
removeFieldLabelPrefix :: Bool -> String -> Options
removeFieldLabelPrefix forParsing prefix =
defaultOptions
{ omitNothingFields = True
, fieldLabelModifier = uncapitalize . fromMaybe (error ("did not find prefix " ++ prefix)) . stripPrefix prefix . replaceSpecialChars
}
where
replaceSpecialChars field = foldl (&) field (map mkCharReplacement specialChars)
specialChars =
[ ("$", "'Dollar")
, ("^", "'Caret")
, ("|", "'Pipe")
, ("=", "'Equal")
, ("*", "'Star")
, ("-", "'Dash")
, ("&", "'Ampersand")
, ("%", "'Percent")
, ("#", "'Hash")
, ("@", "'At")
, ("!", "'Exclamation")
, ("+", "'Plus")
, (":", "'Colon")
, (";", "'Semicolon")
, (">", "'GreaterThan")
, ("<", "'LessThan")
, (".", "'Period")
, ("_", "'Underscore")
, ("?", "'Question_Mark")
, (",", "'Comma")
, ("'", "'Quote")
, ("/", "'Slash")
, ("(", "'Left_Parenthesis")
, (")", "'Right_Parenthesis")
, ("{", "'Left_Curly_Bracket")
, ("}", "'Right_Curly_Bracket")
, ("[", "'Left_Square_Bracket")
, ("]", "'Right_Square_Bracket")
, ("~", "'Tilde")
, ("`", "'Backtick")
, ("<=", "'Less_Than_Or_Equal_To")
, (">=", "'Greater_Than_Or_Equal_To")
, ("!=", "'Not_Equal")
, ("<>", "'Not_Equal")
, ("~=", "'Tilde_Equal")
, ("\\", "'Back_Slash")
, ("\"", "'Double_Quote")
]
mkCharReplacement (replaceStr, searchStr) = T.unpack . replacer (T.pack searchStr) (T.pack replaceStr) . T.pack
replacer =
if forParsing
then flip T.replace
else T.replace