Passed
Push — master ( ead53e...a631b0 )
by Max
42s
created

structured_data._processors   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 51
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 38
dl 0
loc 51
rs 10
c 0
b 0
f 0
wmc 11

3 Functions

Rating   Name   Duplication   Size   Complexity  
A as_pattern_processor() 0 9 2
A enum_processor() 0 6 2
A tuple_processor() 0 7 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A ProcessorList.__init__() 0 2 1
A ProcessorList.get_processor() 0 5 3
1
from ._enum_constructor import EnumConstructor
2
from ._match_failure import MatchFailure
3
from ._patterns import AsPattern
4
from ._unpack import unpack
5
6
7
def as_pattern_processor(target):
8
    def processor(value):
9
        if target is value:
10
            yield target.match
11
            yield target.matcher
12
        else:
13
            yield value
14
            yield value
15
    return processor
16
17
18
def enum_processor(target):
19
    def processor(value):
20
        if value.__class__ is not target.__class__:
21
            raise MatchFailure
22
        yield from reversed(unpack(value))
23
    return processor
24
25
26
def tuple_processor(target):
27
    def processor(value):
28
        if isinstance(value, target.__class__) and len(target) == len(value):
29
            yield from reversed(value)
30
        else:
31
            raise MatchFailure
32
    return processor
33
34
35
class ProcessorList:
36
37
    def __init__(self, processors=()):
38
        self.processors = list(processors)
39
40
    def get_processor(self, item):
41
        for typ, meta_processor in self.processors:
42
            if isinstance(item, typ):
43
                return meta_processor(item)
44
        return None
45
46
47
PROCESSORS = ProcessorList((
48
    (AsPattern, as_pattern_processor),
49
    (EnumConstructor, enum_processor),
50
    (tuple, tuple_processor),
51
))
52