Claude Code Plugins

Community-maintained marketplace

Feedback

rdos-rust-patterns

@thrashr888/QDOS
7
0

Rust best practices and overall approach for R-DOS development. Use when writing Rust code, implementing features, handling errors, or structuring code in the R-DOS codebase.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name rdos-rust-patterns
description Rust best practices and overall approach for R-DOS development. Use when writing Rust code, implementing features, handling errors, or structuring code in the R-DOS codebase.

R-DOS Rust Patterns

R-DOS is a retro DOS-style file manager TUI in Rust using ratatui. It recreates Q-DOS II (1991, Gazelle Systems) with modern Rust patterns.

Error Handling

// Use Result for fallible operations
pub fn load_data(&mut self) -> Result<(), String> {
    let output = Command::new("tool")
        .output()
        .map_err(|e| format!("Failed to run: {}", e))?;

    if !output.status.success() {
        return Err(String::from_utf8_lossy(&output.stderr).to_string());
    }
    Ok(())
}

State Types

Always derive common traits and use Default:

#[derive(Debug, Clone, Default)]
pub struct MyState {
    pub view: MyView,
    pub items: Vec<MyItem>,
    pub selected: usize,
    pub error: Option<String>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum MyView {
    #[default]
    List,
    Detail,
    Error,
}

External Processes

Suppress stdout/stderr for background processes:

use std::process::{Command, Stdio};

Command::new("player")
    .arg(&file_path)
    .stdout(Stdio::null())
    .stderr(Stdio::null())
    .spawn();

File Operations

Pattern for sibling file detection:

pub fn detect_siblings(&mut self) {
    let Some(ref file_path) = self.file_path else { return };
    let Some(parent) = file_path.parent() else { return };

    let mut siblings: Vec<PathBuf> = std::fs::read_dir(parent)
        .into_iter()
        .flatten()
        .filter_map(|e| e.ok())
        .map(|e| e.path())
        .filter(|p| p.is_file() && is_valid_file(p))
        .collect();

    siblings.sort();
    self.current_index = siblings.iter().position(|p| p == file_path).unwrap_or(0);
    self.sibling_files = siblings;
}

Documentation

//! Module-level doc comment
//!
//! Extended description.

/// Function documentation
pub fn my_function() { ... }

Quality Checks

Run before committing:

cargo fmt -- --check
cargo clippy -- -D warnings
cargo test

Avoid

  • Sentinel values (use Option)
  • Ignoring clippy warnings
  • Hardcoded paths (use config or cwd)
  • Blocking the main thread (use background threads for long operations)