packages feed

ipfs-1.3.2: library/Network/IPFS/Remote/Class.hs

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

import           Network.IPFS.Remote.Error

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 StatError   Stat)
  ipfsPin   :: CID             -> m (Either ClientError Pin.Response)
  ipfsUnpin :: CID -> Bool     -> m (Either ClientError Pin.Response)

  -- defaults
  ipfsAdd   raw           = runRemote $ IPFS.Client.add raw
  ipfsCat   cid           = runRemote $ IPFS.Client.cat   cid
  ipfsPin   cid           = runRemote $ IPFS.Client.pin   cid
  ipfsUnpin cid recursive = runRemote $ IPFS.Client.unpin cid recursive

  ipfsStat cid =
    runRemote (IPFS.Client.stat  cid) >>= \case
      Left  clientErr       -> return . Left $ WebError  clientErr
      Right (Left sizeErr)  -> return . Left $ SizeError sizeErr
      Right (Right payload) -> return $ Right payload