bitcoin-scripting-0.2.0: src/Language/Bitcoin/Miniscript/Text.hs
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Produce a text representation of Miniscript expressions
module Language.Bitcoin.Miniscript.Text (
miniscriptToText,
) where
import Data.Text (Text)
import qualified Data.Text as Text
import Haskoin.Constants (Network)
import Haskoin.Util (encodeHex)
import Language.Bitcoin.Miniscript.Syntax (
Miniscript (..),
Value (..),
)
import Language.Bitcoin.Script.Descriptors.Text (keyDescriptorToText)
import Language.Bitcoin.Utils (applicationText, showText)
miniscriptToText :: Network -> Miniscript -> Text
miniscriptToText net = \case
Var n -> n
Let n e b ->
"let " <> n <> " = " <> miniscriptToText net e <> " in " <> miniscriptToText net b
Boolean True -> "1"
Boolean False -> "0"
Number w -> showText w
Bytes b -> encodeHex b
KeyDesc k -> keyDescriptorToText net k
Key x -> applicationText "pk_k" $ atomicKeyDescText x
KeyH x -> applicationText "pk_h" $ atomicKeyDescText x
Older n -> applicationText "older" $ atomicNumberText n
After n -> applicationText "after" $ atomicNumberText n
Sha256 h -> applicationText "sha256" $ atomicBytesText h
Ripemd160 h -> applicationText "ripemd160" $ atomicBytesText h
Hash256 h -> applicationText "hash256" $ atomicBytesText h
Hash160 h -> applicationText "hash160" $ atomicBytesText h
AndV x (Boolean True) -> "t:" <> toText x
OrI (Boolean False) x -> "l:" <> toText x
OrI x (Boolean False) -> "u:" <> toText x
AndOr x y z -> applicationText "andor" $ printList [x, y, z]
AndV x y -> applicationText "and_v" $ printList [x, y]
AndB x y -> applicationText "and_b" $ printList [x, y]
OrB x y -> applicationText "or_b" $ printList [x, y]
OrC x y -> applicationText "or_c" $ printList [x, y]
OrD x y -> applicationText "or_d" $ printList [x, y]
OrI x y -> applicationText "or_i" $ printList [x, y]
Thresh k x xs ->
applicationText "thresh" . Text.intercalate "," $ atomicNumberText k : (toText <$> (x : xs))
Multi n xs ->
applicationText "multi" . Text.intercalate "," $ atomicNumberText n : (atomicKeyDescText <$> xs)
a -> ann "" a
where
ann as = \case
AnnC (Key x) -> printAnn as $ applicationText "pk" $ atomicKeyDescText x
AnnC (KeyH x) -> printAnn as $ applicationText "pkh" $ atomicKeyDescText x
AnnA x -> ann ('a' : as) x
AnnS x -> ann ('s' : as) x
AnnC x -> ann ('c' : as) x
AnnD x -> ann ('d' : as) x
AnnV x -> ann ('v' : as) x
AnnJ x -> ann ('j' : as) x
AnnN x -> ann ('n' : as) x
e -> printAnn as $ toText e
printAnn as x
| null as = x
| otherwise = Text.pack (reverse as) <> ":" <> x
printList = Text.intercalate "," . fmap toText
toText = miniscriptToText net
atomicNumberText = atomicText showText
atomicBytesText = atomicText encodeHex
atomicKeyDescText = atomicText (keyDescriptorToText net)
atomicText f = \case
Variable name -> name
Lit x -> f x