Skip to content

Hamiltonxx/rust-dojo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rust-dojo

AI-powered adaptive Rust practice — based on your own codebase.

English | 中文


What it does

rust-dojo scans your local Rust projects, picks real code snippets, and asks you to:

  1. Read and explain — understand a specific mechanism in the code
  2. Apply it — solve a classic related problem in Rust

Difficulty adapts automatically based on your answers (1–5 stars).


Demo

╔══════════════════════════════════════════════════╗
║         Rust Adaptive Quiz System                ║
║   q to quit  |  s to show progress              ║
╚══════════════════════════════════════════════════╝

Scanned 312 local code snippets.

  #1 [Iterator & Collections] ★☆☆☆☆
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  // from scanner/mod.rs, lines 17-38
  fn collect_rs_files(dir: &Path, snippets: &mut Vec<CodeSnippet>) {
      let Ok(entries) = std::fs::read_dir(dir) else { return };
      for entry in entries.flatten() { ... }
  }

  Why does `.flatten()` appear here? What would happen without it?
  Additionally, implement a function that walks a directory and
  returns all .toml file paths.

Requirements

  • Rust (stable)
  • An API key: OpenAI / Anthropic / any OpenAI-compatible relay

Setup

1. Create config file

mkdir -p ~/.config/rust-dojo
cp config.example.toml ~/.config/rust-dojo/config.toml

Edit ~/.config/rust-dojo/config.toml:

# Required
api_key = "sk-ant-..."

# Optional: Rust projects to scan for questions
scan_dirs = [
    "~/projects/my-app",
    "~/projects/another-crate",
]

# Optional: where quiz files and session.json are stored
# Default: ~/.local/share/rust-dojo/quiz
# quiz_dir = "~/.local/share/rust-dojo/quiz"

# Optional: zh or en (default: auto-detect from system locale)
# lang = "en"

# Optional: override API endpoint and model
# api_base_url = "https://your-relay-endpoint"
# api_model = "claude-sonnet-4-6"

Without scan_dirs, the system generates generic Rust questions.

api_key can also be set via environment variable API_KEY or ANTHROPIC_API_KEY.

2. Run

cargo run --release

How it works

Start
 └─ Load session.json
 └─ Scan local .rs files → code snippets
 └─ Loop:
      ├─ Pick a snippet (70%) or generic question (30%)
      ├─ AI generates question → written to ~/.local/share/rust-dojo/quiz/00N_topic.rs
      ├─ You edit the file:
      │     /* Explanation: your analysis */
      │     fn main() { /* your code */ }
      ├─ Press Enter → AI evaluates → score + feedback appended to file
      └─ Difficulty: 2 correct → +1★   2 wrong → -1★

Session progress is saved to session.json inside quiz_dir and resumes on next run.


Configuration

All settings live in ~/.config/rust-dojo/config.toml. See config.example.toml for the full reference.

Key Default Description
api_key Required. API key (or env API_KEY)
api_base_url Auto-detected API endpoint
api_model Auto-detected Model name
lang System locale en or zh
scan_dirs [] Rust project paths to scan
quiz_dir ~/.local/share/rust-dojo/quiz Quiz files + session.json location

License

MIT

About

AI-powered adaptive Rust practice — quiz yourself based on your own codebase

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages