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}