servant-matrix-param-0.3.1: src/Servant/MatrixParam/Server/Internal.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Servant.MatrixParam.Server.Internal (
MatrixSegment(..),
getSegmentParams,
parsePathSegment,
) where
import Data.Map.Strict
import Data.Maybe
import Data.Text
data MatrixSegment
= MatrixSegment {
segmentPath :: Text,
segmentParams :: Maybe (Map Text (Maybe Text))
}
deriving (Show, Eq)
getSegmentParams :: MatrixSegment -> Map Text (Maybe Text)
getSegmentParams = fromMaybe mempty . segmentParams
parsePathSegment :: Text -> Maybe MatrixSegment
parsePathSegment segment = case splitOn ";" segment of
[] -> return $ MatrixSegment "" mempty
[path] -> return $ MatrixSegment path mempty
[path, ""] -> return $ MatrixSegment path mempty
(path : pairs) ->
Just $ MatrixSegment path $
fmap fromList $ mapM parsePair pairs
parsePair :: Text -> Maybe (Text, Maybe Text)
parsePair pair = case splitOn "=" pair of
[key, value] -> Just (key, Just value)
[flag] -> Just (flag, Nothing)
_ -> Nothing