packages feed

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