Import modules for metaprogramming.
This package provides an executable for importing modules in a directory and splicing those in. Please see the README on GitHub at https://github.com/parsonsmatt/glob-imports#readme
glob-imports
A Haskell source preprocessor which generalizes persistent-discover
and hspec-discover
, allowing you to metaprogram with source files.
A big limitation of TemplateHaskell
is that it cannot modify the import list of a file. The only way to metaprogram with the imports is to use a source preprocessor like this.
As an executable
Let's say you've got a ton of persistent
database models, all defined in a module hierarchy like this:
src/
Models/
Foo.hs
Bar.hs
Baz.hs
Blargh.hs
What.hs
OhNo.hs
If you're using persistent
to automatically generate migrations, you'll want to have all the [EntityDef]
in scope from each module. You can do that by importing each module that defines models and calling $(discoverEntities)
, introduced in persistent-2.13
.
But you may forget to import a module.
This utility splices in a qualified import statement for all the modules defined in the current directory and sub-directories, along with a list of imported modules. From this, you can use discover-instances
or other TemplateHaskell
code to work with these.
To use it, place the following command in a file, located in the same directory that your Haskell modules are in:
-- src/Models/All.hs
{-# OPTIONS_GHC -F -pgmF glob-imports #-}
module Models.All where
import Database.Persist.Sql
-- GLOB_IMPORTS_SPLICE
allEntities :: [EntityDef]
allEntities = $(discoverEntities)
The preprocessor will glob files in the current directory, and import all of them qualified. The result would look like this:
-- src/Models/All.hs
-- post-processed
module Models.All where
import Database.Persist.Sql
import qualified Models.Foo
import qualified Models.Bar
import qualified Models.Baz
import qualified Models.Blargh
import qualified Models.What
import qualified Models.OhNo
_importedModules :: [String]
_importedModules =
[ "Models.Foo"
, "Models.Bar"
, "Models.Baz"
, "Models.Blargh"
, "Models.What"
, "Models.OhNo"
]
allEntities :: [EntityDef]
allEntities = $(discoverEntities)
You'll need to add glob-imports
to the build-tool-depends
on your cabal file for this to work.