packages feed

kitchen-sink-0.1.0.0: src/KitchenSink/Core/Build/Target.hs

module KitchenSink.Core.Build.Target (Target (..), ProductionRule (..), Url, DestinationLocation (..), destinationUrl, SourceLocation (..), Sourced (..), Assembler (..), AssemblerError (..), copyFrom, execCmd, ExecRoot, OutputPrefix)
where

import Data.ByteString (ByteString)
import Data.ByteString qualified as ByteString
import Data.Text.Lazy qualified as LText
import System.Exit (ExitCode (..))
import System.Process qualified as Process
import System.Process.ByteString qualified as BProcess

import KitchenSink.Core.Assembler
import KitchenSink.Core.Build.Trace
import KitchenSink.Core.Generator
import KitchenSink.Prelude

type OutputPrefix = FilePath

data ProductionRule ext
    = ProduceAssembler (Assembler ext LText.Text)
    | ProduceGenerator (Tracer -> Generator ByteString.ByteString)
    | ProduceFileCopy (Sourced ())

data Target ext a = Target
    { destination :: DestinationLocation
    , productionRule :: ProductionRule ext
    , summary :: a
    }
    deriving (Functor)

data SourceLocation = FileSource FilePath
    deriving (Show, Eq, Ord)

data Sourced a = Sourced {location :: SourceLocation, obj :: a}
    deriving (Show, Eq, Ord)

type Url = Text

data DestinationLocation
    = StaticFileDestination Url FilePath
    | VirtualFileDestination Url FilePath
    deriving (Show, Eq, Ord)

destinationUrl :: DestinationLocation -> Url
destinationUrl (StaticFileDestination u _) = u
destinationUrl (VirtualFileDestination u _) = u

copyFrom :: SourceLocation -> ProductionRule ext
copyFrom path = ProduceFileCopy (Sourced path ())

type ExecRoot = Maybe FilePath

execCmd :: ExecRoot -> FilePath -> [String] -> ByteString -> ProductionRule ext
execCmd root path args input =
    ProduceGenerator f
  where
    f trace = Generator $ do
        _ <- trace $ Executing path args
        let cprocess = (Process.proc path args){Process.cwd = root}
        (code, !out, !err) <- BProcess.readCreateProcessWithExitCode cprocess input
        pure $ case code of
            ExitFailure n -> Left (GeneratorError (show n) err)
            _ -> Right out