def last_element(self, field, rule):
    """Check rule for last message of a repeated field.

    :param field: Field to which the rule needs to comply
    :param rule: dictionary of rules to be checked for the last message
                   (mapping)
    """
    statement_true = True
    nested_fields_rules = rule.params

    # Convert parsed yaml file to dictonary rules
    nested_fields_rules_list = []
    for key_field, nested_rule in nested_fields_rules.items():
        nested_rule[0].update({"target": "this." + key_field})
        nested_fields_rules_list.append(nested_rule[0])

    rules_checker_list = []
    for nested_fields_rule in nested_fields_rules_list:
        statement_rule = Rule(
            dictionary=nested_fields_rule,
            field_name=rule.field_name,
            severity=Severity.ERROR,
        )
        statement_rule.path = rule.path.child_path(statement_rule.verb)
        statement_true = self.check_rule(field[-1],
                                         statement_rule) and statement_true
        rules_checker_list.append(statement_true)

    return all(rules_checker_list)
def check_if(self, field, rule):
    """
    Evaluate rules if some statements are verified:

    :param params: statements
    :param extra_params: `do_check`: rules to validate if statements are true

    Structure:

    a_field:
    - check_if:
    {params: statements}
    do_check:
    {extra_params: rules to validate if statements are true}


    Example:

    a_field:
    - check_if:
    - is_set: # Statements
    target: parent.environment.temperature
    - another_statement: statement parameter
    do_check: # Check that will be performed only if the statements are True
    - is_less_than_or_equal_to: 0.5
    - is_greater_than_or_equal_to: 0

    """
    statements = rule.params
    do_checks = rule.extra_params["do_check"]
    statement_true = True

    # Check if all the statements are true
    for statement in statements:
        statement_rule = Rule(dictionary=statement,
                              field_name=rule.field_name,
                              severity=Severity.INFO)
        statement_rule.path = rule.path.child_path(statement_rule.verb)
        statement_true = self.check_rule(field,
                                         statement_rule) and statement_true

    # If the statements are true, check the do_check rules
    if not statement_true:
        return True

    return all((self.check_rule(
        field,
        Rule(
            path=rule.path.child_path(next(iter(check.keys()))),
            dictionary=check,
            field_name=rule.field_name,
        ),
    ) for check in do_checks))