ipfs-1.3.1: library/Network/IPFS/DAG.hs
module Network.IPFS.DAG
( put
, putNode
, putRemote
) where
import Data.ByteString.Lazy.Char8 as CL
import qualified Network.IPFS.Internal.UTF8 as UTF8
import qualified RIO.ByteString.Lazy as Lazy
import Servant.Client
import qualified Servant.Multipart.Client as Multipart.Client
import Network.IPFS.Prelude
import Network.IPFS.Add.Error as IPFS.Add
import qualified Network.IPFS.Client as IPFS.Client
import Network.IPFS.Client.DAG.Put.Types as DAG.Put
import Network.IPFS.DAG.Node.Types as DAG
import Network.IPFS.File.Form.Types as File
import Network.IPFS.File.Types as File
import Network.IPFS.Local.Class as IPFS
import Network.IPFS.Remote.Class as IPFS
import Network.IPFS.Types as IPFS
put :: MonadLocalIPFS m => Lazy.ByteString -> m (Either IPFS.Add.Error IPFS.CID)
put raw = IPFS.runLocal ["dag", "put", "-f", "dag-pb"] raw >>= \case
Right result ->
case CL.lines result of
[cid] ->
cid
|> UTF8.textShow
|> UTF8.stripN 1
|> mkCID
|> Right
|> return
bad ->
pure . Left . UnexpectedOutput $ UTF8.textShow bad
Left err ->
pure . Left . UnknownAddErr $ UTF8.textShow err
putNode :: MonadLocalIPFS m => DAG.Node -> m (Either IPFS.Add.Error IPFS.CID)
putNode node = put $ encode node
putRemote :: MonadRemoteIPFS m => File.Serialized -> m (Either ClientError DAG.Put.Response)
putRemote file = do
boundary <- liftIO Multipart.Client.genBoundary
runRemote (IPFS.Client.dagPut True (boundary, File.Form "file" file))