Skip to content

Comments

docs: enhance learning path and add custom validation recipe#135

Open
Tuntii wants to merge 1 commit intomainfrom
docs/learning-path-and-validation-11704321007872420411
Open

docs: enhance learning path and add custom validation recipe#135
Tuntii wants to merge 1 commit intomainfrom
docs/learning-path-and-validation-11704321007872420411

Conversation

@Tuntii
Copy link
Owner

@Tuntii Tuntii commented Feb 24, 2026

This PR enhances the RustAPI documentation as part of the continuous improvement cycle.

Changes:

  1. Learning Path: The curriculum now includes explicit step-by-step tasks for each module and more comprehensive "Knowledge Check" questions to aid learning.
  2. New Recipe: Added a detailed guide on "Custom Validation" (custom_validation.md), explaining how to implement both synchronous and asynchronous custom validators using rustapi-validate.
  3. Cookbook Structure: Exposed previously unlisted recipes for "CI Simulation" and "Maintenance & Quality" in the Cookbook summary.
  4. Agent State: Updated coverage maps and run logs.

No code changes were made to the crates.


PR created automatically by Jules for task 11704321007872420411 started by @Tuntii

- Updated `docs/cookbook/src/learning/curriculum.md` with explicit tasks and more knowledge check questions.
- Created `docs/cookbook/src/recipes/custom_validation.md` covering synchronous and asynchronous custom validation.
- Updated `docs/cookbook/src/SUMMARY.md` and `docs/cookbook/src/recipes/README.md` to include the new recipe and previously unlisted recipes (CI Simulation, Maintenance).
- Updated `docs/.agent/docs_coverage.md` and `docs/.agent/last_run.json`.
- Created `docs/.agent/run_report_2026-02-24.md`.
Copilot AI review requested due to automatic review settings February 24, 2026 03:53
@google-labs-jules
Copy link
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances the RustAPI documentation by improving the learning curriculum and adding a new validation recipe. The curriculum now includes explicit numbered tasks and expanded knowledge checks for better learner engagement. The PR also exposes previously unlisted recipes (CI Simulation and Maintenance & Quality) in the cookbook's table of contents.

Changes:

  • Enhanced curriculum with step-by-step tasks and additional knowledge check questions across all modules
  • Added a new "Custom Validation" recipe documenting async custom validators
  • Updated cookbook structure to include previously unlisted recipes

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
docs/cookbook/src/recipes/custom_validation.md New recipe documenting custom validation (contains critical bug - documents non-existent synchronous custom validator)
docs/cookbook/src/recipes/README.md Added Custom Validation, OAuth2 Client, Advanced Middleware, Audit Logging, CI Simulation, and Maintenance recipes to TOC
docs/cookbook/src/learning/curriculum.md Enhanced all modules with numbered tasks and expanded knowledge checks
docs/cookbook/src/SUMMARY.md Added Custom Validation, CI Simulation, and Maintenance & Quality to recipes section
docs/.agent/run_report_2026-02-24.md Agent run report documenting the changes made
docs/.agent/last_run.json Updated last run metadata
docs/.agent/docs_coverage.md Added Custom Validation entry and updated status for other features

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.


- **Performance**: Async validators are only run if synchronous validators pass.
- **Context**: The `ValidationContext` is key for dependency injection. It allows your validators to remain pure and testable while still having access to the outside world.
- **Error Messages**: You can override the default error message in the attribute: `#[validate(custom = "my_func", message = "Bad value")]`.
Copy link

Copilot AI Feb 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The mention of custom attribute in the error message override example is inconsistent with the codebase. Only custom_async is supported. This line should either say custom_async or be removed entirely since the synchronous custom validator feature does not exist.

Suggested change
- **Error Messages**: You can override the default error message in the attribute: `#[validate(custom = "my_func", message = "Bad value")]`.
- **Error Messages**: You can override the default error message in the attribute: `#[validate(custom_async = "my_func", message = "Bad value")]`.

Copilot uses AI. Check for mistakes.
| **Validation** | | | |
| Sync Validation | `docs/cookbook/src/crates/rustapi_validate.md` | `rustapi-validate/src/lib.rs` (`Validate`) | OK |
| Async Validation | `docs/cookbook/src/crates/rustapi_validate.md` | `rustapi-validate/src/v2/mod.rs` (`AsyncValidate`) | OK |
| Custom Validation | `recipes/custom_validation.md` | `rustapi-validate/src/custom.rs` | OK |
Copy link

Copilot AI Feb 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The coverage map entry for Custom Validation incorrectly references rustapi-validate/src/custom.rs as the source. While this file exists, it provides a programmatic Validator builder API that is not integrated with the #[derive(Validate)] macro. The actual source for custom validation is custom_async support in rustapi-macros/src/lib.rs (lines 1426-1460) which only supports async custom validators. Since the recipe incorrectly documents synchronous custom validators that don't exist, this coverage entry is misleading.

Suggested change
| Custom Validation | `recipes/custom_validation.md` | `rustapi-validate/src/custom.rs` | OK |
| Custom Validation | `recipes/custom_validation.md` | `rustapi-macros/src/lib.rs` (`custom_async`) | Needs Update |

Copilot uses AI. Check for mistakes.
Comment on lines +8 to +38
## Solution: Synchronous Custom Validators

For logic that doesn't require async operations (like comparing two fields or checking a format), use `custom`.

### 1. Define the Validator Function
The function must have the signature `fn(&T) -> Result<(), ValidationError>`.

```rust
use rustapi_validate::ValidationError;

fn validate_no_spaces(username: &str) -> Result<(), ValidationError> {
if username.contains(' ') {
return Err(ValidationError::new("username_spaces"));
}
Ok(())
}
```

### 2. Apply it to the Struct

```rust
use rustapi_macros::Validate;
use serde::Deserialize;

#[derive(Debug, Deserialize, Validate)]
pub struct SignupRequest {
#[validate(custom = "validate_no_spaces")]
pub username: String,
}
```

Copy link

Copilot AI Feb 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The synchronous custom validator attribute documented here does not exist in the codebase. The Validate derive macro only supports custom_async for custom validators (as seen in crates/rustapi-macros/src/lib.rs lines 1426-1460 and 1475-1479). There is no custom rule type in the synchronous validation logic (lines 1083-1315).

The custom.rs module provides a programmatic Validator builder API, but it's not integrated with the #[derive(Validate)] macro and cannot be used with the #[validate(custom = "...")] attribute syntax shown in this recipe.

Either this feature needs to be implemented first, or this section should be removed and the recipe should focus only on custom_async validators.

Suggested change
## Solution: Synchronous Custom Validators
For logic that doesn't require async operations (like comparing two fields or checking a format), use `custom`.
### 1. Define the Validator Function
The function must have the signature `fn(&T) -> Result<(), ValidationError>`.
```rust
use rustapi_validate::ValidationError;
fn validate_no_spaces(username: &str) -> Result<(), ValidationError> {
if username.contains(' ') {
return Err(ValidationError::new("username_spaces"));
}
Ok(())
}
```
### 2. Apply it to the Struct
```rust
use rustapi_macros::Validate;
use serde::Deserialize;
#[derive(Debug, Deserialize, Validate)]
pub struct SignupRequest {
#[validate(custom = "validate_no_spaces")]
pub username: String,
}
```
## Synchronous Custom Validators
At the moment, the `#[derive(Validate)]` macro only supports custom validators via the `custom_async` attribute.
Synchronous custom rules (for example, `fn(&T) -> Result<(), ValidationError>`) can be implemented using the
programmatic validator builder API, but they are **not** available through `#[validate(custom = \"...\")]` on
struct fields yet.
When you need custom validation for derived types, use `custom_async` as shown below.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant