module MediaWiki.API.Output where
import MediaWiki.API.Types
import MediaWiki.API.Base
import Data.List
import Data.Maybe
showRequest :: Request
-> String
showRequest req =
join (showAction (reqAction req) : showMaxLag (reqMaxLag req) (showFormat (reqFormat req)))
showMaxLag :: Maybe Int -> String -> [String]
showMaxLag Nothing rs = [rs]
showMaxLag (Just l) rs = [field "maxlag" (show l), rs]
showFormat :: Format -> String
showFormat f = field "format" $ isFormatted (formatFormatted f) $
case formatKind f of
FormatJSON -> "json"
FormatPHP -> "php"
FormatWDDX -> "wddx"
FormatXML -> "xml"
FormatYAML -> "yaml"
FormatTxt -> "txt"
FormatDbg -> "dbg"
where
isFormatted False xs = xs
isFormatted _ xs = xs++"fm"
toReq :: APIRequest a => a -> [String]
toReq x =
case catMaybes $ showReq x of
[] -> []
xs -> map showP xs
where
showP (a,b) = a ++ '=':b
showQueryRequestKind :: QueryRequestKind -> [String]
showQueryRequestKind r =
case r of
InfoProp p -> toReq p
RevisionsProp p -> toReq p
LinksPropProp p -> toReq p
LangLinksProp p -> toReq p
ImagesProp p -> toReq p
ImageInfoProp p -> toReq p
TemplatesProp p -> toReq p
CategoriesProp p -> toReq p
AllCategoriesProp p -> toReq p
AllImagesProp p -> toReq p
AllLinksProp p -> toReq p
AllMessagesProp p -> toReq p
AllPagesProp p -> toReq p
AllUsersProp p -> toReq p
BacklinksProp p -> toReq p
EmbeddedInProp p -> toReq p
ImageUsageProp p -> toReq p
CategoryInfoProp p -> toReq p
CategoryMembersProp p -> toReq p
ExternalLinksProp p -> toReq p
ExternalURLUsageProp p -> toReq p
LogEventsProp p -> toReq p
RecentChangesProp p -> toReq p
SearchProp p -> toReq p
SiteInfoProp p -> toReq p
UserContribsProp p -> toReq p
UserInfoProp p -> toReq p
WatchListProp p -> toReq p
BlocksProp p -> toReq p
DeletedRevsProp p -> toReq p
UsersProp p -> toReq p
RandomProp p -> toReq p
showAction :: Action -> String
showAction act = join $
case act of
Sitematrix -> [field "action" "sitematrix"]
Login l -> (field "action" "login"): (toReq l)
Logout -> [field "action" "logout"]
Query q qr -> (field "action" "query") : (showQuery q) ++ qr
ExpandTemplates et -> (field "action" "expandtemplates") : (showExpandTemplates et)
Parse pt -> (field "action" "parse") : (showParseRequest pt)
OpenSearch os -> (field "action" "opensearch") : (showOpenSearch os)
FeedWatch f -> (field "action" "feedwatchlist") : (showFeedWatch f)
Help h -> (field "action" "help") : (showHelpRequest h)
ParamInfo pin -> (field "action" "paraminfo") : (showParamInfoRequest pin)
Unblock r -> (field "action" "unblock") : toReq r
Watch r -> (field "action" "watch") : toReq r
EmailUser r -> (field "action" "emailuser") : toReq r
Edit r -> (field "action" "edit") : toReq r
Move r -> (field "action" "move") : toReq r
Block r -> (field "action" "block") : toReq r
Protect r -> (field "action" "protect") : toReq r
Undelete r -> (field "action" "undelete") : toReq r
Delete r -> (field "action" "delete") : toReq r
Rollback r -> (field "action" "rollback") : toReq r
OtherAction at vs -> (field "action" at) : (map showValueName vs)
showHelpRequest :: HelpRequest -> [String]
showHelpRequest h =
maybeToList (fieldMb "version" showBool (helpVersion h))
showQuery :: QueryRequest -> [String]
showQuery q = catMaybes
[ fieldList "titles" "," (quTitles q)
, fieldList "pageids" "," (quPageIds q)
, fieldList "revids" "," (quRevIds q)
, fieldList "prop" "|" (map showPropKind $ quProps q)
, fieldList "list" "|" (map showListKind $ quLists q)
, fieldList "meta" "|" (map showMetaKind $ quMetas q)
, fieldMb "generator" showGeneratorKind (quGenerator q)
, fieldMb "redirects" showBool (quFollowRedirects q)
, fieldMb "indexpageids" showBool (quIndexPageIds q)
]
showExpandTemplates :: ExpandTemplatesRequest -> [String]
showExpandTemplates et = catMaybes
[ fieldMb "title" id (etTitle et)
, Just $ field "text" (etText et)
]
showPropKind :: PropKind -> String
showPropKind pk = prKind pk
showListKind :: ListKind -> String
showListKind lk = liKind lk
showMetaKind :: MetaKind -> String
showMetaKind mk = meKind mk
showParseRequest :: ParseRequest -> [String]
showParseRequest p = catMaybes
[ fieldMb "title" id (paTitle p)
, Just $ field "text" (paText p)
, fieldMb "page" id (paPage p)
, fieldList "prop" "|" (paProp p)
]
showOpenSearch :: OpenSearchRequest -> [String]
showOpenSearch o = catMaybes
[ Just $ field "search" (osSearch o)
, fieldMb "limit" show (osLimit o)
]
showFeedWatch :: FeedWatchListRequest -> [String]
showFeedWatch f = catMaybes
[ Just $ field "feedformat" (if feAsAtom f then "atom" else "rss")
, fieldMb "hours" show (feHours f)
, if feAllRev f then (Just $ field "allrev" "") else Nothing
]
showParamInfoRequest :: ParamInfoRequest -> [String]
showParamInfoRequest p = catMaybes
[ fieldList "modules" "," (paModules p)
, fieldList "querymodules" "|" (paQueryModules p)
]
showGeneratorKind :: GeneratorKind -> String
showGeneratorKind gk = genKind gk
showValueName :: ValueName -> String
showValueName (n,v) = field n v
showBool :: Bool -> String
showBool True = "true"
showBool _ = "false"
join :: [String] -> String
join [] = ""
join xs = concat (intersperse "&" xs)
field :: String -> String -> String
field a b = a ++ '=':b
fieldMb :: String -> (a -> String) -> Maybe a -> Maybe String
fieldMb _ _ Nothing = Nothing
fieldMb n f (Just x) = Just (field n (f x))
fieldList :: String -> String -> [String] -> Maybe String
fieldList _ _ [] = Nothing
fieldList n s xs = Just (field n (concat $ intersperse s xs))