D'abord, je vais créer un parseur avec attoparsec prendre une chaîne comme "filter[title]"
et retour "title"
de cette:
import Data.Attoparsec.Text
filterParser :: Parser Text
filterParser = do
_ <- string "filter["
filterKey <- takeTill (== ']')
_ <- string "]"
return filterKey
Obtenez les paramètres de chaîne de requête, une liste de (Text, Text)
, et les analyser en (filterKey, filterValue)
paires :
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
obtenir les paramètres de chaîne de requête à l'aide reqGetParams
Depuis attoparsec, un Parser
(filterParser
) est ajouté à la partie clé de la chaîne de requête. Nous faisons immédiatement cela dans un Maybe
en utilisant maybeResult
de attoparsec. Si l'analyse réussit, nous obtenons un Just "title"
, ou en cas d'échec (le paramètre de requête ne ressemble pas à "filter=[foo]"
) nous obtenons Nothing
.
Si le paramètre était un filtre, renvoyer Just (filterKey, filterValue)
, sinon Nothing
.
Utilisez catMaybes
pour supprimer tous les Nothing
s de la liste, en ne donnant que les paires [(filterKey, filterValue)]
.
Avertissements:
- Ce code ne gère pas échapper. Je doute que vous ayez besoin de soutenir quelque chose comme
"filter[foo\]bar]"
cependant.
- Ce code ne supprime pas les guillemets autour des valeurs de paramètre de requête. Je pense que vous ne devriez pas les envoyer si possible, puisque vous ne les utilisez pas.
- Je ne suis pas très doué pour l'écriture de code d'analyse. Vous pourriez utiliser une regexp à la place si vous le souhaitez.
Que voudriez-vous faire avec un tel type? Apparemment, je ne vois aucune raison de mettre une liste dans 'Maybe 'parce que' Just v' peut être encodé comme une liste singleton ('[v]') et 'Nothing' peut être encodé comme une liste vide (' [] '). Pourriez-vous clarifier vos objectifs? –
J'ai mis à jour la question pour supprimer le Peut-être. Maintenant, c'est juste une liste de tuples. Toujours pas sûr comment l'obtenir :) – amitaibu