Rule keyword

The purpose of the Rule keyword is to represent a business rule that should be implemented. It provides additional information for a feature. A Rule is used to group together several scenarios belonging to the business rule. A Rule should contain one or more scenarios illustrating the particular rule.

No additional work is required on the implementation side to support Rules.

Feature: Animal feature
  Rule: Hungry cat becomes satiated
    Scenario: If we feed a hungry cat it will no longer be hungry
      Given a hungry cat
      When I feed the cat
      Then the cat is not hungry
  Rule: Satiated cat remains the same
    Scenario: If we feed a satiated cat it will not become hungry
      Given a satiated cat
      When I feed the cat
      Then the cat is not hungry
extern crate cucumber;
extern crate tokio;

use std::time::Duration;

use cucumber::{given, then, when, World};
use tokio::time::sleep;

#[derive(Debug, Default)]
struct Cat {
    pub hungry: bool,

impl Cat {
    fn feed(&mut self) {
        self.hungry = false;

#[derive(Debug, Default, World)]
pub struct AnimalWorld {
    cat: Cat,

#[given(regex = r"^a (hungry|satiated) cat$")]
async fn hungry_cat(world: &mut AnimalWorld, state: String) {

    match state.as_str() {
        "hungry" => = true,
        "satiated" => = false,
        _ => unreachable!(),

#[when("I feed the cat")]
async fn feed_cat(world: &mut AnimalWorld) {

#[then("the cat is not hungry")]
async fn cat_is_fed(world: &mut AnimalWorld) {


async fn main() {