module Network.IPFS.DAG
  ( put
  , putNode
  ) where

import Network.IPFS.Prelude
import Network.IPFS.Local.Class as IPFS

import qualified Network.IPFS.Internal.UTF8 as UTF8
import           Data.ByteString.Lazy.Char8 as CL
import qualified RIO.ByteString.Lazy        as Lazy

import           Network.IPFS.Add.Error      as IPFS.Add
import           Network.IPFS.Types          as IPFS
import           Network.IPFS.DAG.Node.Types as DAG

put :: 
  MonadLocalIPFS m
  => Lazy.ByteString
  -> m (Either IPFS.Add.Error IPFS.CID)
put :: ByteString -> m (Either Error CID)
put ByteString
raw = [Opt] -> ByteString -> m (Either Error ByteString)
forall (m :: * -> *).
MonadLocalIPFS m =>
[Opt] -> ByteString -> m (Either Error ByteString)
IPFS.runLocal [Item [Opt]
"dag", Item [Opt]
"put", Item [Opt]
"-f", Item [Opt]
"dag-pb"] ByteString
raw m (Either Error ByteString)
-> (Either Error ByteString -> m (Either Error CID))
-> m (Either Error CID)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
  Right ByteString
result -> 
    case ByteString -> [ByteString]
CL.lines ByteString
result of
      [Item [ByteString]
cid] ->
        ByteString
Item [ByteString]
cid
          ByteString -> (ByteString -> Text) -> Text
forall a b. a -> (a -> b) -> b
|> ByteString -> Text
forall a. Show a => a -> Text
UTF8.textShow
          Text -> (Text -> Text) -> Text
forall a b. a -> (a -> b) -> b
|> Natural -> Text -> Text
UTF8.stripN Natural
1
          Text -> (Text -> CID) -> CID
forall a b. a -> (a -> b) -> b
|> Text -> CID
mkCID
          CID -> (CID -> Either Error CID) -> Either Error CID
forall a b. a -> (a -> b) -> b
|> CID -> Either Error CID
forall a b. b -> Either a b
Right
          Either Error CID
-> (Either Error CID -> m (Either Error CID))
-> m (Either Error CID)
forall a b. a -> (a -> b) -> b
|> Either Error CID -> m (Either Error CID)
forall (m :: * -> *) a. Monad m => a -> m a
return

      [ByteString]
bad ->
        Either Error CID -> m (Either Error CID)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either Error CID -> m (Either Error CID))
-> (Text -> Either Error CID) -> Text -> m (Either Error CID)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Error -> Either Error CID
forall a b. a -> Either a b
Left (Error -> Either Error CID)
-> (Text -> Error) -> Text -> Either Error CID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Error
UnexpectedOutput (Text -> m (Either Error CID)) -> Text -> m (Either Error CID)
forall a b. (a -> b) -> a -> b
<| [ByteString] -> Text
forall a. Show a => a -> Text
UTF8.textShow [ByteString]
bad

  Left Error
err -> 
    Either Error CID -> m (Either Error CID)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either Error CID -> m (Either Error CID))
-> (Text -> Either Error CID) -> Text -> m (Either Error CID)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Error -> Either Error CID
forall a b. a -> Either a b
Left (Error -> Either Error CID)
-> (Text -> Error) -> Text -> Either Error CID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Error
UnknownAddErr (Text -> m (Either Error CID)) -> Text -> m (Either Error CID)
forall a b. (a -> b) -> a -> b
<| Error -> Text
forall a. Show a => a -> Text
UTF8.textShow Error
err

putNode :: 
  MonadLocalIPFS m
  => DAG.Node
  -> m (Either IPFS.Add.Error IPFS.CID)
putNode :: Node -> m (Either Error CID)
putNode Node
node = ByteString -> m (Either Error CID)
forall (m :: * -> *).
MonadLocalIPFS m =>
ByteString -> m (Either Error CID)
put (ByteString -> m (Either Error CID))
-> ByteString -> m (Either Error CID)
forall a b. (a -> b) -> a -> b
<| Node -> ByteString
forall a. ToJSON a => a -> ByteString
encode Node
node