35 lines
959 B
Haskell
35 lines
959 B
Haskell
{-# LANGUAGE DuplicateRecordFields, OverloadedLists #-}
|
|
{-# OPTIONS_GHC -Wall #-}
|
|
module Rubyhs (main) where
|
|
|
|
import Control.Monad.Fail (MonadFail)
|
|
import Data.Aeson (eitherDecode, encode)
|
|
import Data.ByteString.Lazy (ByteString)
|
|
import Data.Foldable (traverse_)
|
|
import Data.Language.Ruby (Block)
|
|
import Frelude
|
|
import System.Environment (getArgs)
|
|
import System.Process (readProcess)
|
|
import qualified Data.ByteString.Lazy.Char8 as ByteString
|
|
|
|
main :: IO ()
|
|
main = getArgs >>= traverse_ run
|
|
|
|
run :: FilePath -> IO ()
|
|
run p = do
|
|
json <- runParser p
|
|
block <- decodeFail @_ @Block $ ByteString.pack json
|
|
ByteString.putStrLn $ encode block
|
|
|
|
decodeFail :: MonadFail m => FromJSON a => ByteString -> m a
|
|
decodeFail s = case eitherDecode s of
|
|
Left err -> fail err
|
|
Right a -> pure a
|
|
|
|
runParser :: FilePath -> IO String
|
|
runParser p = sh "ruby-parse" ["--emit-json", "--25", p]
|
|
|
|
sh :: String -> [String] -> IO String
|
|
sh cmd args = readProcess cmd args mempty
|
|
|