packages feed

apotiki-0.5.1: System/Apotiki/Debian/Control.hs

module System.Apotiki.Debian.Control (DebInfo, ctlFromData) where
import System.Apotiki.Utils
import Data.Attoparsec.Combinator (manyTill, many1)
import Data.ByteString.Char8 (pack, unpack)
import Data.List (intersperse)
import qualified Data.Map as M
import qualified Data.ByteString as B
import qualified Data.Attoparsec.ByteString as P

type DebInfo = M.Map String String

ctlValParser :: P.Parser String
ctlValParser = do
  P.string $ pack " "
  val <- unpack `fmap` P.takeWhile (P.notInClass "\n")
  P.string $ pack "\n"
  return val

ctlFlatDescParser = (concat . intersperse "\n ") `fmap` many1 ctlValParser

ctlEntryParser :: P.Parser (String, String)
ctlEntryParser = do
  k <- unpack `fmap` P.takeWhile (P.notInClass ":")
  P.string $ pack ":"
  v <- if (k == "Description") then ctlFlatDescParser else ctlValParser
  return (k, strip v)

ctlParser :: P.Parser DebInfo
ctlParser = M.fromList `fmap` many1 ctlEntryParser

ctlFromData :: B.ByteString -> Either String DebInfo
ctlFromData input = P.parseOnly ctlParser input

ctlFromFile :: String -> IO (Either String DebInfo)
ctlFromFile path = do
  content <- B.readFile path
  return (ctlFromData content)

test :: IO ()
test = do
  info <- ctlFromFile "/tmp/control"
  putStrLn $ show $ info