{-# LANGUAGE OverloadedStrings #-}
module Language.Fortran.Extras.JSON.Helpers
( toJSONAnnoMerge
, toJSONAnnoTaggedObj
, jcProd, jcProdDrop
, jcSum, jcSumDrop
, jcEnum, jcEnumDrop
, tja, gtj, gte
) where
import Data.Aeson hiding ( Value )
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
import Language.Fortran.Util.Position ( SrcSpan )
import Data.Text ( Text )
import GHC.Generics ( Generic, Rep )
toJSONAnnoMerge
:: (ToJSON a, ToJSON SrcSpan)
=> Text -> a -> SrcSpan -> [Aeson.Pair] -> Aeson.Value
toJSONAnnoMerge :: forall a.
(ToJSON a, ToJSON SrcSpan) =>
Text -> a -> SrcSpan -> [Pair] -> Value
toJSONAnnoMerge Text
t a
a SrcSpan
ss [Pair]
m = [Pair] -> Value
object forall a b. (a -> b) -> a -> b
$
[ Key
"anno" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= a
a
, Key
"span" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= SrcSpan
ss
, Key
"tag" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
t ] forall a. Semigroup a => a -> a -> a
<> [Pair]
m
toJSONAnnoTaggedObj
:: (ToJSON a, ToJSON SrcSpan)
=> Text -> a -> SrcSpan -> [Aeson.Pair] -> Aeson.Value
toJSONAnnoTaggedObj :: forall a.
(ToJSON a, ToJSON SrcSpan) =>
Text -> a -> SrcSpan -> [Pair] -> Value
toJSONAnnoTaggedObj Text
t a
a SrcSpan
ss [Pair]
m = [Pair] -> Value
object
[ Key
"anno" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= a
a
, Key
"span" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= SrcSpan
ss
, Key
"tag" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
t
, Key
"contents" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object [Pair]
m ]
tja :: (ToJSON a, ToJSON SrcSpan)
=> Text -> a -> SrcSpan -> [Aeson.Pair] -> Aeson.Value
tja :: forall a.
(ToJSON a, ToJSON SrcSpan) =>
Text -> a -> SrcSpan -> [Pair] -> Value
tja = forall a.
(ToJSON a, ToJSON SrcSpan) =>
Text -> a -> SrcSpan -> [Pair] -> Value
toJSONAnnoMerge
jcProd :: (String -> String) -> Aeson.Options
jcProd :: (String -> String) -> Options
jcProd String -> String
f = Options
Aeson.defaultOptions
{ rejectUnknownFields :: Bool
Aeson.rejectUnknownFields = Bool
True
, fieldLabelModifier :: String -> String
Aeson.fieldLabelModifier = Char -> String -> String
Aeson.camelTo2 Char
'_' forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
f
}
jcProdDrop :: String -> Aeson.Options
jcProdDrop :: String -> Options
jcProdDrop String
x = (String -> String) -> Options
jcProd (forall a. Int -> [a] -> [a]
drop (forall (t :: * -> *) a. Foldable t => t a -> Int
length String
x))
jcSum :: (String -> String) -> String -> String -> Aeson.Options
jcSum :: (String -> String) -> String -> String -> Options
jcSum String -> String
f String
tag String
contents = Options
Aeson.defaultOptions
{ rejectUnknownFields :: Bool
Aeson.rejectUnknownFields = Bool
True
, constructorTagModifier :: String -> String
Aeson.constructorTagModifier = Char -> String -> String
Aeson.camelTo2 Char
'_' forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
f
, sumEncoding :: SumEncoding
Aeson.sumEncoding = Aeson.TaggedObject
{ tagFieldName :: String
Aeson.tagFieldName = String
tag
, contentsFieldName :: String
Aeson.contentsFieldName = String
contents
}
}
jcSumDrop :: String -> Aeson.Options
jcSumDrop :: String -> Options
jcSumDrop String
x = (String -> String) -> String -> String -> Options
jcSum (forall a. Int -> [a] -> [a]
drop (forall (t :: * -> *) a. Foldable t => t a -> Int
length String
x)) String
"tag" String
"contents"
jcEnum :: (String -> String) -> Aeson.Options
jcEnum :: (String -> String) -> Options
jcEnum String -> String
f = Options
Aeson.defaultOptions
{ rejectUnknownFields :: Bool
Aeson.rejectUnknownFields = Bool
True
, constructorTagModifier :: String -> String
Aeson.constructorTagModifier = Char -> String -> String
Aeson.camelTo2 Char
'_' forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
f
}
jcEnumDrop :: String -> Aeson.Options
jcEnumDrop :: String -> Options
jcEnumDrop = (String -> String) -> Options
jcEnum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> [a]
drop forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Int
length
gtj :: (Generic a, Aeson.GToJSON' Aeson.Value Aeson.Zero (Rep a)) => Aeson.Options -> a -> Aeson.Value
gtj :: forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
gtj = forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON
gte :: (Generic a, Aeson.GToJSON' Aeson.Encoding Aeson.Zero (Rep a)) => Aeson.Options -> a -> Aeson.Encoding
gte :: forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
gte = forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding