diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-24 14:38:16 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-27 19:26:34 +0100 |
| commit | cc9a4c34e2fdf7555c03e98f3d038b43ba12ddc0 (patch) | |
| tree | 2e39c1133572f91cf3518976fc8ddcdb163ad352 /src/Expression.hs | |
| parent | 22c0e278280d4c391d9a922978007f7e7bca0ac6 (diff) | |
Accept range as ‘watch’ argument within range expressions
Diffstat (limited to 'src/Expression.hs')
| -rw-r--r-- | src/Expression.hs | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/src/Expression.hs b/src/Expression.hs index 2bd33de..4ff7ddd 100644 --- a/src/Expression.hs +++ b/src/Expression.hs @@ -59,6 +59,12 @@ data RevisionExpression' d type RevisionExpression = RevisionExpression' Evaluated type DeclaredRevisionExpression = RevisionExpression' Declared +watchedRevision :: DeclaredRevisionExpression -> DeclaredRevisionExpression +watchedRevision = \case + StaticRef r -> WatchedRef r + WatchedRef r -> WatchedRef r + ModifiedRevision m r -> ModifiedRevision m (watchedRevision r) + data RangeExpression' d = SingleRevisionExpression (RevisionExpression' d) @@ -67,6 +73,11 @@ data RangeExpression' d type RangeExpression = RangeExpression' Evaluated type DeclaredRangeExpression = RangeExpression' Declared +watchedRange :: DeclaredRangeExpression -> DeclaredRangeExpression +watchedRange = \case + SingleRevisionExpression rev -> SingleRevisionExpression (watchedRevision rev) + RangeExpression r1 r2 -> RangeExpression (watchedRevision r1) (watchedRevision r2) + data CommitRef = CommitRef Text {- suffix -} CommitId deriving (Eq) @@ -168,43 +179,48 @@ parseRangeExpression = bimap errorBundlePretty id . runParser parser "" where parser :: ExprParser DeclaredRangeExpression parser = do - rev1 <- parseRevision - expr <- choice + range <- parseRange + eof + return range + + parseRange :: ExprParser DeclaredRangeExpression + parseRange = do + range <- parseRevision + choice [ do + SingleRevisionExpression rev1 <- return range _ <- string ".." - rev2 <- parseRevision + SingleRevisionExpression rev2 <- parseRevision return $ RangeExpression rev2 rev1 , do - return $ SingleRevisionExpression rev1 + return range ] - eof - return expr - - parseRevision :: ExprParser DeclaredRevisionExpression + parseRevision :: ExprParser DeclaredRangeExpression parseRevision = do tok <- fmap T.concat $ some $ choice [ takeWhile1P Nothing (\x -> isAlphaNum x || x `elem` [ '_', '-', '/' ]) , try $ string "." <* notFollowedBy (char '.') ] - rev <- choice + range <- choice [ do _ <- char '(' - arg <- takeWhileP Nothing (\x -> isAlphaNum x || x `elem` [ '_', '-', '/', '.' ]) + arg <- parseRange _ <- char ')' case tok of - "watch" -> return $ WatchedRef arg + "watch" -> return $ watchedRange arg _ -> unexpected $ Tokens $ NE.fromList $ chunkToTokens @Text Proxy tok , do - return $ StaticRef tok + return $ SingleRevisionExpression $ StaticRef tok ] choice [ do + SingleRevisionExpression rev <- return range suffix <- takeWhile1P Nothing (\x -> isNumber x || x `elem` [ '~', '^', '@', '{', '}' ]) - return $ ModifiedRevision suffix rev + return $ SingleRevisionExpression $ ModifiedRevision suffix rev , do - return rev + return range ] |