ui: add isEqual field to Matcher

Signed-off-by: Kiril Vladimirov <kiril@vladimiroff.org>
This commit is contained in:
Kiril Vladimirov 2021-01-08 15:48:51 +02:00
parent 84dd6ab8d7
commit 740a97345f
9 changed files with 100 additions and 31 deletions

File diff suppressed because one or more lines are too long

View File

@ -22,6 +22,7 @@ type alias Matcher =
{ name : String
, value : String
, isRegex : Bool
, isEqual : Maybe Bool
}
@ -31,6 +32,7 @@ decoder =
|> required "name" Decode.string
|> required "value" Decode.string
|> required "isRegex" Decode.bool
|> optional "isEqual" (Decode.nullable Decode.bool) (Just True)
encoder : Matcher -> Encode.Value
@ -39,4 +41,5 @@ encoder model =
[ ( "name", Encode.string model.name )
, ( "value", Encode.string model.value )
, ( "isRegex", Encode.bool model.isRegex )
, ( "isEqual", Maybe.withDefault Encode.null (Maybe.map Encode.bool model.isEqual) )
]

View File

@ -35,7 +35,7 @@ nullMatchers =
nullMatcher : Matcher
nullMatcher =
Matcher "" "" False
Matcher "" "" False (Just True)
stateToString : State -> String

View File

@ -142,15 +142,32 @@ type alias Matcher =
convertAPIMatcher : Data.Matcher.Matcher -> Matcher
convertAPIMatcher { name, value, isRegex } =
{ key = name
, value = value
, op =
if isRegex then
convertAPIMatcher { name, value, isRegex, isEqual } =
let
isEqualValue =
case isEqual of
Nothing ->
True
Just justIsEqual ->
justIsEqual
op =
if not isRegex && isEqualValue then
Eq
else if not isRegex && not isEqualValue then
NotEq
else if isRegex && isEqualValue then
RegexMatch
else
Eq
NotRegexMatch
in
{ key = name
, value = value
, op = op
}
@ -238,7 +255,8 @@ convertFilterMatcher : Matcher -> Data.Matcher.Matcher
convertFilterMatcher { key, op, value } =
{ name = key
, value = value
, isRegex = op == RegexMatch
, isRegex = (op == RegexMatch) || (op == NotRegexMatch)
, isEqual = Just ((op == Eq) || (op == RegexMatch))
}

View File

@ -52,12 +52,26 @@ replaceIndex index replacement list =
mstring : Matcher -> String
mstring m =
let
isEqual =
case m.isEqual of
Nothing ->
True
Just value ->
value
sep =
if m.isRegex then
if not m.isRegex && isEqual then
"="
else if not m.isRegex && not isEqual then
"!="
else if m.isRegex && isEqual then
"=~"
else
"="
"!~"
in
String.join sep [ m.name, m.value ]

View File

@ -12,6 +12,7 @@ type ApiData a
type alias Matcher =
{ isRegex : Bool
, isEqual : Maybe Bool
, name : String
, value : String
}

View File

@ -39,14 +39,28 @@ newSilenceFromMatchers : List Data.Matcher.Matcher -> String
newSilenceFromMatchers matchers =
matchers
|> List.map
(\{ name, value, isRegex } ->
(\{ name, value, isRegex, isEqual } ->
let
isEqualValue =
case isEqual of
Nothing ->
True
Just justIsEqual ->
justIsEqual
op =
if isRegex then
if not isRegex && isEqualValue then
Utils.Filter.Eq
else if not isRegex && not isEqualValue then
Utils.Filter.NotEq
else if isRegex && isEqualValue then
Utils.Filter.RegexMatch
else
Utils.Filter.Eq
Utils.Filter.NotRegexMatch
in
Utils.Filter.Matcher name op value
)

View File

@ -62,6 +62,7 @@ type alias MatcherForm =
{ name : ValidatedField
, value : ValidatedField
, isRegex : Bool
, isEqual : Maybe Bool
}
@ -183,10 +184,11 @@ parseEndsAt startsAt endsAt =
validateMatcherForm : MatcherForm -> MatcherForm
validateMatcherForm { name, value, isRegex } =
validateMatcherForm { name, value, isRegex, isEqual } =
{ name = validate stringNotEmpty name
, value = value
, isRegex = isRegex
, isEqual = isEqual
}
@ -207,6 +209,7 @@ empty =
emptyMatcher : MatcherForm
emptyMatcher =
{ isRegex = False
, isEqual = Just True
, name = initialField ""
, value = initialField ""
}
@ -239,31 +242,33 @@ fromMatchersAndCommentAndTime defaultCreator matchers comment now =
appendMatcher : MatcherForm -> Result String (List Matcher) -> Result String (List Matcher)
appendMatcher { isRegex, name, value } =
appendMatcher { isRegex, isEqual, name, value } =
Result.map2 (::)
(Result.map2 (\k v -> Matcher k v isRegex) (stringNotEmpty name.value) (Ok value.value))
(Result.map2 (\k v -> Matcher k v isRegex isEqual) (stringNotEmpty name.value) (Ok value.value))
filterMatcherToMatcher : Utils.Filter.Matcher -> Maybe Matcher
filterMatcherToMatcher { key, op, value } =
Maybe.map (\operator -> Matcher key value operator) <|
case op of
Utils.Filter.Eq ->
Just False
Maybe.map2 (\isRegex isEqual -> Matcher key value isRegex isEqual) (Just False) (Just (Just True))
Utils.Filter.RegexMatch ->
Just True
Maybe.map2 (\isRegex isEqual -> Matcher key value isRegex isEqual) (Just True) (Just (Just True))
-- we don't support negative matchers
_ ->
Nothing
Utils.Filter.NotRegexMatch ->
Maybe.map2 (\isRegex isEqual -> Matcher key value isRegex isEqual) (Just True) (Just (Just False))
Utils.Filter.NotEq ->
Maybe.map2 (\isRegex isEqual -> Matcher key value isRegex isEqual) (Just False) (Just (Just False))
fromMatcher : Matcher -> MatcherForm
fromMatcher { name, value, isRegex } =
fromMatcher { name, value, isRegex, isEqual } =
{ name = initialField name
, value = initialField value
, isRegex = isRegex
, isEqual = isEqual
}

View File

@ -78,12 +78,26 @@ dateView string time =
matcherButton : Matcher -> Html Msg
matcherButton matcher =
let
isEqual =
case matcher.isEqual of
Nothing ->
True
Just value ->
value
op =
if matcher.isRegex then
if not matcher.isRegex && isEqual then
Utils.Filter.Eq
else if not matcher.isRegex && not isEqual then
Utils.Filter.NotEq
else if matcher.isRegex && isEqual then
Utils.Filter.RegexMatch
else
Utils.Filter.Eq
Utils.Filter.NotRegexMatch
msg =
FilterBarTypes.AddFilterMatcher False