rating-chgk-info-0.3.6.3: src/RatingChgkInfo/Types/Unsafe.hs
{-|
Module : RatingChgkInfo.Types.Unsafe
Description : Небезопасные функции (в смысле безопасности типов)
Copyright : (c) Mansur Ziiatdinov, 2018-2019
License : BSD-3
Maintainer : chgk@pm.me
Stability : experimental
Portability : POSIX
Из этого модуля экспортируются функции, которые не являются безопасными с точки зрения типов.
Например, можно ошибиться и передать идентификатор игрока вместо идентификатора
команды, если оба идентификатора имеют текстовый тип. Чтобы избежать этого
класса ошибок мы используем разные типы для разных идентификаторов, а получить
значения-идентификаторы можно только из запросов к API. Ну, или если хочется
иметь возможность выстрелить в ногу — из этого модуля. Caveat emptor
-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module RatingChgkInfo.Types.Unsafe
( -- * Типы-идентификаторы
PlayerId (..)
, TeamId (..)
, TournamentId (..)
) where
import Control.Lens
import Data.Aeson
import Data.Swagger (ToSchema, declareNamedSchema, schema, description, ToParamSchema)
import Data.Text (Text)
import Servant.API
-- | Идентификатор игрока. В API на самом деле возвращается строка, но во всех
-- функциях работы с игроками используется этот тип. Чтобы получить значение
-- этого типа следует получить данные из API
newtype PlayerId = PlayerId
{ unPlayerId :: Text
} deriving (Eq,Show,Read,Generic,FromJSON,ToJSON,FromHttpApiData,ToHttpApiData)
instance ToSchema PlayerId where
declareNamedSchema _p = declareNamedSchema (Proxy :: Proxy Text)
& mapped.schema.description ?~ "Идентификатор игрока"
instance ToParamSchema PlayerId
-- | Идентификатор команды. В API на самом деле возвращается строка, но во всех
-- функциях работы с командами используется этот тип. Чтобы получить значение
-- этого типа следует получить данные из API
newtype TeamId = TeamId
{ unTeamId :: Text
} deriving (Eq,Show,Read,Generic,FromJSON,ToJSON,FromHttpApiData,ToHttpApiData)
instance ToSchema TeamId where
declareNamedSchema _p = declareNamedSchema (Proxy :: Proxy Text)
& mapped.schema.description ?~ "Идентификатор игрока"
instance ToParamSchema TeamId
-- | Идентификатор турнира. В API на самом деле возвращается строка, но во всех
-- функциях работы с турнирами используется этот тип. Чтобы получить значение
-- этого типа следует получить данные из API
newtype TournamentId = TournamentId
{ unTournamentId :: Text
} deriving (Eq,Show,Read,Generic,FromJSON,ToJSON,FromHttpApiData,ToHttpApiData)
instance ToSchema TournamentId where
declareNamedSchema _p = declareNamedSchema (Proxy :: Proxy Text)
& mapped.schema.description ?~ "Идентификатор игрока"
instance ToParamSchema TournamentId
-- | Идентификатор релиза. В API на самом деле возвращается строка, но во всех
-- функциях работы с релизами используется этот тип. Чтобы получить значение
-- этого типа следует получить данные из API
newtype ReleaseId = ReleaseId
{ unReleaseId :: Text
} deriving (Eq,Show,Read,Generic,FromJSON,ToJSON,ToHttpApiData)
-- | Идентификатор сезона. В API на самом деле возвращается строка, но во всех
-- функциях работы с сезонами используется этот тип. Чтобы получить значение
-- этого типа следует получить данные из API
newtype SeasonId = SeasonId
{ unSeasonId :: Text
} deriving (Eq,Show,Read,Generic,FromJSON,ToJSON,ToHttpApiData)
-- TODO: TownId, RegionId, CountryId