property-list-0.0.1.0: src/Data/PropertyList/Xml.hs
{-# LANGUAGE
FlexibleContexts
#-}
module Data.PropertyList.Xml
( Plist
, readXmlPlist, showXmlPlist
, readXmlPlistFromFile, writeXmlPlistToFile
, PlistItem
, plistToPlistItem, plistItemToPlist
, UnparsedPlistItem(..)
, unparsedPlistItemToPlistItem
, readXmlPropertyList, readXmlPropertyListFromFile
, readXmlPartialPropertyList, showXmlPropertyList
, readXmlPartialPropertyListFromFile, writeXmlPropertyListToFile
) where
import Data.PropertyList.Algebra
import Data.PropertyList.Types
import Data.PropertyList.Xml.Parse
import Data.PropertyList.Xml.Types
import Control.Monad.Error ({- instance Monad (Either String) -})
-- * Reading and writing XML 'Plist's from files
-- |Try to parse a 'Plist' from an XML property-list file.
readXmlPlistFromFile :: FilePath -> IO (Either String Plist)
readXmlPlistFromFile path = do
contents <- readFile path
return (readXmlPlist contents)
-- |Try to write a 'Plist' to an XML property-list file.
writeXmlPlistToFile :: FilePath -> Plist -> IO ()
writeXmlPlistToFile path plist = do
writeFile path (showXmlPlist plist)
-- * Reading and writing XML 'PartialPropertyList's and 'PropertyList's from 'String's
-- |Read an XML propertylist from a 'String' in the xml1 plist format to a
-- propertylist type which is terminal for the liftings supported by
-- 'PlistItem' (such as @'PartialPropertyList' 'UnparsedPlistItem'@
-- or @'PartialPropertyList' 'PlistItem'@).
readXmlPartialPropertyList :: (PListCoalgebra f PlistItem, TerminalPList f pl) => String -> Either String pl
readXmlPartialPropertyList = fmap (toPlist . plistToPlistItem) . readXmlPlist
-- |Read a property list from a 'String' in the xml1 format. If parsing
-- fails, returns a description of the problem in the 'Left' result.
readXmlPropertyList :: FilePath -> Either String PropertyList
readXmlPropertyList str = do
x <- readXmlPartialPropertyList str :: Either String (PartialPropertyList UnparsedPlistItem)
completePropertyListByM (\unparsed -> Left ("Unparseable item found: " ++ show unparsed) :: Either String PropertyList) x
--readXmlPropertyList :: String -> PropertyList
--readXmlPropertyList
-- = runIdentity
-- . completePropertyListByM (\_ -> fail "parse error" :: Identity PropertyList)
-- . either error id
-- . (readXmlPartialPropertyList :: String -> Either String (PartialPropertyList UnparsedPlistItem))
-- |Render a propertylist to a 'String' in the xml1 plist format from any
-- initial propertylist type (which includes 'PropertyList', @'PartialPropertyList'
-- 'UnparsedPlistItem'@, and @'PartialPropertyList' 'PlistItem'@).
showXmlPropertyList :: (InitialPList f pl, PListAlgebra f PlistItem) => pl -> String
showXmlPropertyList = showXmlPlist . plistItemToPlist . fromPlist
-- * Reading and writing XML 'PartialPropertyList's and 'PropertyList's from files
-- |Read an XML propertylist from a file in the xml1 plist format to a
-- propertylist type which is terminal for the liftings supported by
-- 'PlistItem' (such as @'PartialPropertyList' 'UnparsedPlistItem'@
-- or @'PartialPropertyList' 'PlistItem'@).
readXmlPartialPropertyListFromFile
:: (PListCoalgebra f PlistItem, TerminalPList f pl) =>
FilePath -> IO (Either String pl)
readXmlPartialPropertyListFromFile file = do
x <- readXmlPlistFromFile file
return (fmap (toPlist . plistToPlistItem) x)
-- |Read a property list from a file in the xml1 format. If parsing fails,
-- calls 'fail'.
readXmlPropertyListFromFile :: FilePath -> IO PropertyList
readXmlPropertyListFromFile file = do
x <- readXmlPartialPropertyListFromFile file :: IO (Either String (PartialPropertyList UnparsedPlistItem))
y <- either fail return x
completePropertyListByM (\unparsed -> fail ("Unparseable item found: " ++ show unparsed) :: IO PropertyList) y
-- |Output a propertylist to a file in the xml1 plist format from any
-- initial propertylist type (which includes 'PropertyList', @'PartialPropertyList'
-- 'UnparsedPlistItem'@, and @'PartialPropertyList' 'PlistItem'@).
writeXmlPropertyListToFile
:: (InitialPList f pl, PListAlgebra f PlistItem) =>
FilePath -> pl -> IO ()
writeXmlPropertyListToFile file plist = do
writeXmlPlistToFile file (plistItemToPlist (fromPlist plist))