Skip to content

Commit 64cc633

Browse files
authored
use tryReadFile for reading transformation config (#141)
1 parent 286b798 commit 64cc633

File tree

4 files changed

+36
-25
lines changed

4 files changed

+36
-25
lines changed

exe/jbeam-edit/Main.hs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ import Data.Text qualified as T
2222
#endif
2323

2424
#ifdef ENABLE_TRANSFORMATION
25-
import System.FilePath qualified as FP ((</>))
2625
import JbeamEdit.Transformation (transform)
2726
import JbeamEdit.Transformation.Config
28-
import System.Directory qualified as FP (getCurrentDirectory)
2927
#endif
3028

3129
main :: IO ()
@@ -81,8 +79,8 @@ applyTransform :: Options -> Node -> IO (Either Text Node)
8179
#ifdef ENABLE_TRANSFORMATION
8280
applyTransform (Options {optTransformation = False}) topNode = pure (Right topNode)
8381
applyTransform opts topNode = do
84-
cwd <- FP.getCurrentDirectory
85-
tfConfig <- loadTransformationConfig $ cwd FP.</> transformationConfigFile
82+
cwd <- getCurrentDirectory
83+
tfConfig <- loadTransformationConfig $ cwd </> transformationConfigFile
8684
case transform (optUpdateNames opts) tfConfig topNode of
8785
Right (badVertexNodes, badBeamNodes, topNode') -> do
8886
reportInvalidNodes "Invalid vertex nodes encountered:" badVertexNodes

src-extra/transformation/JbeamEdit/Transformation/Config.hs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,22 @@ module JbeamEdit.Transformation.Config (
1515
) where
1616

1717
import Control.Monad (forM, when)
18+
import Control.Monad.Except (ExceptT (..), runExceptT)
19+
import Data.Bifunctor (first)
20+
import Data.ByteString.Lazy qualified as LBS
1821
import Data.Functor (($>))
19-
import Data.List (isPrefixOf)
2022
import Data.Scientific (Scientific)
2123
import Data.Text (Text)
2224
import Data.Text qualified as T
2325
import Data.Yaml (
2426
Object,
2527
ParseException (..),
2628
Parser,
27-
decodeFileEither,
29+
decodeEither',
2830
prettyPrintParseException,
2931
)
3032
import Data.Yaml.Aeson (
3133
FromJSON (..),
32-
YamlException (..),
3334
withArray,
3435
withObject,
3536
withText,
@@ -38,9 +39,11 @@ import Data.Yaml.Aeson (
3839
(.:?),
3940
)
4041
import GHC.Generics
42+
import GHC.IO.Exception (IOErrorType (NoSuchThing))
4143
import GHC.IsList
4244
import JbeamEdit.IOUtils
4345
import JbeamEdit.Transformation.Types (VertexTreeType (..))
46+
import System.OsPath
4447
import Text.Read
4548

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

142-
formatParseError :: ParseException -> IO ()
143-
formatParseError (AesonException err) = putErrorStringLn err
144-
formatParseError excp = case excp of
145-
(InvalidYaml (Just (YamlException errMsg)))
146-
| "Yaml file not found:" `isPrefixOf` errMsg -> pure ()
147-
_ -> putErrorStringLn (prettyPrintParseException excp)
148-
149-
transformationConfigFile :: FilePath
150-
transformationConfigFile = ".jbeam-edit.yaml"
151-
152-
loadTransformationConfig :: FilePath -> IO TransformationConfig
153-
loadTransformationConfig filename =
154-
decodeFileEither filename
155-
>>= either ((newTransformationConfig <$) . formatParseError) pure
145+
formatParseError :: ParseException -> String
146+
formatParseError (AesonException err) = err
147+
formatParseError excp = prettyPrintParseException excp
148+
149+
transformationConfigFile :: OsPath
150+
transformationConfigFile = unsafeEncodeUtf ".jbeam-edit.yaml"
151+
152+
decodeConfig :: LBS.ByteString -> Either Text TransformationConfig
153+
decodeConfig "" = Right newTransformationConfig
154+
decodeConfig content =
155+
first
156+
(T.pack . formatParseError)
157+
(decodeEither' $ LBS.toStrict content)
158+
159+
loadTransformationConfig :: OsPath -> IO TransformationConfig
160+
loadTransformationConfig filename = do
161+
configEither <-
162+
runExceptT
163+
(ExceptT (tryReadFile [NoSuchThing] filename) >>= ExceptT . pure . decodeConfig)
164+
case configEither of
165+
Right config -> pure config
166+
Left err -> putErrorLine err $> newTransformationConfig

test-extra/transformation/Spec.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import JbeamEdit.Formatting
99
import JbeamEdit.Transformation
1010
import JbeamEdit.Transformation.Config
1111
import System.Directory (getDirectoryContents)
12+
import System.OsPath
1213
import Test.Hspec
1314

1415
listFilesInDir
@@ -39,7 +40,7 @@ topNodeSpec rs cfName tfConfig inFilename outFilename = do
3940

4041
main :: IO ()
4142
main = hspec $ do
42-
let exampleConfigPath = "examples/jbeam-edit.yaml"
43+
let exampleConfigPath = unsafeEncodeUtf "examples/jbeam-edit.yaml"
4344
rs <- runIO $ readFile "examples/ast/jbfl/minimal.hs"
4445
tfConfig <- runIO $ loadTransformationConfig exampleConfigPath
4546
inputFiles <-

tools/dump_ast/Main.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ import JbeamEdit.Parsing.DSL (parseDSL)
1212
import JbeamEdit.Parsing.Jbeam (parseNodes)
1313
import JbeamEdit.Transformation
1414
import JbeamEdit.Transformation.Config
15-
import System.Directory (getCurrentDirectory, getDirectoryContents)
15+
import System.Directory (getDirectoryContents)
1616
import System.Exit (exitFailure)
1717
import System.FilePath (dropExtension, takeBaseName, (</>))
1818
import System.IO qualified as IO (readFile)
19+
import System.OsPath qualified as OS (unsafeEncodeUtf, (</>))
1920
import Text.Pretty.Simple (
2021
StringOutputStyle (..),
2122
defaultOutputOptionsNoColor,
@@ -25,9 +26,9 @@ import Text.Pretty.Simple (
2526

2627
main :: IO ()
2728
main = do
28-
cwd <- getCurrentDirectory
2929
exampleCfg <-
30-
loadTransformationConfig $ cwd </> "examples" </> "jbeam-edit.yaml"
30+
loadTransformationConfig $
31+
OS.unsafeEncodeUtf "examples" OS.</> OS.unsafeEncodeUtf "jbeam-edit.yaml"
3132
let examplesDir = "examples"
3233
jbflInputDir = examplesDir </> "jbfl"
3334
jbeamInputDir = examplesDir </> "jbeam"

0 commit comments

Comments
 (0)