{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Cachix.Types.ContentTypes
  ( XNixNar,
    XNixNarInfo,
    XNixCacheInfo,
  )
where

import qualified Cachix.Types.ByteStringStreaming as ByteStringStreaming
import qualified Cachix.Types.NarInfo as NarInfo
import qualified Cachix.Types.NixCacheInfo as NixCacheInfo
import qualified Data.ByteString.Lazy as BSL
import Data.Coerce (coerce)
import qualified Network.HTTP.Media as M
import Protolude
import Servant.API

data XNixNar deriving (Typeable)

data XNixNarInfo deriving (Typeable)

data XNixCacheInfo deriving (Typeable)

instance Accept XNixCacheInfo where
  contentType :: Proxy XNixCacheInfo -> MediaType
contentType Proxy XNixCacheInfo
_ = ByteString
"application" ByteString -> ByteString -> MediaType
M.// ByteString
"octet-stream"

instance Accept XNixNarInfo where
  contentType :: Proxy XNixNarInfo -> MediaType
contentType Proxy XNixNarInfo
_ = ByteString
"text" ByteString -> ByteString -> MediaType
M.// ByteString
"x-nix-narinfo"

instance Accept XNixNar where
  contentType :: Proxy XNixNar -> MediaType
contentType Proxy XNixNar
_ = ByteString
"application" ByteString -> ByteString -> MediaType
M.// ByteString
"octet-stream"

instance MimeUnrender XNixCacheInfo NixCacheInfo.NixCacheInfo where
  mimeUnrender :: Proxy XNixCacheInfo -> ByteString -> Either String NixCacheInfo
mimeUnrender Proxy XNixCacheInfo
_ ByteString
_ = forall a b. a -> Either a b
Left String
"TODO"

instance MimeUnrender XNixNarInfo NarInfo.CachixNarInfo where
  mimeUnrender :: Proxy XNixNarInfo -> ByteString -> Either String CachixNarInfo
mimeUnrender Proxy XNixNarInfo
_ ByteString
_ = forall a b. a -> Either a b
Left String
"TODO"

instance MimeRender XNixNar ByteStringStreaming.ByteStringStreaming where
  mimeRender :: Proxy XNixNar -> ByteStringStreaming -> ByteString
mimeRender Proxy XNixNar
_ = ByteString -> ByteString
BSL.fromStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce

instance MimeUnrender XNixNar ByteStringStreaming.ByteStringStreaming where
  mimeUnrender :: Proxy XNixNar -> ByteString -> Either String ByteStringStreaming
mimeUnrender Proxy XNixNar
_ = forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
BSL.toStrict

instance MimeUnrender XNixNar ByteStringStreaming.LazyByteStringStreaming where
  mimeUnrender :: Proxy XNixNar
-> ByteString -> Either String LazyByteStringStreaming
mimeUnrender Proxy XNixNar
_ = forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce

instance MimeRender XNixNar ByteStringStreaming.LazyByteStringStreaming where
  mimeRender :: Proxy XNixNar -> LazyByteStringStreaming -> ByteString
mimeRender Proxy XNixNar
_ = coerce :: forall a b. Coercible a b => a -> b
coerce

instance MimeRender PlainText ByteStringStreaming.ByteStringStreaming where
  mimeRender :: Proxy PlainText -> ByteStringStreaming -> ByteString
mimeRender Proxy PlainText
_ = ByteString -> ByteString
BSL.fromStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce

instance MimeUnrender PlainText ByteStringStreaming.ByteStringStreaming where
  mimeUnrender :: Proxy PlainText -> ByteString -> Either String ByteStringStreaming
mimeUnrender Proxy PlainText
_ = forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. coerce :: forall a b. Coercible a b => a -> b
coerce forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
BSL.toStrict