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

import Data.Swagger (ToParamSchema (..))
import qualified Data.Text as T
import Protolude
import Servant.API

-- | <hash>.nar.<extension> file
data NarFileName = NarFileName
  { NarFileName -> Text
contentHash :: Text,
    NarFileName -> Text
extension :: Text
  }
  deriving (forall x. Rep NarFileName x -> NarFileName
forall x. NarFileName -> Rep NarFileName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep NarFileName x -> NarFileName
$cfrom :: forall x. NarFileName -> Rep NarFileName x
Generic)

instance FromHttpApiData NarFileName where
  parseUrlPiece :: Text -> Either Text NarFileName
parseUrlPiece Text
s =
    case Text -> Text -> [Text]
T.splitOn Text
"." Text
s of
      [Text
filename, Text
"nar", Text
ext] ->
        forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ Text -> Text -> NarFileName
NarFileName Text
filename Text
ext
      [Text]
_ -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ Text
"Wrong nar filename: " forall a. Semigroup a => a -> a -> a
<> Text
s

instance ToHttpApiData NarFileName where
  toUrlPiece :: NarFileName -> Text
toUrlPiece NarFileName
narfilename = NarFileName -> Text
contentHash NarFileName
narfilename forall a. Semigroup a => a -> a -> a
<> Text
".nar." forall a. Semigroup a => a -> a -> a
<> NarFileName -> Text
extension NarFileName
narfilename

instance ToParamSchema NarFileName where
  toParamSchema :: forall (t :: SwaggerKind (*)). Proxy NarFileName -> ParamSchema t
toParamSchema Proxy NarFileName
_ = forall a (t :: SwaggerKind (*)).
ToParamSchema a =>
Proxy a -> ParamSchema t
toParamSchema (forall {k} (t :: k). Proxy t
Proxy :: Proxy Text)