module Network.IPFS.Remote.Class
  ( MonadRemoteIPFS
  , runRemote
  , ipfsAdd
  , ipfsCat
  , ipfsStat
  , ipfsPin
  , ipfsUnpin
  ) where

import Network.IPFS.Prelude

import qualified RIO.ByteString.Lazy as Lazy
import           Servant.Client

import Network.IPFS.Types as IPFS

import qualified Network.IPFS.Client     as IPFS.Client
import qualified Network.IPFS.Client.Pin as Pin
import qualified Network.IPFS.File.Types as File

class MonadIO m => MonadRemoteIPFS m where
  runRemote :: ClientM a       -> m (Either ClientError a)
  ipfsAdd   :: Lazy.ByteString -> m (Either ClientError CID)
  ipfsCat   :: CID             -> m (Either ClientError File.Serialized)
  ipfsStat  :: CID             -> m (Either ClientError Stat)
  ipfsPin   :: CID             -> m (Either ClientError Pin.Response)
  ipfsUnpin :: CID -> Bool     -> m (Either ClientError Pin.Response)

  -- defaults
  ipfsAdd   ByteString
raw                 = ClientM CID -> m (Either ClientError CID)
forall (m :: * -> *) a.
MonadRemoteIPFS m =>
ClientM a -> m (Either ClientError a)
runRemote (ClientM CID -> m (Either ClientError CID))
-> ClientM CID -> m (Either ClientError CID)
forall a b. (a -> b) -> a -> b
<| ByteString -> ClientM CID
IPFS.Client.add ByteString
raw
  ipfsCat   (CID Text
cid)           = ClientM Serialized -> m (Either ClientError Serialized)
forall (m :: * -> *) a.
MonadRemoteIPFS m =>
ClientM a -> m (Either ClientError a)
runRemote (ClientM Serialized -> m (Either ClientError Serialized))
-> ClientM Serialized -> m (Either ClientError Serialized)
forall a b. (a -> b) -> a -> b
<| Text -> ClientM Serialized
IPFS.Client.cat Text
cid
  ipfsStat  (CID Text
cid)           = ClientM Stat -> m (Either ClientError Stat)
forall (m :: * -> *) a.
MonadRemoteIPFS m =>
ClientM a -> m (Either ClientError a)
runRemote (ClientM Stat -> m (Either ClientError Stat))
-> ClientM Stat -> m (Either ClientError Stat)
forall a b. (a -> b) -> a -> b
<| Text -> ClientM Stat
IPFS.Client.stat Text
cid
  ipfsPin   (CID Text
cid)           = ClientM Response -> m (Either ClientError Response)
forall (m :: * -> *) a.
MonadRemoteIPFS m =>
ClientM a -> m (Either ClientError a)
runRemote (ClientM Response -> m (Either ClientError Response))
-> ClientM Response -> m (Either ClientError Response)
forall a b. (a -> b) -> a -> b
<| Text -> ClientM Response
IPFS.Client.pin Text
cid
  ipfsUnpin (CID Text
cid) Bool
recursive = ClientM Response -> m (Either ClientError Response)
forall (m :: * -> *) a.
MonadRemoteIPFS m =>
ClientM a -> m (Either ClientError a)
runRemote (ClientM Response -> m (Either ClientError Response))
-> ClientM Response -> m (Either ClientError Response)
forall a b. (a -> b) -> a -> b
<| Text -> Bool -> ClientM Response
IPFS.Client.unpin Text
cid Bool
recursive