aboutsummaryrefslogblamecommitdiffhomepage
path: root/scaffolder/src/Text/Edifact/Scaffolder/Composites.hs
blob: 07ef32aedff5ab1b6f57f7dee564ec98b78ac146 (plain) (tree)




















































                                                                                           
{-# LANGUAGE OverloadedStrings #-}

module Text.Edifact.Scaffolder.Composites
  ( composites
  ) where

import           Text.Edifact.Scaffolder.Commons

import           Text.Edifact.Scaffolder.Composites.Dependencies
import           Text.Edifact.Scaffolder.Composites.Elements
import           Text.Edifact.Scaffolder.Composites.Implementation
import           Text.Edifact.Scaffolder.Composites.Specification
import           Text.Edifact.Scaffolder.Composites.Types

import           Formatting

composites :: Scaffolding ()
composites = listComposites >>= scaffoldElements parentCompositeModule compositeModule

parentCompositeModule :: NonEmpty (ElementWithDefinition CompositeCode) -> Scaffolding ()
parentCompositeModule = parentModule "Composites" "C" compositeModuleName

compositeModuleName :: ModuleName -> CompositeCode -> ModuleName
compositeModuleName mn code = mn <.> fromString (getCompositeCode code)

compositeModule :: ElementWithDefinition CompositeCode -> Scaffolding ()
compositeModule (inputFile, code) = do
  moduleName <- getRootModuleNameFor (compositeModuleName "Composites" code)
  dependencies <- scanDependencies inputFile (snd <$> specificationParser)
  specification <- includeSpecification inputFile
  let parserFunction = fCompositeParserFunction
      fDescription = "Composite " % fCompositeCode
      parserNotYetImplemented = sformat (notYetImplemented fDescription) code
      defaultImplementation = haskellList [ parserNotYetImplemented ]
      elements = sort . nub . fmap dependencyElement <$> dependencies
      implementation = maybe defaultImplementation toImplementation dependencies
      buildDependencies b = fromMaybe [] <$> traverse b elements
  dependenciesReexports <- buildDependencies mkDependenciesReexports
  dependenciesImports   <- buildDependencies mkDependenciesImports
  dependenciesHaddock   <- buildDependencies mkDependenciesHaddock
  let exports = Comment "* Definition"
              : Name (sformat parserFunction code)
              : dependenciesReexports
      imports = dependenciesImports
             <> [ importCombinators ]
             <> maybe [ importNotYetImplementedHelper ] (const []) dependencies
      documentation = specification <> dependenciesHaddock
      signature = sformat (fParserSignature parserFunction) code
      definition = [ sformat (fParserDeclaration parserFunction) code
                   , indent (sformat ("composite " % quoted fCompositeCode) code)
                   ] <> (indent . indent <$> implementation)
      parser = signature : definition
  scaffoldModule moduleName ["OverloadedStrings"] exports imports (documentation <> parser)