module Network.IPFS.Client.Streaming.Pin
  ( PinComplete
  , PinStatus (..)
  ) where

import           Servant.API

import           Network.IPFS.Prelude

import           Network.IPFS.CID.Types
import qualified Network.IPFS.Client.Param as Param

type PinComplete
  =  "api"
  :> "v0"
  :> "pin"
  :> "add"
  :> Param.CID'
  :> QueryParam "progress" Bool
  :> StreamPost NewlineFraming JSON (SourceIO PinStatus)

data PinStatus = PinStatus
  { PinStatus -> [CID]
pins     :: [CID]
  , PinStatus -> Maybe Natural
progress :: Maybe Natural
  }
  deriving (PinStatus -> PinStatus -> Bool
(PinStatus -> PinStatus -> Bool)
-> (PinStatus -> PinStatus -> Bool) -> Eq PinStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PinStatus -> PinStatus -> Bool
$c/= :: PinStatus -> PinStatus -> Bool
== :: PinStatus -> PinStatus -> Bool
$c== :: PinStatus -> PinStatus -> Bool
Eq, Int -> PinStatus -> ShowS
[PinStatus] -> ShowS
PinStatus -> String
(Int -> PinStatus -> ShowS)
-> (PinStatus -> String)
-> ([PinStatus] -> ShowS)
-> Show PinStatus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PinStatus] -> ShowS
$cshowList :: [PinStatus] -> ShowS
show :: PinStatus -> String
$cshow :: PinStatus -> String
showsPrec :: Int -> PinStatus -> ShowS
$cshowsPrec :: Int -> PinStatus -> ShowS
Show)

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

instance FromJSON PinStatus where
  parseJSON :: Value -> Parser PinStatus
parseJSON = String -> (Object -> Parser PinStatus) -> Value -> Parser PinStatus
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"IPFS.PinStatus" \Object
obj -> do
    [CID]
pins     <- Object
obj Object -> Text -> Parser (Maybe [CID])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"Pins"     Parser (Maybe [CID]) -> [CID] -> Parser [CID]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
    Maybe Natural
progress <- Object
obj Object -> Text -> Parser (Maybe Natural)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"Progress"
    return PinStatus :: [CID] -> Maybe Natural -> PinStatus
PinStatus {[CID]
Maybe Natural
progress :: Maybe Natural
pins :: [CID]
$sel:progress:PinStatus :: Maybe Natural
$sel:pins:PinStatus :: [CID]
..}