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

import qualified RIO.Text as Text

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

import Network.IPFS.Prelude

newtype Name = Name { Name -> String
unName :: String }
  deriving          ( Name -> Name -> Bool
(Name -> Name -> Bool) -> (Name -> Name -> Bool) -> Eq Name
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. Name -> Rep Name x)
-> (forall x. Rep Name x -> Name) -> Generic Name
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
(Int -> Name -> ShowS)
-> (Name -> String) -> ([Name] -> ShowS) -> Show Name
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
Eq Name
-> (Name -> Name -> Ordering)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Name)
-> (Name -> Name -> Name)
-> Ord 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
$cp1Ord :: Eq Name
Ord
                    )
  deriving newtype  ( String -> Name
(String -> Name) -> IsString Name
forall a. (String -> a) -> IsString a
fromString :: String -> Name
$cfromString :: String -> Name
IsString
                    , Proxy Name -> Declare (Definitions Schema) NamedSchema
(Proxy Name -> Declare (Definitions Schema) NamedSchema)
-> ToSchema Name
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
                    , Proxy Name -> ParamSchema t
(forall (t :: SwaggerKind *). Proxy Name -> ParamSchema t)
-> ToParamSchema Name
forall a.
(forall (t :: SwaggerKind *). Proxy a -> ParamSchema t)
-> ToParamSchema a
forall (t :: SwaggerKind *). Proxy Name -> ParamSchema t
toParamSchema :: Proxy Name -> ParamSchema t
$ctoParamSchema :: forall (t :: SwaggerKind *). Proxy Name -> ParamSchema t
ToParamSchema
                    )

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

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

instance FromJSON Name where
  parseJSON :: Value -> Parser Name
parseJSON = String -> (Text -> Parser Name) -> Value -> Parser Name
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"IPFSName" (Name -> Parser Name
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Name -> Parser Name) -> (Text -> Name) -> Text -> Parser Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Name
Name (String -> Name) -> (Text -> String) -> Text -> 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
""  -> Text -> Either Text Name
forall a b. a -> Either a b
Left Text
"Empty Name field"
    Text
txt -> Name -> Either Text Name
forall a b. b -> Either a b
Right (Name -> Either Text Name)
-> (String -> Name) -> String -> Either Text Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Name
Name (String -> Either Text Name) -> String -> Either Text Name
forall a b. (a -> b) -> a -> b
<| Text -> String
Text.unpack Text
txt