aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/transform_fallback.py
blob: 22c3d744d19845f623e9414382546d6cc30d999e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/python
"""
Applies the 'fallback' transformation to Noise patterns.

Authors:
    Rhys Weatherley <rhys.weatherley@gmail.com>

This script is placed into the public domain.
"""

import sys
from noise_patterns import *

def combine(list1, list2):
    result = list(list1)
    for elem in list2:
        if not elem in list1:
            result.append(elem)
    return result

def make_fallback(orig):
    pattern = Pattern()
    pattern.name = orig.name
    pattern.addTransformation('fallback')
    direction, first_message = orig.messages[0]
    pattern.parameters = combine(first_message, orig.parameters)
    pattern.initiator_premessage = first_message + orig.initiator_premessage
    pattern.responder_premessage = list(orig.responder_premessage)
    pattern.messages = []
    for direction, message in orig.messages[1:]:
        pattern.messages.append((direction, list(message)))
    return pattern

def fallback_compatible(pattern):
    direction, messages = pattern.messages[0];
    if direction != '->':
        return False
    if messages == ['e'] or messages == ['e', 's']:
        return True
    return False

if len(sys.argv) <= 1:
    print "Usage: " + sys.argv[0] + " file ..."
    sys.exit(1)

for file in sys.argv[1:]:
    patterns = loadPatterns(file)
    for pattern in patterns:
        if not pattern.isInteractive():
            # Only interactive patterns can be fallback.
            continue
        if 'fallback' in pattern.transformations():
            # The pattern is already fallback.
            continue
        if not fallback_compatible(pattern):
            # The first message is not fallback-compatible.
            continue
        fallback = make_fallback(pattern)
        print fallback

sys.exit(0)