Skip to content

Conversation

@icook
Copy link
Owner

@icook icook commented Dec 17, 2025

Summary

  • Adds validator crate (v0.20) for declarative request validation
  • Creates validation module with custom validators
  • Refactors SignupRequest as proof of concept

Before

// Manual validation with repetitive boilerplate
let username = req.username.trim();
if username.is_empty() {
    return (StatusCode::BAD_REQUEST, Json(ErrorResponse { ... }));
}
if username.len() > 64 {
    return (StatusCode::BAD_REQUEST, Json(ErrorResponse { ... }));
}

After

#[derive(Validate)]
struct SignupRequest {
    #[validate(length(min = 1, max = 64, message = "Username must be 1-64 characters"))]
    username: String,

    #[validate(custom(function = "validate_base64url_ed25519_pubkey"))]
    root_pubkey: String,
}

Test plan

  • Backend tests pass
  • Backend linting passes
  • CI passes

Closes #153

🤖 Generated with Claude Code

Introduces the `validator` crate for declarative request validation:
- Add validation module with custom Ed25519 pubkey validator
- Refactor SignupRequest to use derive macros
- Replace manual validation with #[validate] attributes

Example usage:
```rust
#[derive(Validate)]
struct SignupRequest {
    #[validate(length(min = 1, max = 64))]
    username: String,

    #[validate(custom(function = "validate_base64url_ed25519_pubkey"))]
    root_pubkey: String,
}
```

Closes #153

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
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.

[API] Add validation library for HTTP request payloads

2 participants