packages feed

lnd-client-0.1.0.1: src/LndClient/Data/ChannelBackup.hs

module LndClient.Data.ChannelBackup
  ( ChannelBackup (..),
    SingleChanBackupBlob (..),
  )
where

import Data.ProtoLens
import qualified LndClient.Data.ChannelPoint as Ch
import LndClient.Import
import qualified Proto.Lnrpc.Ln1 as Ln1
import qualified Proto.Lnrpc.Ln1_Fields as Ln1

data ChannelBackup = ChannelBackup
  { chanPoint :: Ch.ChannelPoint,
    chanBackup :: SingleChanBackupBlob
  }
  deriving stock
    ( Eq,
      Ord,
      Show,
      Generic
    )

instance Out ChannelBackup

newtype SingleChanBackupBlob = SingleChanBackupBlob
  { unSingleChanBackupBlob :: ByteString
  }
  deriving newtype
    ( Eq,
      Ord,
      Show,
      PersistField,
      PersistFieldSql
    )
  deriving stock
    ( Generic
    )

instance Out SingleChanBackupBlob

instance FromGrpc [ChannelBackup] Ln1.ChanBackupSnapshot where
  fromGrpc x =
    fromGrpc $
      x ^. Ln1.singleChanBackups . Ln1.chanBackups

instance FromGrpc ChannelBackup Ln1.ChannelBackup where
  fromGrpc x =
    ChannelBackup
      <$> fromGrpc (x ^. Ln1.chanPoint)
      <*> fromGrpc (x ^. Ln1.chanBackup)

instance ToGrpc ChannelBackup Ln1.ChannelBackup where
  toGrpc x =
    msg
      <$> toGrpc (chanPoint x)
      <*> toGrpc (chanBackup x)
    where
      msg cp bak =
        defMessage
          & Ln1.chanPoint .~ cp
          & Ln1.chanBackup .~ bak

instance FromGrpc SingleChanBackupBlob ByteString where
  fromGrpc x =
    if null x
      then
        Left
          . FromGrpcError
          $ "Cannot parse SingleChanBackupBlob from " <> inspect x
      else
        Right $
          SingleChanBackupBlob x

instance ToGrpc SingleChanBackupBlob ByteString where
  toGrpc =
    Right . unSingleChanBackupBlob

instance ToGrpc [ChannelBackup] Ln1.RestoreChanBackupRequest where
  toGrpc xs0 = do
    xs <- mapM toGrpc xs0
    pure $
      defMessage
        & Ln1.chanBackups
          .~ ( defMessage
                 & Ln1.chanBackups .~ xs
             )