packages feed

fortran-src-extras-0.3.1: src/Language/Fortran/Extras/JSON/Supporting.hs

-- | Aeson instances for "small" definitions used in representing Fortran code.

{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE OverloadedStrings #-}

module Language.Fortran.Extras.JSON.Supporting() where

import Language.Fortran.Extras.JSON.Helpers
import Language.Fortran.Extras.Util
import Data.Aeson
import Language.Fortran.Util.Position
import Language.Fortran.Version
import Language.Fortran.AST.AList

instance (ToJSON (t a), ToJSON a) => ToJSON (AList t a) where
    toJSON     = gtj $ jcProdDrop "alist"
    toEncoding = gte $ jcProdDrop "alist"
instance (ToJSON a, ToJSON (t1 a), ToJSON (t2 a)) => ToJSON (ATuple t1 t2 a) where
    toJSON     = gtj $ jcProdDrop "atuple"
    toEncoding = gte $ jcProdDrop "atuple"

instance ToJSON FortranVersion where
    toJSON     = gtj $ jcEnumDrop mempty
    toEncoding = gte $ jcEnumDrop mempty

instance ToJSON Position where
    toJSON     = String . tshow
    toEncoding = toEncoding . tshow
instance ToJSON SrcSpan where
    toJSON     = String . tshow
    toEncoding = toEncoding . tshow

{- FromJSON instances

import Text.Megaparsec
import Text.Megaparsec.Char
import Text.Megaparsec.Char.Lexer qualified as L
import Data.Void ( Void )
import Data.Text ( Text )
import Data.Functor ( void )

-- TODO better error reporting
instance FromJSON Position where
    parseJSON  = withText "position" $ \t ->
        case parseMaybe pPosition t of
          Nothing  -> fail "failed to parse position"
          Just pos -> pure pos

-- TODO better error reporting
instance FromJSON SrcSpan where
    parseJSON  = withText "SrcSpan" $ \t ->
        case parseMaybe pSrcSpan t of
          Nothing -> fail "failed to parse SrcSpan"
          Just ss -> pure ss

type Parser = Parsec Void Text

pPosition :: Parser Position
pPosition = do
    posLine'   <- L.decimal
    void $ char ':'
    posColumn' <- L.decimal
    return initPosition { posLine = posLine', posColumn = posColumn' }

pSrcSpan :: Parser SrcSpan
pSrcSpan = do
    void $ char '('
    posFrom <- pPosition
    void $ string ")-("
    void $ char ')'
    posTo   <- pPosition
    return $ SrcSpan posFrom posTo

-}