packages feed

ipfs-1.1.1: library/Network/IPFS/Stat.hs

module Network.IPFS.Stat
  ( getStatRemote
  , getSizeRemote
  , getSize
  , module Network.IPFS.Stat.Types
  ) where

import Data.ByteString.Lazy.Char8 as CL
import Data.List                  as List

import qualified RIO.ByteString.Lazy as Lazy

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

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

import Network.IPFS.Bytes.Types
import Network.IPFS.Stat.Types
import Network.IPFS.Types       as IPFS

getStatRemote ::
     MonadRemoteIPFS m
  => IPFS.CID
  -> m (Either IPFS.Get.Error Stat)
getStatRemote cid =
  Remote.ipfsStat cid >>= \case
    Left err ->
      return . Left . UnexpectedOutput <| UTF8.textShow err

    Right stat ->
      return <| Right stat

getSizeRemote ::
     MonadRemoteIPFS m
  => IPFS.CID
  -> m (Either IPFS.Get.Error Bytes)
getSizeRemote cid =
  getStatRemote cid >>= \case
    Left err -> return <| Left err
    Right stat -> return . Right <| cumulativeSize stat

getSize ::
  MonadLocalIPFS m
  => IPFS.CID
  -> m (Either IPFS.Get.Error Integer)
getSize cid@(CID hash) = IPFS.runLocal ["object", "stat"] (Lazy.fromStrict <| encodeUtf8 hash) >>= \case
  Left err -> case err of
    Process.Timeout secs   -> return . Left <| TimedOut cid secs
    Process.UnknownErr raw -> return . Left . UnknownErr <| UTF8.textShow raw
  Right contents -> do
    case parseSize contents of
      Nothing -> return . Left . UnexpectedOutput <| "Could not parse CumulativeSize"
      Just (size, _) -> return <| Right size

parseSize :: Lazy.ByteString -> Maybe (Integer, Lazy.ByteString)
parseSize = CL.readInteger . List.last . CL.words . List.last . CL.lines