packages feed

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

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}

module LndClient.Data.Peer
  ( Peer (..),
    LightningAddress (..),
    ConnectPeerRequest (..),
  )
where

import Data.ProtoLens.Message
import LndClient.Import
import qualified Proto.Lightning as LnGRPC
import qualified Proto.Lightning_Fields as LnGRPC

data Peer = Peer
  { pubKey :: NodePubKey,
    address :: NodeLocation
  }
  deriving stock (Eq, Show, Generic)

instance Out Peer

instance FromGrpc Peer LnGRPC.Peer where
  fromGrpc x =
    Peer
      <$> fromGrpc (x ^. LnGRPC.pubKey)
      <*> fromGrpc (x ^. LnGRPC.address)

data LightningAddress = LightningAddress
  { pubkey :: NodePubKey,
    host :: NodeLocation
  }
  deriving stock (Eq, Show, Read, Generic)

instance Out LightningAddress

instance ToGrpc LightningAddress LnGRPC.LightningAddress where
  toGrpc x =
    msg
      <$> toGrpc (pubkey x)
      <*> toGrpc (host x)
    where
      msg gPubkey gHost =
        defMessage
          & LnGRPC.pubkey .~ gPubkey
          & LnGRPC.host .~ gHost

data ConnectPeerRequest = ConnectPeerRequest
  { addr :: LightningAddress,
    perm :: Bool
  }
  deriving stock (Eq, Show, Generic)

instance Out ConnectPeerRequest

instance ToGrpc ConnectPeerRequest LnGRPC.ConnectPeerRequest where
  toGrpc x =
    msg
      <$> toGrpc (addr x)
      <*> toGrpc (perm x)
    where
      msg gAddr gPerm =
        defMessage
          & LnGRPC.addr .~ gAddr
          & LnGRPC.perm .~ gPerm

instance FromGrpc [Peer] LnGRPC.ListPeersResponse where
  fromGrpc x = sequence $ fromGrpc <$> (x ^. LnGRPC.peers)