{-# 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 import Rubyhs.References (references) main :: IO () main = getArgs >>= traverse_ run run :: FilePath -> IO () run p = do json <- runParser p block <- decodeFail @_ @Block $ ByteString.pack json ByteString.putStrLn $ encode $ references block decodeFail :: MonadFail m => FromJSON a => ByteString -> m a decodeFail s = case eitherDecode s of Left err -> Frelude.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