packages feed

flp-0.1.0.0: app/floorplan.hs

{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
module Main where
import Prelude hiding (putStrLn)
import qualified Prelude as P
import System.Environment
import System.IO hiding (putStr, putStrLn, hGetLine)
import System.Exit (exitSuccess, exitFailure)
import Control.Exception (assert)

import Language.Rust.Syntax (SourceFile(..))
import Language.Rust.Data.Position (Span(..))
import Language.Rust.Pretty (pretty')

import Language.Floorplan
import qualified Language.Floorplan.Rust.Compiler as RC

--import qualified Language.Floorplan.Parser as P
import qualified Language.Floorplan.Parser as P
import qualified Language.Floorplan.Syntax as S
import qualified Language.Floorplan.Core.Compiler as CC
import qualified Language.Floorplan.Core.Syntax as CS

usage = do
  pName <- getProgName
  P.putStrLn $ pName ++ " [file.flp] [path/to/dest.rs]"

doResult :: String -> FilePath -> [Demarc] -> IO ()
doResult compiler outDir result = do
  let grafted  :: [S.Demarc]      = map (CC.grafting result) result
      core_flp :: [CS.BaseExp]    = map CC.compile grafted
      sf       :: SourceFile Span = RC.genRust core_flp
  --print $ pretty' sf
  assert ((CC.countGrafting grafted) == 0) (return ())
  case compiler of
    "rust"  -> (RC.writeModule outDir) sf
    _       -> usage
  exitSuccess

oops s = P.putStr s >> exitFailure

main = do
  args <- getArgs
  case args of
    (flpFile : outDir : rst) ->
      do  contents <- readFile flpFile
          let r = P.parseLayers contents
          doResult "rust" outDir r
    _ -> usage