masayuki-kono

rust-code-quality-guide

0
0
# Install this skill:
npx skills add masayuki-kono/agent-skills --skill "rust-code-quality-guide"

Install specific skill from multi-skill repository

# Description

Code quality guide for Rust. USE WHEN: writing Rust code, reviewing code, or ensuring code quality.

# SKILL.md


name: rust-code-quality-guide
description: "Code quality guide for Rust. USE WHEN: writing Rust code, reviewing code, or ensuring code quality."
license: MIT
metadata:
author: masayuki-kono
version: "1.0.0"


Rust Code Quality Guide

When to Use

  • Writing new Rust code that requires type conversions or error handling
  • Reviewing Rust code for quality issues
  • Ensuring code follows best practices for error messages and Clippy compliance
  • Fixing Clippy warnings or understanding why certain patterns are discouraged

Quick Reference

  • as casting β†’ try_from() + map_err()
  • unwrap_or(default) β†’ map_err() with explicit error
  • format! β†’ use inline arguments {var}
  • Error messages must include the causative value
  • #[allow(clippy::...)] only allowed in test code

Code Quality Rules

No Fallback for Type Conversion

CRITICAL: Never use unwrap_or(MAX_VALUE) or similar fallback methods for type conversions.

// ❌ DANGEROUS - Silent failure with wrong value
let offset = u16::try_from(offset_value).unwrap_or(u16::MAX);

// ❌ DANGEROUS - Silent failure with wrong value (negative to zero)
let value_u8 = u8::try_from(value.max(0))
    .map_err(|_| "value exceeds u8::MAX")?;

// ❌ DANGEROUS - Silent failure with wrong value
let value = u8::try_from(negative_value).unwrap_or(0);

// βœ… SAFE - Explicit error handling
let offset = u16::try_from(offset_value)
    .map_err(|_| format!("offset {offset_value} exceeds u16::MAX"))?;

// βœ… SAFE - Explicit error handling (negative values cause error)
let value_u8 = u8::try_from(value)
    .map_err(|_| format!("value {value} must be between 0 and 255"))?;

Reason: Using unwrap_or(MAX_VALUE), max(0), unwrap_or(0), or similar fallback methods can cause severe issues by silently mapping out-of-range or invalid values to default values, leading to incorrect calculations and potential system failures.

Rule: Always use proper error handling with map_err or explicit match statements for type conversions. Never silently convert invalid values (negative, out-of-range, etc.) to default values.

Inline Format Arguments

CRITICAL: Always use inline format arguments in format! macro to avoid Clippy warnings.

// ❌ BAD - Causes clippy::uninlined_format_args warning
let message = format!("Error: {} occurred at line {}", error, line);

// βœ… GOOD - Use inline format arguments
let message = format!("Error: {error} occurred at line {line}");

Reason: Inline format arguments are more readable, performant, and avoid Clippy warnings.

Rule: Always use {variable} syntax instead of separate arguments in format! macro.

Include Causative Values in Error Messages

CRITICAL: Always include the actual parameter values that caused the error in error messages.

// ❌ BAD - Generic error message without context
return Err("Invalid count".into());

// βœ… GOOD - Include the actual parameter value
return Err(format!("Invalid count: {count} (must be 1-474)").into());

// βœ… GOOD - Include multiple parameters for complex validation
return Err(format!("Range exceeds maximum: {start}-{end} (max 99)").into());

Reason: Including actual parameter values in error messages makes debugging significantly easier by providing immediate context about what went wrong.

Rule: Always include the actual parameter values that caused the error in error messages using inline format arguments.

Use try_from() Instead of as

CRITICAL: Use try_from() instead of as casting for type conversions.

// ❌ BAD - Silent truncation with as casting
let value = large_number as u8;

// βœ… GOOD - Explicit error handling with try_from
let value = u8::try_from(large_number)
    .map_err(|_| format!("Value {large_number} exceeds u8::MAX"))?;

Reason: as casting can silently truncate values, while try_from() provides explicit error handling for out-of-range conversions.

Rule: Use try_from() instead of as casting and implement proper error handling for type conversions.

No Clippy Suppression in Production Code

CRITICAL: Never use #[allow(clippy::...)] to suppress Clippy warnings in production code (non-test code).

// ❌ BAD - Suppressing warnings in production code
#[allow(clippy::too_many_lines)]
pub async fn process_request(...) {
    // 100+ lines of code
}

// βœ… GOOD - Refactor the function to be smaller
pub async fn process_request(...) {
    // Call smaller helper functions
    handle_validation(...).await?;
}

async fn handle_validation(...) {
    // Smaller, focused function
}

Reason: Suppressing Clippy warnings hides code quality issues. Instead, refactor the code to address the underlying problem (e.g., split large functions, fix type issues, etc.).

Rule:
- In production code: Always fix the underlying issue instead of suppressing warnings
- In test code: #[allow(...)] is acceptable for test-specific patterns (e.g., unwrap_used, significant_drop_tightening)
- If a warning cannot be reasonably fixed, document why with a comment explaining the exception

# Supported AI Coding Agents

This skill is compatible with the SKILL.md standard and works with all major AI coding agents:

Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.