packages feed

mulang-4.2.1: app/Main.hs

{-# LANGUAGE CPP, DeriveGeneric, QuasiQuotes, OverloadedStrings #-}

module Main where

import Language.Mulang.Analyzer (analyse)
import Language.Mulang.Analyzer.Analysis.Json ()
import Data.Aeson (eitherDecode, encode)
import System.Environment (getArgs)
import Control.Fallible (orFail)

import           Data.List (intercalate)
import           Version (prettyVersion)
import           Data.Text.Lazy.Encoding (encodeUtf8)
import           Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as LBS (putStrLn)
import qualified Data.Text.Lazy as T (pack)
import           Data.Text (unpack)
import           NeatInterpolation (text)

#ifdef ghcjs_HOST_OS
import           Data.JSString (JSString)
import qualified Data.JSString as JSS (pack, unpack)

import qualified Data.ByteString.Lazy.Char8 as C8 (unpack)

analyseIO :: JSString -> IO JSString
analyseIO = fmap  (JSS.pack . C8.unpack) . analyseJson . JSS.unpack
#endif

analyseJson :: String -> IO ByteString
analyseJson = fmap encode . analyse . decode . encodeUtf8 . T.pack
  where
    decode = orFail . eitherDecode

main :: IO ()
main = do
  argsBody <- fmap parseArgs $ getArgs
  streamBody <- getContents
  let body = if argsBody == "-s" then streamBody else argsBody
  result <- analyseJson body
  LBS.putStrLn result

  where
    parseArgs :: [String] -> String
    parseArgs [jsonBody] = jsonBody
    parseArgs _          = error (intercalate "\n" [prettyVersion, usage])

    usage = unpack [text|
        Wrong usage.

         #read from STDIN
         $ mulang -s

         #read from argument
         $ mulang '{
             "sample" : {
                "tag" : "CodeSample",
                "language" : "Haskell",
                "content" : "x = 1"
             },
             "spec" : {
                "expectations" : [
                   {
                      "binding" : ":Intransitive:x",
                      "inspection" : "Uses:*"
                   }
                ],
                "smellsSet" : { "tag" : "NoSmells" }
             }
          }'|]