{-# LANGUAGE TypeFamilies, ScopedTypeVariables, DeriveDataTypeable , MultiParamTypeClasses , TypeSynonymInstances , TemplateHaskell , QuasiQuotes , FlexibleInstances #-} -- :set -ddump-splices module AI where import Language.Pads.Padsc import Language.Pads.GenPretty import System.IO.Unsafe (unsafePerformIO) [pads| newtype AI = AI ([Line Entry] terminator EOF) data Entry = Entry { host :: Src, ' ', identdID :: ID, ' ', httpID :: ID, ' ', time :: TimeStamp, ' ', request :: Request, ' ', response :: Response, ' ', contentLen :: ContentLength } data Src = Addr { a :: IPInt, '.' , b :: IPInt, '.' , c :: IPInt, '.' , d :: IPInt } | Name Host --type IP_v4 = (IPInt, '.', IPInt, '.', IPInt, '.', IPInt) type IPInt = constrain i :: Int where <| 0 <= i && i < 256 |> type Host = StringC ' ' data ID = Missing '-' | Id (StringC ' ') type TimeStamp = ('[', Date, ']') type Date = DateFC <|("%d/%h/%Y:%H:%M:%S %z", ']')|> data Request = Request { '"', method :: Method, ' ', url :: StringC ' ', ' ', version :: Version where <| checkVersion method version |>, '"' } data Method = GET | PUT | POST | HEAD | DELETE | LINK | UNLINK -- obsolete after http 1.0 data Version = Version {"HTTP/", major :: Int, '.', minor :: Int} -- add constriants on major and minor mode type Response = constrain r :: Int where <| 100 <= r && r < 600 |> data ContentLength = NotAvailable '-' | ContentLength Int |] checkVersion :: Method -> Version -> Bool checkVersion method version = case method of LINK -> major version == 1 && minor version == 0 UNLINK -> major version == 1 && minor version == 0 _ -> True mkPrettyInstance ''AI mkPrettyInstance ''AI_md ai_file = ai_big ai_3000 = "examples/data/ai.3000" ai_big = "examples/data/ai.big" -- (ai_rep, ai_md) = let (AI rep, md) = unsafePerformIO $ parseFile ai_file in (rep,md) (AI ai_rep, ai_md) = unsafePerformIO $ parseFileWith aI_parseM ai_file ai_file_length = Prelude.length ai_rep ai_file_take n = Prelude.take n ai_rep test = ai_file_take 20 printAI n = putStrLn(pretty 100 (ppr (ai_file_take n))) result n = do { (AI rep, md) <- parseFile ai_file ; return (Prelude.take n rep) }