-- | Parsing and Printing NextStep style (old style) plist files

module Text.NSPlist (
    NSPlistValue(..),

    parseNSPlist,
    readNSPlistFromFile,

    showNSPlist,
    writeNSPlistToFile
  ) where


import Text.Parsec (runParser)
import Text.Parsec.Error (ParseError)
import Text.PrettyPrint (render)

import Text.NSPlist.Types (NSPlistValue(..))
import Text.NSPlist.Parsec (pNSPlist)
import Text.NSPlist.Pretty (prettyNSPlist)


parseNSPlist :: String -> Either ParseError NSPlistValue
parseNSPlist = runParser pNSPlist () ""

readNSPlistFromFile :: FilePath -> IO NSPlistValue
readNSPlistFromFile filePath = do
  file <- readFile filePath
  case runParser pNSPlist () filePath file of
       Left parseError -> error ("Cannot parse file " ++ filePath
                                 ++ ", error was " ++ show parseError)
       Right obj       -> return obj

writeNSPlistToFile :: FilePath -> NSPlistValue -> IO ()
writeNSPlistToFile filePath = writeFile filePath . showNSPlist

showNSPlist :: NSPlistValue -> String
showNSPlist = render . prettyNSPlist