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 ) }