#![doc(html_root_url = "https://acmcarther.github.io/cucumber-rs/")]
#![cfg_attr(nightly, feature(custom_derive, plugin))]
#![cfg_attr(nightly, plugin(serde_macros))]
extern crate regex;
extern crate itertools;
extern crate serde;
extern crate serde_json;
pub mod state;
pub mod server;
pub mod runner;
pub mod definitions;
pub mod event;
pub mod cucumber_regex;
mod launcher;
pub use launcher::{
start,
start_with_addr,
ruby_command
};
pub use runner::{WorldRunner, CommandRunner};
pub use definitions::registration::CucumberRegistrar;
pub use state::{Cucumber, SendableStep};
pub use server::Server;
pub use event::request::InvokeArgument;
pub use event::response::InvokeResponse;
#[macro_export]
macro_rules! try_destructure {
($r: ident) => ({
use $crate::event::response::InvokeResponse;
use $crate::definitions::destructuring::{DestructurableSet, InvokeArgSetError};
match $r.destructure_set() {
Ok(e) => e,
Err(error) => {
match error {
InvokeArgSetError::TypeMismatch {arg_idx} => {
return InvokeResponse::fail_from_str(&format!("Argument in position [{}] did not have the correct type or was unparseable", arg_idx))
},
InvokeArgSetError::ArgCountMismatch {expected, actual} => {
return InvokeResponse::fail_from_str(&format!("Expected [{}] arguments, but found [{}] in step definition", expected, actual))
}
}
}
}
})
}
#[macro_export]
macro_rules! Given {
($cuke:expr, $regex:expr, $body:expr) => {{
use $crate::cucumber_regex;
$cuke.given(file!(), line!(), cucumber_regex::build($regex), Box::new(move |cuke, world, args| {
($body)(cuke, world, try_destructure!(args))
}))
}}
}
#[macro_export]
macro_rules! When {
($cuke:expr, $regex:expr, $body:expr) => {{
use $crate::cucumber_regex;
$cuke.when(file!(), line!(), cucumber_regex::build($regex), Box::new(move |cuke, world, args| {
($body)(cuke, world, try_destructure!(args))
}))
}}
}
#[macro_export]
macro_rules! Then {
($cuke:expr, $regex:expr, $body:expr) => {{
use $crate::cucumber_regex;
$cuke.then(file!(), line!(), cucumber_regex::build($regex), Box::new(move |cuke, world, args| {
($body)(cuke, world, try_destructure!(args))
}))
}}
}