packages feed

ipfs-1.2.0.0: library/Network/IPFS/Get.hs

module Network.IPFS.Get
  ( getFile
  , getFileOrDirectory
  ) where

import qualified Network.IPFS.Internal.UTF8 as UTF8
import           Network.IPFS.Local.Class   as IPFS
import           Network.IPFS.Prelude

import           Data.ByteString.Lazy.Char8 as CL
import qualified RIO.ByteString.Lazy        as Lazy
import qualified RIO.Text                   as Text

import qualified Network.IPFS.File.Types    as File
import           Network.IPFS.Get.Error     as IPFS.Get
import qualified Network.IPFS.Process.Error as Process
import           Network.IPFS.Types         as IPFS

getFileOrDirectory :: MonadLocalIPFS m => IPFS.CID -> m (Either IPFS.Get.Error CL.ByteString)
getFileOrDirectory cid@(IPFS.CID hash) = IPFS.runLocal ["get", Text.unpack hash] "" >>= \case
  Right contents -> return $ Right contents
  Left err -> case err of
    Process.Timeout secs   -> return . Left $ TimedOut cid secs
    Process.UnknownErr raw -> return . Left . UnknownErr $ UTF8.textShow raw

getFile :: MonadLocalIPFS m => IPFS.CID -> m (Either IPFS.Get.Error File.Serialized)
getFile cid@(IPFS.CID hash) = IPFS.runLocal ["cat"] (UTF8.textToLazyBS hash) >>= \case
  Right contents -> return . Right $ File.Serialized contents
  Left err -> case err of
    Process.Timeout secs -> return . Left $ TimedOut cid secs
    Process.UnknownErr raw ->
      if Lazy.isPrefixOf "Error: invalid 'ipfs ref' path" raw
        then return . Left $ InvalidCID hash
        else return . Left . UnknownErr $ UTF8.textShow raw