From 08fcedb84b81f41c9ad784e8b597abd53614492d Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Mon, 22 Dec 2025 10:41:19 +0100 Subject: [PATCH] use `tryReadFile` for reading transformation config --- exe/jbeam-edit/Main.hs | 6 +-- .../JbeamEdit/Transformation/Config.hs | 45 ++++++++++++------- test-extra/transformation/Spec.hs | 3 +- tools/dump_ast/Main.hs | 7 +-- 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/exe/jbeam-edit/Main.hs b/exe/jbeam-edit/Main.hs index 819b4956..d95c5e6c 100644 --- a/exe/jbeam-edit/Main.hs +++ b/exe/jbeam-edit/Main.hs @@ -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 () @@ -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 diff --git a/src-extra/transformation/JbeamEdit/Transformation/Config.hs b/src-extra/transformation/JbeamEdit/Transformation/Config.hs index 976c435c..c8fe58cc 100644 --- a/src-extra/transformation/JbeamEdit/Transformation/Config.hs +++ b/src-extra/transformation/JbeamEdit/Transformation/Config.hs @@ -15,8 +15,10 @@ 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 @@ -24,12 +26,11 @@ import Data.Yaml ( Object, ParseException (..), Parser, - decodeFileEither, + decodeEither', prettyPrintParseException, ) import Data.Yaml.Aeson ( FromJSON (..), - YamlException (..), withArray, withObject, withText, @@ -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 @@ -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 diff --git a/test-extra/transformation/Spec.hs b/test-extra/transformation/Spec.hs index 7d772126..4a3b476c 100644 --- a/test-extra/transformation/Spec.hs +++ b/test-extra/transformation/Spec.hs @@ -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 @@ -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 <- diff --git a/tools/dump_ast/Main.hs b/tools/dump_ast/Main.hs index 4c788190..153ec048 100644 --- a/tools/dump_ast/Main.hs +++ b/tools/dump_ast/Main.hs @@ -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, @@ -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"