1# --------------------------------------------------------------------------------------------
2# Copyright (c) Microsoft Corporation. All rights reserved.
3# Licensed under the MIT License. See License.txt in the project root for license information.
4# --------------------------------------------------------------------------------------------
5
6import argparse
7from knack.util import CLIError
8
9from azure.mgmt.eventgrid.models import (
10    NumberGreaterThanAdvancedFilter,
11    NumberGreaterThanOrEqualsAdvancedFilter,
12    NumberInAdvancedFilter,
13    NumberLessThanAdvancedFilter,
14    NumberLessThanOrEqualsAdvancedFilter,
15    NumberNotInAdvancedFilter,
16    StringBeginsWithAdvancedFilter,
17    StringContainsAdvancedFilter,
18    StringEndsWithAdvancedFilter,
19    StringInAdvancedFilter,
20    StringNotInAdvancedFilter,
21    BoolEqualsAdvancedFilter)
22
23NUMBERIN = "NumberIn"
24NUMBERNOTIN = "NumberNotIn"
25STRINGIN = "StringIn"
26STRINGNOTIN = "StringNotIn"
27STRINGBEGINSWITH = "StringBeginsWith"
28STRINGCONTAINS = "StringContains"
29STRINGENDSWITH = "StringEndsWith"
30NUMBERGREATERTHAN = "NumberGreaterThan"
31NUMBERGREATERTHANOREQUALS = "NumberGreaterThanOrEquals"
32NUMBERLESSTHAN = "NumberLessThan"
33NUMBERLESSTHANOREQUALS = "NumberLessThanOrEquals"
34BOOLEQUALS = "BoolEquals"
35
36
37# pylint: disable=protected-access
38# pylint: disable=too-few-public-methods
39class EventChannelAddFilter(argparse._AppendAction):
40    def __call__(self, parser, namespace, values, option_string=None):
41        if len(values) < 3:
42            raise CLIError('usage error: --publisher-filter KEY[.INNERKEY] FILTEROPERATOR VALUE [VALUE ...]')
43
44        key = values[0]
45        operator = values[1]
46
47# operators that support single value
48        if operator.lower() == NUMBERLESSTHAN.lower():
49            _validate_only_single_value_is_specified(NUMBERLESSTHAN, values)
50            publisher_filter = NumberLessThanAdvancedFilter(key=key, value=float(values[2]))
51        elif operator.lower() == NUMBERLESSTHANOREQUALS.lower():
52            _validate_only_single_value_is_specified(NUMBERLESSTHANOREQUALS, values)
53            publisher_filter = NumberLessThanOrEqualsAdvancedFilter(key=key, value=float(values[2]))
54        elif operator.lower() == NUMBERGREATERTHAN.lower():
55            _validate_only_single_value_is_specified(NUMBERGREATERTHAN, values)
56            publisher_filter = NumberGreaterThanAdvancedFilter(key=key, value=float(values[2]))
57        elif operator.lower() == NUMBERGREATERTHANOREQUALS.lower():
58            _validate_only_single_value_is_specified(NUMBERGREATERTHANOREQUALS, values)
59            publisher_filter = NumberGreaterThanOrEqualsAdvancedFilter(key=key, value=float(values[2]))
60        elif operator.lower() == BOOLEQUALS.lower():
61            _validate_only_single_value_is_specified(BOOLEQUALS, values)
62            publisher_filter = BoolEqualsAdvancedFilter(key=key, value=bool(values[2]))
63
64# operators that support multiple values
65        elif operator.lower() == NUMBERIN.lower():
66            float_values = [float(i) for i in values[2:]]
67            publisher_filter = NumberInAdvancedFilter(key=key, values=float_values)
68        elif operator.lower() == NUMBERNOTIN.lower():
69            float_values = [float(i) for i in values[2:]]
70            publisher_filter = NumberNotInAdvancedFilter(key=key, values=float_values)
71        elif operator.lower() == STRINGIN.lower():
72            publisher_filter = StringInAdvancedFilter(key=key, values=values[2:])
73        elif operator.lower() == STRINGNOTIN.lower():
74            publisher_filter = StringNotInAdvancedFilter(key=key, values=values[2:])
75        elif operator.lower() == STRINGBEGINSWITH.lower():
76            publisher_filter = StringBeginsWithAdvancedFilter(key=key, values=values[2:])
77        elif operator.lower() == STRINGENDSWITH.lower():
78            publisher_filter = StringEndsWithAdvancedFilter(key=key, values=values[2:])
79        elif operator.lower() == STRINGCONTAINS.lower():
80            publisher_filter = StringContainsAdvancedFilter(key=key, values=values[2:])
81        else:
82            raise CLIError("--publisher-filter: The specified filter operator '{}' is not"
83                           " a valid operator. Supported values are ".format(operator) +
84                           NUMBERIN + "," + NUMBERNOTIN + "," + STRINGIN + "," +
85                           STRINGNOTIN + "," + STRINGBEGINSWITH + "," +
86                           STRINGCONTAINS + "," + STRINGENDSWITH + "," +
87                           NUMBERGREATERTHAN + "," + NUMBERGREATERTHANOREQUALS + "," +
88                           NUMBERLESSTHAN + "," + NUMBERLESSTHANOREQUALS + "," + BOOLEQUALS + ".")
89        if namespace.publisher_filter is None:
90            namespace.publisher_filter = []
91        namespace.publisher_filter.append(publisher_filter)
92
93
94def _validate_only_single_value_is_specified(operator_type, values):
95    if len(values) != 3:
96        raise CLIError("--publisher-filter: For '{}' operator, only one filter value "
97                       "must be specified.".format(operator_type))
98