packages feed

ipfs-1.1.0: 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           Network.IPFS.Prelude
import           Network.IPFS.Local.Class   as IPFS
import           Network.IPFS.Remote.Class  as Remote
import qualified Network.IPFS.Internal.UTF8 as UTF8

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

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

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