{-| 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