module Language.Haskell.Formatter.Main (defaultFormat, format) where
import qualified Language.Haskell.Formatter.Configuration as Configuration
import qualified Language.Haskell.Formatter.Error as Error
import qualified Language.Haskell.Formatter.ExactCode as ExactCode
import qualified Language.Haskell.Formatter.Process.Control as Control
import qualified Language.Haskell.Formatter.Result as Result
import qualified Language.Haskell.Formatter.Source as Source
import qualified Language.Haskell.Formatter.Toolkit.StreamName as StreamName
defaultFormat :: String -> Either Error.Error String
defaultFormat = format Configuration.defaultConfiguration
format :: Configuration.Configuration -> String -> Either Error.Error String
format configuration = Result.toEither . tryFormat configuration
tryFormat :: Configuration.Configuration -> String -> Result.Result String
tryFormat configuration source
= do Configuration.check configuration
exact <- parse stream source
exact' <- Control.format style exact
return $ show exact'
where stream = Configuration.configurationStreamName configuration
style = Configuration.configurationStyle configuration
parse :: StreamName.StreamName -> String -> Result.Result ExactCode.ExactCode
parse stream source
= case parseResult of
Source.ParseFailed position message -> Result.fatalError parseError
where parseError = Error.createParseError position message
Source.ParseOk (actualCode, comments) -> return exact
where exact = ExactCode.create actualCode comments
where parseResult = Source.parseFileContentsWithComments mode source
mode = Source.defaultParseMode{Source.parseFilename = show stream}