def challenge_state()

in source/backend/chalicelib/framework.py [0:0]


def challenge_state(challenge_type, first=False, next_state=_FAIL_STATE, timeout=10):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(challenge, frame, context, end_times):
            check_state_timeout(func, end_times, frame, timeout)
            res = run_state_processing_function(func, challenge, context, frame)
            blueprint.log.debug('res: %s', res)
            # Check result
            if res == STATE_CONTINUE:
                return wrapper
            if res == STATE_NEXT:
                return _challenge_state_funcs[challenge_type][next_state]
            if res == CHALLENGE_SUCCESS:
                raise _Success
            if res == CHALLENGE_FAIL:
                raise _Fail

        # Register challenge type (if not yet)
        if challenge_type not in _challenge_types:
            _challenge_types.append(challenge_type)
        # Create challenge type's state list with default fail state (if not yet)
        if challenge_type not in _challenge_state_funcs:
            _challenge_state_funcs[challenge_type] = dict()
            _challenge_state_funcs[challenge_type][_FAIL_STATE] = lambda: CHALLENGE_FAIL
        # Register state for challenge type
        _challenge_state_funcs[challenge_type][func.__name__] = wrapper
        # Register as fist state (if first is true)
        if first:
            _challenge_state_funcs[challenge_type][_FIRST_STATE] = wrapper
        return wrapper

    return decorator