ppad-bolt9-0.0.1: Feature flags per BOLT #9
Copyright(c) 2025 Jared Tobin
LicenseMIT
MaintainerJared Tobin <jared@ppad.tech>
Safe HaskellSafe-Inferred
LanguageHaskell2010

Lightning.Protocol.BOLT9.Codec

Description

Parsing and rendering for BOLT #9 feature vectors.

Synopsis

Parsing and rendering

parse :: ByteString -> FeatureVector Source #

Parse a ByteString into a FeatureVector.

Alias for fromByteString.

render :: FeatureVector -> ByteString Source #

Render a FeatureVector to a ByteString, trimming leading zero bytes for compact encoding.

Bit operations

setBit :: Word16 -> FeatureVector -> FeatureVector Source #

Set a bit by raw index.

>>> setBit 17 empty
FeatureVector {unFeatureVector = "\STX"}

clearBit :: Word16 -> FeatureVector -> FeatureVector Source #

Clear a bit by raw index.

>>> clearBit 17 (setBit 17 empty)
FeatureVector {unFeatureVector = ""}

testBit :: Word16 -> FeatureVector -> Bool Source #

Test if a bit is set.

>>> testBit 17 (setBit 17 empty)
True
>>> testBit 16 (setBit 17 empty)
False

Feature operations

setFeature :: Feature -> FeatureLevel -> FeatureVector -> FeatureVector Source #

Set a feature's bit at the given level.

Required sets the even bit, Optional sets the odd bit.

>>> import Data.Maybe (fromJust)
>>> let mpp = fromJust (featureByName "basic_mpp")
>>> setFeature mpp Optional empty  -- set optional bit (17)
FeatureVector {unFeatureVector = "\STX"}
>>> setFeature mpp Required empty  -- set required bit (16)
FeatureVector {unFeatureVector = "\SOH"}

hasFeature :: Feature -> FeatureVector -> Maybe FeatureLevel Source #

Check if a feature is set in the vector.

Returns:

  • Just Required if the required (even) bit is set
  • Just Optional if the optional (odd) bit is set (and required is not)
  • Nothing if neither bit is set
>>> import Data.Maybe (fromJust)
>>> let mpp = fromJust (featureByName "basic_mpp")
>>> hasFeature mpp (setFeature mpp Optional empty)
Just Optional
>>> hasFeature mpp (setFeature mpp Required empty)
Just Required
>>> hasFeature mpp empty
Nothing

isFeatureSet :: Feature -> FeatureVector -> Bool Source #

Check if either bit of a feature is set in the vector.

>>> import Data.Maybe (fromJust)
>>> let mpp = fromJust (featureByName "basic_mpp")
>>> isFeatureSet mpp (setFeature mpp Optional empty)
True
>>> isFeatureSet mpp empty
False

listFeatures :: FeatureVector -> [(Feature, FeatureLevel)] Source #

List all known features that are set in the vector.

Returns pairs of (Feature, FeatureLevel) indicating whether each feature is set as required or optional.

>>> import Data.Maybe (fromJust)
>>> let mpp = fromJust (featureByName "basic_mpp")
>>> let ps = fromJust (featureByName "payment_secret")
>>> let fv = setFeature mpp Optional (setFeature ps Required empty)
>>> map (\(f, l) -> (featureName f, l)) (listFeatures fv)
[("payment_secret",Required),("basic_mpp",Optional)]