#[macro_export]
macro_rules! get_or_err {
($this:ident, $key:expr, $err:expr, $msg:expr) => {{
$this
.get_model()
.get_model()
.get($key)
.ok_or_else(|| {
$crate::error::Error::from($err(format!(
"Missing {} definition in conf file",
$msg
)))
})?
.get($key)
.ok_or_else(|| {
$crate::error::Error::from($err(format!(
"Missing {} section in conf file",
$msg
)))
})?
}};
}
#[macro_export]
macro_rules! get_or_err_with_context {
($this:ident, $key:expr, $ctx:expr, $err:expr, $msg:expr) => {{
$this
.get_model()
.get_model()
.get($key)
.ok_or_else(|| {
$crate::error::Error::from($err(format!(
"Missing {} definition in conf file",
$msg
)))
})?
.get($ctx)
.ok_or_else(|| {
$crate::error::Error::from($err(format!(
"Missing {} section in conf file",
$msg
)))
})?
}};
}
#[macro_export]
macro_rules! register_g_function {
($enforcer:ident, $fname:ident, $ast:ident) => {{
let rm = Arc::clone(&$enforcer.rm);
let count = $ast.value.matches('_').count();
if count == 2 {
$enforcer.engine.register_fn(
$fname,
move |arg1: ImmutableString, arg2: ImmutableString| {
rm.read().has_link(&arg1, &arg2, None)
},
);
} else if count == 3 {
$enforcer.engine.register_fn(
$fname,
move |arg1: ImmutableString,
arg2: ImmutableString,
arg3: ImmutableString| {
rm.read().has_link(&arg1, &arg2, Some(&arg3))
},
);
} else {
return Err(ModelError::P(
r#"the number of "_" in role definition should be at least 2"#
.to_owned(),
)
.into());
}
}};
}
#[macro_export]
macro_rules! push_index_if_explain {
($this:ident) => {{
#[cfg(feature = "explain")]
if $this.cap > 0 {
$this.expl.push($this.idx);
}
}};
}