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. 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
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 a.
(forall (t :: SwaggerKind (*)). Proxy a -> ParamSchema t)
-> ToParamSchema a
forall (t :: SwaggerKind (*)). Proxy NarInfoHash -> ParamSchema t
toParamSchema :: forall (t :: SwaggerKind (*)). 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 forall a. Eq a => a -> a -> Bool
== Text
".narinfo"
      then forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ Text -> NarInfoHash
NarInfoHash (Int -> Text -> Text
dropEnd Int
8 Text
s)
      else forall a b. a -> Either a b
Left Text
""

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