packages feed

bookhound-0.1.0.0: src/Operations/ToXml.hs

{-# LANGUAGE PostfixOperators, FlexibleInstances, UndecidableInstances, IncoherentInstances #-}

module Operations.ToXml where

import SyntaxTrees.Xml  (XmlExpression(..), literalExpression)
import SyntaxTrees.Json (JsExpression(..))
import Operations.ToJson (ToJson(..))

import qualified Data.Map as Map
import Data.Char (toLower)


class ToXml a where
  toXml :: a -> XmlExpression


instance ToXml XmlExpression where
  toXml = id


instance ToXml JsExpression where

  toXml x = case x of
    JsNull       -> literalExpression "null"
    JsNumber n   -> literalExpression $ show n
    JsBool bool  -> literalExpression $ toLower <$> show bool
    JsString str -> literalExpression str

    JsArray arr  -> XmlExpression "array" Map.empty (elemExpr <$> arr) where

      elemExpr elem = XmlExpression { tagName = "elem",
                                       fields = Map.empty,
                                       expressions = [toXml elem] }

    JsObject obj -> XmlExpression "object" Map.empty (keyValueExpr <$> Map.toList obj)  where

      keyValueExpr (key, value) = XmlExpression { tagName = key,
                                                  fields = Map.empty,
                                                  expressions = [toXml value] }


instance ToJson a => ToXml a where
  toXml = toXml . toJson