cpsa-4.4.1: src/CPSA/Roletran/Main.hs
-- Main routine for cpsa4roletran
module Main (main) where
import System.IO
import CPSA.Lib.Entry
import CPSA.Lib.Expand
import CPSA.Roletran.Protocol
import CPSA.Roletran.Loader
import CPSA.Roletran.Derivation
import CPSA.Roletran.Emitter
import CPSA.Lib.Pretty (pr)
main :: IO ()
main =
do
(p, (output, margin)) <- start filterOptions filterInterp
sexprs <- readSExprs p
prot <- tryRun (loadSExprs sexprs)
procs <- tryRun (mapM derive (roles prot))
h <- outputHandle output
hPutStrLn h ("(comment \"Protocol: " ++ pname prot ++
" (" ++ displayPos (ppos prot) ++ ")\")")
mapM_ (emitProc h margin) procs
hClose h
tryRun :: IO a -> IO a
tryRun x =
do
y <- tryIO x
case y of
Right z -> return z
Left err -> abort err
emitProc :: Handle -> Int -> Proc -> IO ()
emitProc h margin proc =
do
hPutStrLn h ""
hPutStrLn h ("(comment \"Role: " ++ name proc ++
" (" ++ displayPos (pos proc) ++ ")\")")
hPutStrLn h ""
hPutStrLn h $ pr margin (emit defaultIndent proc) ""