Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions exe/jbeam-edit/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@ import Data.Text qualified as T
#endif

#ifdef ENABLE_TRANSFORMATION
import System.FilePath qualified as FP ((</>))
import JbeamEdit.Transformation (transform)
import JbeamEdit.Transformation.Config
import System.Directory qualified as FP (getCurrentDirectory)
#endif

main :: IO ()
Expand Down Expand Up @@ -81,8 +79,8 @@ applyTransform :: Options -> Node -> IO (Either Text Node)
#ifdef ENABLE_TRANSFORMATION
applyTransform (Options {optTransformation = False}) topNode = pure (Right topNode)
applyTransform opts topNode = do
cwd <- FP.getCurrentDirectory
tfConfig <- loadTransformationConfig $ cwd FP.</> transformationConfigFile
cwd <- getCurrentDirectory
tfConfig <- loadTransformationConfig $ cwd </> transformationConfigFile
case transform (optUpdateNames opts) tfConfig topNode of
Right (badVertexNodes, badBeamNodes, topNode') -> do
reportInvalidNodes "Invalid vertex nodes encountered:" badVertexNodes
Expand Down
45 changes: 28 additions & 17 deletions src-extra/transformation/JbeamEdit/Transformation/Config.hs
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,22 @@ module JbeamEdit.Transformation.Config (
) where

import Control.Monad (forM, when)
import Control.Monad.Except (ExceptT (..), runExceptT)
import Data.Bifunctor (first)
import Data.ByteString.Lazy qualified as LBS
import Data.Functor (($>))
import Data.List (isPrefixOf)
import Data.Scientific (Scientific)
import Data.Text (Text)
import Data.Text qualified as T
import Data.Yaml (
Object,
ParseException (..),
Parser,
decodeFileEither,
decodeEither',
prettyPrintParseException,
)
import Data.Yaml.Aeson (
FromJSON (..),
YamlException (..),
withArray,
withObject,
withText,
Expand All @@ -38,9 +39,11 @@ import Data.Yaml.Aeson (
(.:?),
)
import GHC.Generics
import GHC.IO.Exception (IOErrorType (NoSuchThing))
import GHC.IsList
import JbeamEdit.IOUtils
import JbeamEdit.Transformation.Types (VertexTreeType (..))
import System.OsPath
import Text.Read

defaultSortingThreshold :: Scientific
Expand Down Expand Up @@ -139,17 +142,25 @@ instance FromJSON TransformationConfig where
<*> parseSupportThreshold o
<*> o .:? "max-support-coordinates" .!= defaultMaxSupportCoordinates

formatParseError :: ParseException -> IO ()
formatParseError (AesonException err) = putErrorStringLn err
formatParseError excp = case excp of
(InvalidYaml (Just (YamlException errMsg)))
| "Yaml file not found:" `isPrefixOf` errMsg -> pure ()
_ -> putErrorStringLn (prettyPrintParseException excp)

transformationConfigFile :: FilePath
transformationConfigFile = ".jbeam-edit.yaml"

loadTransformationConfig :: FilePath -> IO TransformationConfig
loadTransformationConfig filename =
decodeFileEither filename
>>= either ((newTransformationConfig <$) . formatParseError) pure
formatParseError :: ParseException -> String
formatParseError (AesonException err) = err
formatParseError excp = prettyPrintParseException excp

transformationConfigFile :: OsPath
transformationConfigFile = unsafeEncodeUtf ".jbeam-edit.yaml"

decodeConfig :: LBS.ByteString -> Either Text TransformationConfig
decodeConfig "" = Right newTransformationConfig
decodeConfig content =
first
(T.pack . formatParseError)
(decodeEither' $ LBS.toStrict content)

loadTransformationConfig :: OsPath -> IO TransformationConfig
loadTransformationConfig filename = do
configEither <-
runExceptT
(ExceptT (tryReadFile [NoSuchThing] filename) >>= ExceptT . pure . decodeConfig)
case configEither of
Right config -> pure config
Left err -> putErrorLine err $> newTransformationConfig
3 changes: 2 additions & 1 deletion test-extra/transformation/Spec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import JbeamEdit.Formatting
import JbeamEdit.Transformation
import JbeamEdit.Transformation.Config
import System.Directory (getDirectoryContents)
import System.OsPath
import Test.Hspec

listFilesInDir
Expand Down Expand Up @@ -39,7 +40,7 @@ topNodeSpec rs cfName tfConfig inFilename outFilename = do

main :: IO ()
main = hspec $ do
let exampleConfigPath = "examples/jbeam-edit.yaml"
let exampleConfigPath = unsafeEncodeUtf "examples/jbeam-edit.yaml"
rs <- runIO $ readFile "examples/ast/jbfl/minimal.hs"
tfConfig <- runIO $ loadTransformationConfig exampleConfigPath
inputFiles <-
Expand Down
7 changes: 4 additions & 3 deletions tools/dump_ast/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ import JbeamEdit.Parsing.DSL (parseDSL)
import JbeamEdit.Parsing.Jbeam (parseNodes)
import JbeamEdit.Transformation
import JbeamEdit.Transformation.Config
import System.Directory (getCurrentDirectory, getDirectoryContents)
import System.Directory (getDirectoryContents)
import System.Exit (exitFailure)
import System.FilePath (dropExtension, takeBaseName, (</>))
import System.IO qualified as IO (readFile)
import System.OsPath qualified as OS (unsafeEncodeUtf, (</>))
import Text.Pretty.Simple (
StringOutputStyle (..),
defaultOutputOptionsNoColor,
Expand All @@ -25,9 +26,9 @@ import Text.Pretty.Simple (

main :: IO ()
main = do
cwd <- getCurrentDirectory
exampleCfg <-
loadTransformationConfig $ cwd </> "examples" </> "jbeam-edit.yaml"
loadTransformationConfig $
OS.unsafeEncodeUtf "examples" OS.</> OS.unsafeEncodeUtf "jbeam-edit.yaml"
let examplesDir = "examples"
jbflInputDir = examplesDir </> "jbfl"
jbeamInputDir = examplesDir </> "jbeam"
Expand Down
Loading