module Cachix.Types.NarInfoHash
  ( NarInfoHash (..),
  )
where

import Data.Swagger (ToParamSchema, ToSchema)
import Data.Text (dropEnd, takeEnd)
import Protolude
import Servant.API

-- | Store path hash
newtype NarInfoHash = NarInfoHash {NarInfoHash -> Text
unnarinfohash :: Text}
  deriving ((forall x. NarInfoHash -> Rep NarInfoHash x)
-> (forall x. Rep NarInfoHash x -> NarInfoHash)
-> Generic NarInfoHash
forall x. Rep NarInfoHash x -> NarInfoHash
forall x. NarInfoHash -> Rep NarInfoHash x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep NarInfoHash x -> NarInfoHash
$cfrom :: forall x. NarInfoHash -> Rep NarInfoHash x
Generic, Proxy NarInfoHash -> Declare (Definitions Schema) NamedSchema
(Proxy NarInfoHash -> Declare (Definitions Schema) NamedSchema)
-> ToSchema NarInfoHash
forall a.
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
declareNamedSchema :: Proxy NarInfoHash -> Declare (Definitions Schema) NamedSchema
$cdeclareNamedSchema :: Proxy NarInfoHash -> Declare (Definitions Schema) NamedSchema
ToSchema, (forall (t :: SwaggerKind *). Proxy NarInfoHash -> ParamSchema t)
-> ToParamSchema NarInfoHash
forall a.
(forall (t :: SwaggerKind *). Proxy a -> ParamSchema t)
-> ToParamSchema a
forall (t :: SwaggerKind *). Proxy NarInfoHash -> ParamSchema t
toParamSchema :: Proxy NarInfoHash -> ParamSchema t
$ctoParamSchema :: forall (t :: SwaggerKind *). Proxy NarInfoHash -> ParamSchema t
ToParamSchema)

instance FromHttpApiData NarInfoHash where
  parseUrlPiece :: Text -> Either Text NarInfoHash
parseUrlPiece Text
s =
    if Int -> Text -> Text
takeEnd Int
8 Text
s Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
".narinfo"
      then NarInfoHash -> Either Text NarInfoHash
forall a b. b -> Either a b
Right (NarInfoHash -> Either Text NarInfoHash)
-> NarInfoHash -> Either Text NarInfoHash
forall a b. (a -> b) -> a -> b
$ Text -> NarInfoHash
NarInfoHash (Int -> Text -> Text
dropEnd Int
8 Text
s)
      else Text -> Either Text NarInfoHash
forall a b. a -> Either a b
Left Text
""

instance ToHttpApiData NarInfoHash where
  toUrlPiece :: NarInfoHash -> Text
toUrlPiece (NarInfoHash Text
n) = Text
n Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
".narinfo"