Zuerst werde ich einen Parser mit attoparsec erstellen eine Zeichenfolge wie "filter[title]"
zu nehmen, und das Rück "title"
davon:
import Data.Attoparsec.Text
filterParser :: Parser Text
filterParser = do
_ <- string "filter["
filterKey <- takeTill (== ']')
_ <- string "]"
return filterKey
die Query-String-Parameter holen, um eine Liste von (Text, Text)
und analysieren sie in (filterKey, filterValue)
Paare :
getHomeR :: Handler Html
getHomeR = do
params <- reqGetParams <$> getRequest -- (1)
let filters = catMaybes $ map (\(queryParam, filterValue) -> case maybeResult $ parse filterParser queryParam of -- (2) (4)
Nothing -> Nothing -- (3)
Just filterKey -> Just (filterKey, filterValue) -- (3)
) params
liftIO $ print $ "Params are " ++ show filters
der Query-String-Parameter reqGetParams
mit Get
parse
von attoparsec wendet eine Parser
(filterParser
) auf den Schlüsselteil der Abfragezeichenfolge an. Wir machen das sofort zu einem Maybe
mit maybeResult
von attoparsec. Wenn das Parsen erfolgreich ist, erhalten wir eine Just "title"
, oder wenn es fehlschlägt (der Abfrageparameter sah nicht wie "filter=[foo]"
aus) erhalten wir Nothing
.
Wenn der Parameter ein Filter war, geben Sie Just (filterKey, filterValue)
zurück, andernfalls Nothing
.
Verwenden catMaybes
all Nothing
s aus der Liste zu entfernen, uns nur die [(filterKey, filterValue)]
Paare geben.
Caveats:
- Dieser Code behandelt nicht entkommen. Ich bezweifle jedoch, dass Sie etwas wie unterstützen müssen.
- Dieser Code entfernt nicht die Anführungszeichen um die Abfrageparamwerte. Ich denke, du solltest diese nicht einfach schicken, wenn du sie nicht verwendest.
- Ich bin nicht sehr gut in Parsing-Code zu schreiben. Sie könnten stattdessen eine Regexp verwenden, wenn Sie möchten.
Was möchten Sie mit einem solchen Typ machen? Offensichtlich sehe ich keinen Grund dafür, eine Liste in ein 'Maybe' zu schreiben, da' Just v' als Singleton-Liste ('[v]') kodiert werden kann und 'Nothing' als leere Liste (' [] 'kodiert werden kann). Könnten Sie Ihre Ziele klären? –
Ich habe die Frage aktualisiert, um das Maybe zu entfernen. Jetzt ist es nur eine Liste von Tupeln. Immer noch nicht sicher, wie man es bekommt :) – amitaibu