module Language.Clafer.JSONMetaData (
generateJSONnameUIDMap,
generateJSONScopes
)
where
import qualified Data.List as List
import Data.Maybe
import Data.Json.Builder
import Data.String.Conversions
import Language.Clafer.QNameUID
generateJSONnameUIDMap :: QNameMaps -> String
generateJSONnameUIDMap qNameMaps =
prettyPrintJSON $ convertString $ toJsonBS $ foldl generateQNameUIDArrayEntry mempty sortedTriples
where
sortedTriples :: [(FQName, PQName, UID)]
sortedTriples = List.sortBy (\(fqName1, _, _) (fqName2, _, _) -> compare fqName1 fqName2) $ getQNameUIDTriples qNameMaps
generateQNameUIDArrayEntry :: Array -> (FQName, PQName, UID) -> Array
generateQNameUIDArrayEntry array (fqName, lpqName, uid) =
mappend array $ element $ mconcat [
row "fqName" fqName,
row "lpqName" lpqName,
row "uid" uid ]
generateJSONScopes :: QNameMaps -> [(UID, Integer)] -> String
generateJSONScopes qNameMaps scopes =
prettyPrintJSON $ convertString $ toJsonBS $ foldl generateLpqNameScopeArrayEntry mempty sortedLpqNameScopeList
where
lpqNameScopeList = map (\(uid, scope) -> (fromMaybe uid $ getLPQName qNameMaps uid, scope)) scopes
sortedLpqNameScopeList :: [(PQName, Integer)]
sortedLpqNameScopeList = List.sortBy (\(lpqName1, _) (lpqName2, _) -> compare lpqName1 lpqName2) lpqNameScopeList
generateLpqNameScopeArrayEntry :: Array -> (PQName, Integer) -> Array
generateLpqNameScopeArrayEntry array (lpqName, scope) =
mappend array $ element $ mconcat [
row "lpqName" lpqName,
row "scope" scope ]
prettyPrintJSON :: String -> String
prettyPrintJSON ('[':line) = '[':'\n':(prettyPrintJSON line)
prettyPrintJSON ('{':line) = '{':'\n':(prettyPrintJSON line)
prettyPrintJSON (',':line) = ',':'\n':(prettyPrintJSON line)
prettyPrintJSON (']':line) = '\n':']':(prettyPrintJSON line)
prettyPrintJSON ('}':line) = '\n':'}':(prettyPrintJSON line)
prettyPrintJSON (c:line) = c:(prettyPrintJSON line)
prettyPrintJSON "" = ""