From d9c58262feae21576e84c8b85ad70c7665b04602 Mon Sep 17 00:00:00 2001 From: Paul Young Date: Thu, 25 Oct 2018 15:47:02 -0700 Subject: [PATCH] Add end' combinator to support trailing slashes --- src/Routing/Duplex.purs | 7 ++++++- test/Main.purs | 28 +++++++++++++++++----------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/Routing/Duplex.purs b/src/Routing/Duplex.purs index 350e5de..9fd462c 100644 --- a/src/Routing/Duplex.purs +++ b/src/Routing/Duplex.purs @@ -7,6 +7,7 @@ module Routing.Duplex , path , root , end + , end' , segment , param , flag @@ -30,7 +31,7 @@ module Routing.Duplex import Prelude -import Control.Alt (class Alt) +import Control.Alt (class Alt, (<|>)) import Control.Alternative (class Alternative) import Data.Either (Either) import Data.Foldable (class Foldable, foldMap, foldr) @@ -81,6 +82,10 @@ root = path "" end :: forall a b. RouteDuplex a b -> RouteDuplex a b end (RouteDuplex enc dec) = RouteDuplex enc (dec <* Parser.end) +-- Like `end`, but matches an optional trailing slash when parsing. The slash is omitted when printing. +end' :: forall a b. RouteDuplex a b -> RouteDuplex a b +end' (RouteDuplex enc dec) = RouteDuplex enc (dec <* (Parser.end <|> (Parser.prefix "" Parser.end))) + segment :: RouteDuplex' String segment = RouteDuplex Printer.put Parser.take diff --git a/test/Main.purs b/test/Main.purs index 928603e..62cfd23 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -8,7 +8,7 @@ import Data.Generic.Rep.Show (genericShow) import Data.String.Gen (genAlphaString) import Data.Symbol (SProxy(..)) import Effect (Effect) -import Routing.Duplex (RouteDuplex', flag, int, param, parse, print, record, rest, root, segment, string, (:=)) +import Routing.Duplex (RouteDuplex', end', flag, int, param, parse, path, print, record, rest, root, segment, string, (:=)) import Routing.Duplex.Generic (noArgs) import Routing.Duplex.Generic as RDG import Routing.Duplex.Generic.Syntax ((/), (?)) @@ -17,9 +17,10 @@ import Test.QuickCheck.Gen (Gen, arrayOf, chooseInt) data TestRoute = Root - | Foo String Int String { a :: String, b :: Boolean } - | Bar { id :: String, search :: String } - | Baz String (Array String) + | Foo + | Bar String Int String { a :: String, b :: Boolean } + | Baz { id :: String, search :: String } + | Qux String (Array String) derive instance eqTestRoute :: Eq TestRoute derive instance genericTestRoute :: Generic TestRoute _ @@ -27,16 +28,17 @@ instance showTestRoute :: Show TestRoute where show = genericShow genTestRoute :: Gen TestRoute genTestRoute = do - chooseInt 1 4 >>= case _ of + chooseInt 1 5 >>= case _ of 1 -> pure Root - 2 -> - Foo + 2 -> pure Foo + 3 -> + Bar <$> genAlphaString <*> arbitrary <*> genAlphaString <*> ({ a: _, b: _ } <$> genAlphaString <*> arbitrary) - 3 -> Bar <$> ({ id: _, search: _ } <$> genAlphaString <*> genAlphaString) - _ -> Baz <$> genAlphaString <*> (arrayOf genAlphaString) + 3 -> Baz <$> ({ id: _, search: _ } <$> genAlphaString <*> genAlphaString) + _ -> Qux <$> genAlphaString <*> (arrayOf genAlphaString) _id = SProxy :: SProxy "id" _search = SProxy :: SProxy "search" @@ -48,17 +50,21 @@ route = , "Foo": fooRoute , "Bar": barRoute , "Baz": bazRoute + , "Qux": quxRoute } where fooRoute = - segment / int segment / segment ? { a: string, b: flag } + path "qux" noArgs # end' barRoute = + segment / int segment / segment ? { a: string, b: flag } + + bazRoute = record # _id := segment # _search := param "search" - bazRoute = + quxRoute = segment / rest main :: Effect Unit