module Network.IPFS.Peer.Types (Peer (..)) where

import           RIO

import           Control.Lens
import           Data.Aeson
import           Data.Swagger
import           Servant.API

import qualified Network.IPFS.Internal.UTF8 as UTF8

newtype Peer = Peer { Peer -> Text
peer :: Text }
  deriving          ( Peer -> Peer -> Bool
(Peer -> Peer -> Bool) -> (Peer -> Peer -> Bool) -> Eq Peer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Peer -> Peer -> Bool
$c/= :: Peer -> Peer -> Bool
== :: Peer -> Peer -> Bool
$c== :: Peer -> Peer -> Bool
Eq
                    , Int -> Peer -> ShowS
[Peer] -> ShowS
Peer -> String
(Int -> Peer -> ShowS)
-> (Peer -> String) -> ([Peer] -> ShowS) -> Show Peer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Peer] -> ShowS
$cshowList :: [Peer] -> ShowS
show :: Peer -> String
$cshow :: Peer -> String
showsPrec :: Int -> Peer -> ShowS
$cshowsPrec :: Int -> Peer -> ShowS
Show
                    )
  deriving newtype  ( Peer -> Text
Peer -> Utf8Builder
(Peer -> Utf8Builder) -> (Peer -> Text) -> Display Peer
forall a. (a -> Utf8Builder) -> (a -> Text) -> Display a
textDisplay :: Peer -> Text
$ctextDisplay :: Peer -> Text
display :: Peer -> Utf8Builder
$cdisplay :: Peer -> Utf8Builder
Display
                    , String -> Peer
(String -> Peer) -> IsString Peer
forall a. (String -> a) -> IsString a
fromString :: String -> Peer
$cfromString :: String -> Peer
IsString
                    , Value -> Parser [Peer]
Value -> Parser Peer
(Value -> Parser Peer) -> (Value -> Parser [Peer]) -> FromJSON Peer
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Peer]
$cparseJSONList :: Value -> Parser [Peer]
parseJSON :: Value -> Parser Peer
$cparseJSON :: Value -> Parser Peer
FromJSON
                    )

instance ToJSON Peer where
  toJSON :: Peer -> Value
toJSON = Text -> Value
String (Text -> Value) -> (Peer -> Text) -> Peer -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peer -> Text
peer

instance ToSchema Peer where
  declareNamedSchema :: Proxy Peer -> Declare (Definitions Schema) NamedSchema
declareNamedSchema Proxy Peer
_ =
     NamedSchema -> Declare (Definitions Schema) NamedSchema
forall (m :: * -> *) a. Monad m => a -> m a
return (NamedSchema -> Declare (Definitions Schema) NamedSchema)
-> NamedSchema -> Declare (Definitions Schema) NamedSchema
forall a b. (a -> b) -> a -> b
$ Maybe Text -> Schema -> NamedSchema
NamedSchema (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"IPFSPeer") (Schema -> NamedSchema) -> Schema -> NamedSchema
forall a b. (a -> b) -> a -> b
$ Schema
forall a. Monoid a => a
mempty
            Schema -> (Schema -> Schema) -> Schema
forall a b. a -> (a -> b) -> b
& (Maybe (SwaggerType 'SwaggerKindSchema)
 -> Identity (Maybe (SwaggerType 'SwaggerKindSchema)))
-> Schema -> Identity Schema
forall s a. HasType s a => Lens' s a
type_       ((Maybe (SwaggerType 'SwaggerKindSchema)
  -> Identity (Maybe (SwaggerType 'SwaggerKindSchema)))
 -> Schema -> Identity Schema)
-> SwaggerType 'SwaggerKindSchema -> Schema -> Schema
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ SwaggerType 'SwaggerKindSchema
forall (t :: SwaggerKind *). SwaggerType t
SwaggerString
            Schema -> (Schema -> Schema) -> Schema
forall a b. a -> (a -> b) -> b
& (Maybe Value -> Identity (Maybe Value))
-> Schema -> Identity Schema
forall s a. HasExample s a => Lens' s a
example     ((Maybe Value -> Identity (Maybe Value))
 -> Schema -> Identity Schema)
-> Value -> Schema -> Schema
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Value
"/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd"
            Schema -> (Schema -> Schema) -> Schema
forall a b. a -> (a -> b) -> b
& (Maybe Text -> Identity (Maybe Text)) -> Schema -> Identity Schema
forall s a. HasDescription s a => Lens' s a
description ((Maybe Text -> Identity (Maybe Text))
 -> Schema -> Identity Schema)
-> Text -> Schema -> Schema
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Text
"An IPFS peer address"

instance MimeRender PlainText Peer where
  mimeRender :: Proxy PlainText -> Peer -> ByteString
mimeRender Proxy PlainText
_ = Text -> ByteString
UTF8.textToLazyBS (Text -> ByteString) -> (Peer -> Text) -> Peer -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peer -> Text
peer

instance MimeRender OctetStream Peer where
  mimeRender :: Proxy OctetStream -> Peer -> ByteString
mimeRender Proxy OctetStream
_ = Text -> ByteString
UTF8.textToLazyBS (Text -> ByteString) -> (Peer -> Text) -> Peer -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peer -> Text
peer