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

import qualified RIO.Text             as Text

import           Data.Swagger         (ToParamSchema, ToSchema (..))
import           Servant.API

import           Network.IPFS.Prelude

newtype Name = Name { Name -> String
unName :: String }
  deriving          ( Name -> Name -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Name -> Name -> Bool
$c/= :: Name -> Name -> Bool
== :: Name -> Name -> Bool
$c== :: Name -> Name -> Bool
Eq
                    , forall x. Rep Name x -> Name
forall x. Name -> Rep Name x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Name x -> Name
$cfrom :: forall x. Name -> Rep Name x
Generic
                    , Int -> Name -> ShowS
[Name] -> ShowS
Name -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Name] -> ShowS
$cshowList :: [Name] -> ShowS
show :: Name -> String
$cshow :: Name -> String
showsPrec :: Int -> Name -> ShowS
$cshowsPrec :: Int -> Name -> ShowS
Show
                    , Eq Name
Name -> Name -> Bool
Name -> Name -> Ordering
Name -> Name -> Name
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Name -> Name -> Name
$cmin :: Name -> Name -> Name
max :: Name -> Name -> Name
$cmax :: Name -> Name -> Name
>= :: Name -> Name -> Bool
$c>= :: Name -> Name -> Bool
> :: Name -> Name -> Bool
$c> :: Name -> Name -> Bool
<= :: Name -> Name -> Bool
$c<= :: Name -> Name -> Bool
< :: Name -> Name -> Bool
$c< :: Name -> Name -> Bool
compare :: Name -> Name -> Ordering
$ccompare :: Name -> Name -> Ordering
Ord
                    )
  deriving newtype  ( String -> Name
forall a. (String -> a) -> IsString a
fromString :: String -> Name
$cfromString :: String -> Name
IsString
                    , Proxy Name -> Declare (Definitions Schema) NamedSchema
forall a.
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
declareNamedSchema :: Proxy Name -> Declare (Definitions Schema) NamedSchema
$cdeclareNamedSchema :: Proxy Name -> Declare (Definitions Schema) NamedSchema
ToSchema
                    , forall a.
(forall (t :: SwaggerKind (*)). Proxy a -> ParamSchema t)
-> ToParamSchema a
forall (t :: SwaggerKind (*)). Proxy Name -> ParamSchema t
toParamSchema :: forall (t :: SwaggerKind (*)). Proxy Name -> ParamSchema t
$ctoParamSchema :: forall (t :: SwaggerKind (*)). Proxy Name -> ParamSchema t
ToParamSchema
                    )

instance Display Name where
  display :: Name -> Utf8Builder
display = forall a. Show a => a -> Utf8Builder
displayShow

instance ToJSON Name where
  toJSON :: Name -> Value
toJSON (Name String
n) = forall a. ToJSON a => a -> Value
toJSON String
n

instance FromJSON Name where
  parseJSON :: Value -> Parser Name
parseJSON = forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"IPFSName" (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Name
Name forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack)

instance FromHttpApiData Name where
  parseUrlPiece :: Text -> Either Text Name
parseUrlPiece = \case
    Text
""  -> forall a b. a -> Either a b
Left Text
"Empty Name field"
    Text
txt -> forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Name
Name forall a b. (a -> b) -> a -> b
<| Text -> String
Text.unpack Text
txt