| Copyright | (c) 2025 Jared Tobin |
|---|---|
| License | MIT |
| Maintainer | Jared Tobin <jared@ppad.tech> |
| Safe Haskell | Safe-Inferred |
| Language | Haskell2010 |
Lightning.Protocol.BOLT9.Codec
Description
Parsing and rendering for BOLT #9 feature vectors.
Synopsis
- parse :: ByteString -> FeatureVector
- render :: FeatureVector -> ByteString
- setBit :: Word16 -> FeatureVector -> FeatureVector
- clearBit :: Word16 -> FeatureVector -> FeatureVector
- testBit :: Word16 -> FeatureVector -> Bool
- setFeature :: Feature -> FeatureLevel -> FeatureVector -> FeatureVector
- hasFeature :: Feature -> FeatureVector -> Maybe FeatureLevel
- isFeatureSet :: Feature -> FeatureVector -> Bool
- listFeatures :: FeatureVector -> [(Feature, FeatureLevel)]
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 emptyFeatureVector {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 Requiredif the required (even) bit is setJust Optionalif the optional (odd) bit is set (and required is not)Nothingif 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 emptyNothing
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 emptyFalse
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)]