{-|
Description : Root of formatting
-}
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 :: String -> Either Error String
defaultFormat = Configuration -> String -> Either Error String
format Configuration
Configuration.defaultConfiguration

format :: Configuration.Configuration -> String -> Either Error.Error String
format :: Configuration -> String -> Either Error String
format Configuration
configuration = Result String -> Either Error String
forall a. Result a -> Either Error a
Result.toEither (Result String -> Either Error String)
-> (String -> Result String) -> String -> Either Error String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Configuration -> String -> Result String
tryFormat Configuration
configuration

tryFormat :: Configuration.Configuration -> String -> Result.Result String
tryFormat :: Configuration -> String -> Result String
tryFormat Configuration
configuration String
source
  = do Configuration -> Result ()
Configuration.check Configuration
configuration
       ExactCode
exact <- StreamName -> String -> Result ExactCode
parse StreamName
stream String
source
       ExactCode
exact' <- Style -> ExactCode -> Result ExactCode
Control.format Style
style ExactCode
exact
       String -> Result String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Result String) -> String -> Result String
forall a b. (a -> b) -> a -> b
$ ExactCode -> String
forall a. Show a => a -> String
show ExactCode
exact'
  where stream :: StreamName
stream = Configuration -> StreamName
Configuration.configurationStreamName Configuration
configuration
        style :: Style
style = Configuration -> Style
Configuration.configurationStyle Configuration
configuration

parse :: StreamName.StreamName -> String -> Result.Result ExactCode.ExactCode
parse :: StreamName -> String -> Result ExactCode
parse StreamName
stream String
source
  = case ParseResult (Module SrcSpanInfo, [Comment])
parseResult of
        Source.ParseFailed SrcLoc
position String
message -> Error -> Result ExactCode
forall a. Error -> Result a
Result.fatalError Error
parseError
          where parseError :: Error
parseError = SrcLoc -> String -> Error
Error.createParseError SrcLoc
position String
message
        Source.ParseOk (Module SrcSpanInfo
actualCode, [Comment]
comments) -> ExactCode -> Result ExactCode
forall (m :: * -> *) a. Monad m => a -> m a
return ExactCode
exact
          where exact :: ExactCode
exact = Module SrcSpanInfo -> [Comment] -> ExactCode
ExactCode.create Module SrcSpanInfo
actualCode [Comment]
comments
  where parseResult :: ParseResult (Module SrcSpanInfo, [Comment])
parseResult = ParseMode -> String -> ParseResult (Module SrcSpanInfo, [Comment])
Source.parseFileContentsWithComments ParseMode
mode String
source
        mode :: ParseMode
mode = ParseMode
Source.defaultParseMode{parseFilename :: String
Source.parseFilename = StreamName -> String
forall a. Show a => a -> String
show StreamName
stream}