summaryrefslogtreecommitdiff
path: root/lib/SlackBuilder/LatestVersionCheck.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-09-13 21:58:13 +0200
committerEugen Wissner <belka@caraus.de>2024-09-13 21:58:13 +0200
commit3dde41e0d4848567e4a7fbcd20f43d35ce8e2dbf (patch)
tree33c698a311232a56aed93adef6e929b70a10ccf0 /lib/SlackBuilder/LatestVersionCheck.hs
parent74da0eb39142e4b7e6631dc4f767ec2af86af44b (diff)
downloadslackbuilder-3dde41e0d4848567e4a7fbcd20f43d35ce8e2dbf.tar.gz
Introduce a matcher for one or more matched digits
Diffstat (limited to 'lib/SlackBuilder/LatestVersionCheck.hs')
-rw-r--r--lib/SlackBuilder/LatestVersionCheck.hs26
1 files changed, 15 insertions, 11 deletions
diff --git a/lib/SlackBuilder/LatestVersionCheck.hs b/lib/SlackBuilder/LatestVersionCheck.hs
index a1ed946..523451e 100644
--- a/lib/SlackBuilder/LatestVersionCheck.hs
+++ b/lib/SlackBuilder/LatestVersionCheck.hs
@@ -62,8 +62,8 @@ data MatchState = MatchState
data MatchToken
= OpenParenMatchToken
| CloseParenMatchToken
- | AsteriskMatchToken
| SymbolMatchToken Char
+ | AtLeastMatchToken [Char]
| OneOfMatchToken [Char]
deriving (Eq, Show)
@@ -76,6 +76,7 @@ data MatchToken
-- * ( ) - The text in parentheses is matched but no saved in the resulting
-- string.
-- * \\d - Matches zero or more digits.
+-- * \\D - Matches one or more digits.
-- * \\. - Matches zero or more digits or dots.
-- * \\\\ - Matches a back slash.
-- * * - Matches everything.
@@ -103,20 +104,21 @@ match fullPattern = go startState
go (state{ ignoring = True, pattern' = tokens }) input'
go state@MatchState{ pattern' = CloseParenMatchToken : tokens } input' =
go (state{ ignoring = False, pattern' = tokens }) input'
- go state@MatchState{ pattern' = AsteriskMatchToken : tokens } input'
- | Just (nextCharacter, leftOver) <- Text.uncons input' =
- go (matchSymbolToken state nextCharacter) leftOver
- | otherwise = go state{ pattern' = tokens } ""
+ go state@MatchState{ pattern' = SymbolMatchToken patternCharacter : tokens } input'
+ | Just (nextCharacter, leftOver) <- Text.uncons input'
+ , patternCharacter == nextCharacter =
+ go (matchSymbolToken state{ pattern' = tokens } nextCharacter) leftOver
+ | otherwise = Nothing
go state@MatchState{ pattern' = OneOfMatchToken chars : tokens } input'
| Just (nextCharacter, leftOver) <- Text.uncons input'
, nextCharacter `elem` chars =
go (matchSymbolToken state nextCharacter) leftOver
| otherwise =
go (state{ pattern' = tokens }) input'
- go state@MatchState{ pattern' = SymbolMatchToken patternCharacter : tokens } input'
+ go state@MatchState{ pattern' = AtLeastMatchToken chars : tokens } input'
| Just (nextCharacter, leftOver) <- Text.uncons input'
- , patternCharacter == nextCharacter =
- go (matchSymbolToken state{ pattern' = tokens } nextCharacter) leftOver
+ , nextCharacter `elem` chars =
+ go (matchSymbolToken state{ pattern' = OneOfMatchToken chars : tokens } nextCharacter) leftOver
| otherwise = Nothing
-- All tokens are processed, but there is still some input left.
go MatchState{ pattern' = [] } _ = Nothing
@@ -134,7 +136,9 @@ parsePattern input'
Nothing -> []
Just ('d', remaining') -> OneOfMatchToken digits
: parsePattern remaining'
- Just ('.', remaining') -> OneOfMatchToken ('.' : digits)
+ Just ('D', remaining') -> AtLeastMatchToken digits
+ : parsePattern remaining'
+ Just ('.', remaining') -> AtLeastMatchToken ('.' : digits)
: parsePattern remaining'
Just ('\\', remaining') -> SymbolMatchToken '\\'
: parsePattern remaining'
@@ -147,11 +151,11 @@ parsePattern input'
| Just (firstChar, remaining) <- Text.uncons input' =
let token =
case firstChar of
- '*' -> AsteriskMatchToken
+ '*' -> OneOfMatchToken (toEnum <$> [32 .. 127])
'(' -> OpenParenMatchToken
')' -> CloseParenMatchToken
s -> SymbolMatchToken s
- in token : parsePattern remaining
+ in token : parsePattern remaining
| otherwise = []
where
digits = toEnum <$> [fromEnum '0' .. fromEnum '9']