packages feed

btc-lsp-0.1.0.0: src/BtcLsp/Grpc/Orphan.hs

{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module BtcLsp.Grpc.Orphan
  ( intoProto,
    fromProto,
  )
where

import BtcLsp.Data.Kind
import BtcLsp.Data.Orphan ()
import BtcLsp.Data.Type
import BtcLsp.Import.External
import Data.ProtoLens.Field
import Data.ProtoLens.Message
import qualified LndClient as Lnd
import qualified Proto.BtcLsp.Data.HighLevel as Proto
import qualified Proto.BtcLsp.Data.HighLevel_Fields as Proto
import qualified Proto.BtcLsp.Data.LowLevel as Proto
import qualified Proto.BtcLsp.Data.LowLevel_Fields as LowLevel
import qualified Witch

fromProto ::
  forall proto through haskell.
  ( HasField proto "val" through,
    From through haskell,
    'False ~ (through == haskell)
  ) =>
  proto ->
  haskell
fromProto =
  from
    . (^. field @"val")

intoProto ::
  forall proto through haskell.
  ( Message proto,
    HasField proto "val" through,
    From haskell through,
    'False ~ (haskell == through)
  ) =>
  haskell ->
  proto
intoProto x =
  defMessage
    & field @"val" .~ from x

instance From Proto.Nonce Nonce where
  from = fromProto

instance From Nonce Proto.Nonce where
  from = intoProto

instance From Proto.LnPubKey NodePubKey where
  from =
    coerce . (^. Proto.val)

instance From NodePubKey Proto.LnPubKey where
  from x =
    defMessage
      & Proto.val .~ coerce x

instance From Proto.LnInvoice (LnInvoice mrel) where
  from =
    via @Lnd.PaymentRequest . (^. Proto.val)

instance From (LnInvoice mrel) Proto.LnInvoice where
  from x =
    defMessage
      & Proto.val .~ via @Lnd.PaymentRequest x

instance From Proto.FundLnInvoice (LnInvoice 'Fund) where
  from = fromProto

instance From (LnInvoice 'Fund) Proto.FundLnInvoice where
  from = intoProto

instance From Proto.OnChainAddress (UnsafeOnChainAddress 'Refund) where
  from = fromProto

instance From Proto.RefundOnChainAddress (UnsafeOnChainAddress 'Refund) where
  from = fromProto

instance From Proto.Privacy Privacy where
  from = toEnum . fromEnum

instance From Privacy Proto.Privacy where
  from = toEnum . fromEnum

instance From Proto.Msat MSat where
  from = fromProto

instance From MSat Proto.Msat where
  from = intoProto

instance From Proto.FundMoney MSat where
  from = fromProto

instance From MSat Proto.FundMoney where
  from = intoProto

deriving stock instance Eq CompressMode

deriving stock instance Generic CompressMode

instance FromJSON CompressMode

instance From PortNumber Word32 where
  from = fromIntegral -- Word16 to Word32 is fine.

instance From PortNumber Proto.LnPort where
  from = intoProto

instance From HostName Proto.LnHost where
  from = intoProto

instance From (Money owner btcl mrel) Proto.Msat where
  from = intoProto

instance From (Money 'Usr btcl 'Fund) Proto.LocalBalance where
  from = intoProto

instance From (Money 'Lsp btcl 'Gain) Proto.FeeMoney where
  from = intoProto

instance From FeeRate Proto.Urational where
  from (FeeRate x) =
    defMessage
      & LowLevel.numerator .~ numerator x
      & LowLevel.denominator .~ denominator x

instance From FeeRate Proto.FeeRate where
  from = intoProto