b9-1.0.0: src/lib/B9/Artifact/Readable/Source.hs
-- | Source files for 'B9.Artifact.Generator's.
--
-- @since 0.5.62
module B9.Artifact.Readable.Source
( ArtifactSource (..),
getArtifactSourceFiles,
)
where
import B9.Artifact.Content.Readable
import B9.Artifact.Content.StringTemplate
import B9.QCUtil
import Control.Parallel.Strategies
import Data.Data
import GHC.Generics (Generic)
import System.FilePath ((</>))
import Test.QuickCheck
-- | Describe how input files for artifacts to build are obtained. The general
-- structure of each constructor is __FromXXX__ /destination/ /source/
data ArtifactSource
= -- | Copy a 'B9.Artifact.Content.StringTemplate.SourceFile'
-- potentially replacing variable defined in 'Let'-like
-- parent elements.
FromFile
FilePath
SourceFile
| -- | Create a file from some 'Content'
FromContent
FilePath
Content
| -- | Set the unix /file permissions/ to all files generated
-- by the nested list of 'ArtifactSource's.
SetPermissions
Int
Int
Int
[ArtifactSource]
| -- | Assume a local directory as starting point for all
-- relative source files in the nested 'ArtifactSource's.
FromDirectory
FilePath
[ArtifactSource]
| -- | Specify an output directory for all the files
-- generated by the nested 'ArtifactSource's
IntoDirectory
FilePath
[ArtifactSource]
deriving (Read, Show, Eq, Data, Typeable, Generic)
instance NFData ArtifactSource
-- | Return all source files generated by an 'ArtifactSource'.
getArtifactSourceFiles :: ArtifactSource -> [FilePath]
getArtifactSourceFiles (FromContent f _) = [f]
getArtifactSourceFiles (FromFile f _) = [f]
getArtifactSourceFiles (IntoDirectory pd as) =
(pd </>) <$> (as >>= getArtifactSourceFiles)
getArtifactSourceFiles (FromDirectory _ as) = as >>= getArtifactSourceFiles
getArtifactSourceFiles (SetPermissions _ _ _ as) =
as >>= getArtifactSourceFiles
instance Arbitrary ArtifactSource where
arbitrary =
oneof
[ FromFile <$> smaller arbitraryFilePath <*> smaller arbitrary,
FromContent <$> smaller arbitraryFilePath <*> smaller arbitrary,
SetPermissions
<$> choose (0, 7)
<*> choose (0, 7)
<*> choose (0, 7)
<*> smaller arbitrary,
FromDirectory <$> smaller arbitraryFilePath <*> smaller arbitrary,
IntoDirectory <$> smaller arbitraryFilePath <*> smaller arbitrary
]