{-# LANGUAGE OverloadedStrings #-} module Elm.Compiler ( version , Context(..) , Compile.DocsFlag(..) , Compile.Artifacts(..) , compile , Error.Error , errorsToDoc , errorsToJson , Warning.Warning ) where import qualified Data.ByteString as BS import qualified Data.Map as Map import qualified Data.Text as Text import qualified Compile import qualified Elm.Compiler.Module as M import qualified Elm.Compiler.Version import qualified Elm.Package as Pkg import qualified Json.Encode as Encode import qualified Reporting.Doc as D import qualified Reporting.Error as Error import qualified Reporting.Render.Code as Code import qualified Reporting.Region as Region import qualified Reporting.Report as Report import qualified Reporting.Result as Result import qualified Reporting.Warning as Warning -- VERSION version :: Pkg.Version version = Elm.Compiler.Version.version -- COMPILE data Context = Context { _package :: Pkg.Name , _docsFlag :: Compile.DocsFlag , _imports :: Map.Map M.Raw M.Canonical , _interfaces :: M.Interfaces } compile :: Context -> BS.ByteString -> ([Warning.Warning], Either [Error.Error] Compile.Artifacts) compile (Context pkg docsFlag importDict interfaces) source = Result.run $ Compile.compile docsFlag pkg importDict interfaces source -- ERRORS TO DOC errorsToDoc :: FilePath -> Text.Text -> [Error.Error] -> D.Doc errorsToDoc filePath source errors = let reports = concatMap (Error.toReports (Code.toSource source) Map.empty) errors in D.vcat $ map (Report.toDoc filePath) reports -- ERRORS TO JSON errorsToJson :: M.Raw -> FilePath -> Text.Text -> [Error.Error] -> Encode.Value errorsToJson moduleName filePath source errors = let reports = concatMap (Error.toReports (Code.toSource source) Map.empty) errors in Encode.object [ ("path", Encode.text (Text.pack filePath)) , ("name", Encode.name moduleName) , ("problems", Encode.array (map reportToJson reports)) ] reportToJson :: Report.Report -> Encode.Value reportToJson (Report.Report title region _sgstns message) = Encode.object [ ("title", Encode.text (Text.pack title)) , ("region", Region.encode region) , ("message", D.encode message) ]