1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
use super::util;
struct Context {
needle: String,
}
#[derive(Debug, garde::Validate)]
#[garde(context(Context as ctx))]
struct Test<'a> {
#[garde(custom(custom_validate_fn))]
a: &'a str,
#[garde(custom(|value: &str, ctx: &Context| {
if value != ctx.needle {
return Err(garde::Error::new(format!("`b` is not equal to {}", ctx.needle)));
}
Ok(())
}))]
b: &'a str,
#[garde(inner(custom(custom_validate_fn)))]
inner_a: &'a [&'a str],
#[garde(inner(custom(|value: &str, ctx: &Context| {
if value != ctx.needle {
return Err(garde::Error::new(format!("`b` is not equal to {}", ctx.needle)));
}
Ok(())
})))]
inner_b: &'a [&'a str],
#[garde(length(min = ctx.needle.len()))]
uses_ctx: &'a str,
}
fn custom_validate_fn(value: &str, ctx: &Context) -> Result<(), garde::Error> {
if value != ctx.needle {
return Err(garde::Error::new(format!("not equal to {}", ctx.needle)));
}
Ok(())
}
#[test]
fn custom_valid() {
let ctx = Context {
needle: "test".into(),
};
util::check_ok(
&[Test {
a: "test",
b: "test",
inner_a: &["test"],
inner_b: &["test"],
uses_ctx: "test",
}],
&ctx,
)
}
#[test]
fn custom_invalid() {
let ctx = Context {
needle: "test".into(),
};
util::check_fail!(
&[Test {
a: "asdf",
b: "asdf",
inner_a: &["asdf"],
inner_b: &["asdf"],
uses_ctx: "",
}],
&ctx
)
}
#[derive(Debug, garde::Validate)]
#[garde(context(Context))]
struct Multi<'a> {
#[garde(custom(custom_validate_fn), custom(custom_validate_fn))]
field: &'a str,
#[garde(inner(custom(custom_validate_fn), custom(custom_validate_fn)))]
inner: &'a [&'a str],
}
#[test]
fn multi_custom_valid() {
let ctx = Context {
needle: "test".into(),
};
util::check_ok(
&[Multi {
field: "test",
inner: &["test"],
}],
&ctx,
)
}
#[test]
fn multi_custom_invalid() {
let ctx = Context {
needle: "test".into(),
};
util::check_fail!(
&[Multi {
field: "asdf",
inner: &["asdf"]
}],
&ctx
)
}
|