module Network.TableStorage.Atom (
atomNamespace, dataServicesNamespace, metadataNamespace,
qualifyAtom, qualifyDataServices, qualifyMetadata,
atomElement, atomAttr, wrapContent
) where
import Network.TableStorage.XML
( qualify, cDataText, namespaceAttr )
import Network.TableStorage.Format ( atomDate )
import Text.XML.Light
( Element(elAttribs, elContent, elName),
Content(Elem),
QName, CDataKind(..), Content(..), CData(..),
Attr(..),
blank_element,
unqual )
import Data.Maybe (fromMaybe)
atomNamespace :: String
atomNamespace = "http://www.w3.org/2005/Atom"
dataServicesNamespace :: String
dataServicesNamespace = "http://schemas.microsoft.com/ado/2007/08/dataservices"
metadataNamespace :: String
metadataNamespace = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
qualifyAtom :: String -> QName
qualifyAtom = qualify (Just atomNamespace) Nothing
qualifyDataServices :: String -> QName
qualifyDataServices = qualify (Just dataServicesNamespace) (Just "d")
qualifyMetadata :: String -> QName
qualifyMetadata = qualify (Just metadataNamespace) (Just "m")
atomElement :: String -> Maybe String -> [Attr] -> [Element] -> Element
atomElement name content attrs els =
blank_element { elName = qualifyAtom name,
elAttribs = attrs,
elContent = map Elem els ++ maybe [] cDataText content }
atomAttr :: String -> String -> Attr
atomAttr name value =
Attr { attrKey = qualifyAtom name,
attrVal = value }
wrapContent :: Maybe String -> Element -> IO Element
wrapContent entityID content = do
date <- atomDate
return $
atomElement "entry" Nothing
[ Attr { attrKey = unqual "xmlns", attrVal = atomNamespace }
, namespaceAttr "d" dataServicesNamespace
, namespaceAttr "m" metadataNamespace
]
[ atomElement "category" Nothing
[ atomAttr "scheme" "http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"
, atomAttr "term" "clio.cookies"
] []
, atomElement "title" Nothing [] []
, atomElement "author" Nothing []
[ atomElement "name" Nothing [] [] ]
, atomElement "updated" (Just date) [] []
, blank_element
{ elName = qualifyAtom "id"
, elAttribs = []
, elContent = [Text CData { cdVerbatim = CDataRaw, cdData = fromMaybe "" entityID, cdLine = Nothing }]
}
, atomElement "content" Nothing
[ atomAttr "type" "application/xml" ]
[ content ]
]