cuddle-0.5.0.0: example/Main.hs
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Codec.CBOR.Cuddle.CBOR.Gen (generateCBORTerm)
import Codec.CBOR.Cuddle.CDDL (Name (..))
import Codec.CBOR.Cuddle.CDDL.Resolve (
asMap,
buildMonoCTree,
buildRefCTree,
buildResolvedCTree,
)
import Codec.CBOR.Cuddle.Huddle (toCDDL)
import Codec.CBOR.Cuddle.Parser (pCDDL)
import Codec.CBOR.Cuddle.Pretty ()
import Conway (conway)
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Monad qualified
import Prettyprinter (Pretty (pretty))
import Prettyprinter.Util (putDocW)
import System.Environment (getArgs)
import System.Random (getStdGen)
import Text.Megaparsec (ParseErrorBundle, Parsec, errorBundlePretty, runParser)
main :: IO ()
main = do
args <- getArgs
case args of
[fn] -> do
parseFromFile pCDDL fn >>= \case
Left err -> putStrLn $ errorBundlePretty err
Right res -> do
print res
putDocW 80 $ pretty res
putStrLn "\n"
putStrLn "--------------------------------------------------------------------------------"
putStrLn " As a CTree"
putStrLn "--------------------------------------------------------------------------------"
let refCTree = buildRefCTree (asMap res)
print refCTree
putStrLn "--------------------------------------------------------------------------------"
putStrLn " After name resolution"
putStrLn "--------------------------------------------------------------------------------"
let resolvedCTree = buildResolvedCTree refCTree
print resolvedCTree
putStrLn "--------------------------------------------------------------------------------"
putStrLn " After monomorphisation"
putStrLn "--------------------------------------------------------------------------------"
let monoCTree = buildMonoCTree <$> resolvedCTree
print monoCTree
[fn, name] -> do
putStrLn "--------------------------------------------------------------------------------"
putStrLn " Generating a term"
putStrLn "--------------------------------------------------------------------------------"
parseFromFile pCDDL fn >>= \case
Left err -> putStrLn $ errorBundlePretty err
Right res -> do
stdGen <- getStdGen
case buildMonoCTree =<< buildResolvedCTree (buildRefCTree (asMap res)) of
Left nre -> error $ show nre
Right mt ->
let term = generateCBORTerm mt (Name (T.pack name) mempty) stdGen
in print term
[] -> do
let cw = toCDDL conway
putDocW 80 $ pretty cw
putStrLn "--------------------------------------"
putDocW 80 $ pretty (toCDDL Monad.spec)
putStrLn "--------------------------------------"
putDocW 80 $ pretty (toCDDL Monad.spec2)
_ -> putStrLn "Expected filename"
parseFromFile ::
Parsec e T.Text a ->
String ->
IO (Either (ParseErrorBundle T.Text e) a)
parseFromFile p file = runParser p file <$> T.readFile file