{"id":"158230fa-c226-4dc8-a618-372959771f48","shortId":"xjvq8R","kind":"skill","title":"rust-project","tagline":"Modern Rust project architecture guide for 2025. Use when creating Rust projects (CLI, web services, libraries). Covers workspace structure, error handling, async patterns, and idiomatic Rust best practices.","description":"# Rust Project Architecture\n\n## Core Principles\n\n- **Ownership-first** — Embrace borrow checker, no unnecessary clones\n- **Zero-cost abstractions** — Newtype, iterators, async/await\n- **Workspace for scale** — Use Cargo workspace for multi-crate projects\n- **Error precision** — thiserror for libs, anyhow for apps\n- **Async with Tokio** — Tokio runtime + tracing for observability\n- **No backwards compatibility** — Delete, don't deprecate. Change directly\n- **LiteLLM for LLM APIs** — Use LiteLLM proxy for all LLM integrations\n\n---\n\n## No Backwards Compatibility\n\n> **Delete unused code. Change directly. No compatibility layers.**\n\n```rust\n// ❌ BAD: Deprecated attribute kept around\n#[deprecated(since = \"0.2.0\", note = \"Use new_function instead\")]\npub fn old_function() { ... }\n\n// ❌ BAD: Type alias for renamed types\npub type OldName = NewName; // \"for backwards compatibility\"\n\n// ❌ BAD: Unused parameters\nfn process(_legacy: &str, data: &Data) { ... }\n\n// ❌ BAD: Feature flags for old behavior\n#[cfg(feature = \"legacy\")]\nfn old_impl() { ... }\n\n// ✅ GOOD: Just delete and update all usages\npub fn new_function() { ... }\n// Then: Find & replace all old_function → new_function\n\n// ✅ GOOD: Remove unused parameters entirely\nfn process(data: &Data) { ... }\n```\n\n---\n\n## LiteLLM for LLM APIs\n\n> **Use LiteLLM proxy. Don't call provider APIs directly.**\n\n```rust\n// src/llm.rs\nuse async_openai::{Client, config::OpenAIConfig};\n\npub fn create_client(base_url: &str, api_key: &str) -> Client<OpenAIConfig> {\n    let config = OpenAIConfig::new()\n        .with_api_base(base_url)  // LiteLLM proxy URL\n        .with_api_key(api_key);\n    Client::with_config(config)\n}\n\n// Usage: connect to LiteLLM, use any model\nlet client = create_client(\"http://localhost:4000\", &api_key);\nlet request = CreateChatCompletionRequestArgs::default()\n    .model(\"gpt-4o\")  // or \"claude-3-opus\", \"gemini-pro\", etc.\n    .messages(vec![...])\n    .build()?;\n```\n\n---\n\n## Quick Start\n\n### 1. Initialize Project\n\n```bash\n# Simple project\ncargo new myapp\ncd myapp\n\n# Workspace project\nmkdir myapp && cd myapp\ncargo init --name app\n```\n\n### 2. Apply Tech Stack\n\n| Layer | Recommendation |\n|-------|----------------|\n| Async Runtime | Tokio |\n| Web Framework | Axum |\n| Serialization | Serde |\n| ORM / Database | SeaORM (async, Active Record) |\n| CLI | Clap (derive) |\n| Error (lib) | thiserror |\n| Error (app) | anyhow |\n| Logging | tracing + tracing-subscriber |\n| HTTP Client | reqwest |\n| Config | config-rs |\n\n### Web Framework Selection\n\n| Framework | Choose When |\n|-----------|-------------|\n| **Axum** (default) | Modern microservices, Tokio ecosystem, container deployment, Tower middleware |\n| Actix Web | Maximum throughput, WebSocket-heavy, mature ecosystem needed |\n| Rocket | Rapid prototyping, small teams, minimal boilerplate |\n\n> Axum provides the best balance of performance, ergonomics, and Tokio integration for most projects.\n\n### Database / ORM Selection\n\n| Library | Choose When |\n|---------|-------------|\n| **SeaORM** (default) | CRUD-heavy services, rapid development, async-first, cross-database testing |\n| SQLx | Raw SQL control, maximum performance, compile-time SQL validation |\n| Diesel | Compile-time type safety, stable schema, synchronous workloads |\n\n> SeaORM is recommended for its Active Record ergonomics, native async support, and seamless Axum integration.\n\n### Version Strategy\n\n> **Always use latest. Never pin in templates.**\n\n```toml\n[dependencies]\ntokio = { version = \"*\", features = [\"full\"] }\naxum = \"*\"\nserde = { version = \"*\", features = [\"derive\"] }\n\n# cargo update fetches latest compatible versions\n# Cargo.lock ensures reproducible builds\n```\n\n### 3. Choose Project Structure\n\n#### Simple Project (Single Crate)\n\n```\nmyapp/\n├── Cargo.toml\n├── src/\n│   ├── main.rs           # Entry point\n│   ├── lib.rs            # Library root (optional)\n│   ├── config.rs         # Configuration\n│   ├── error.rs          # Error types\n│   ├── handlers/         # HTTP handlers (web)\n│   │   └── mod.rs\n│   ├── services/         # Business logic\n│   │   └── mod.rs\n│   └── models/           # Domain types\n│       └── mod.rs\n├── tests/                # Integration tests\n│   └── api_test.rs\n└── benches/              # Benchmarks\n    └── bench.rs\n```\n\n#### Workspace Project (Multi-Crate)\n\n```\nmyapp/\n├── Cargo.toml            # Workspace manifest\n├── crates/\n│   ├── app/              # Binary crate\n│   │   ├── Cargo.toml\n│   │   └── src/main.rs\n│   ├── core/             # Business logic lib\n│   │   ├── Cargo.toml\n│   │   └── src/lib.rs\n│   └── infra/            # Infrastructure lib\n│       ├── Cargo.toml\n│       └── src/lib.rs\n├── config/\n│   └── default.toml\n└── Makefile\n```\n\n---\n\n## Architecture Layers\n\n### main.rs — Entry Point\n\nWire dependencies, start runtime. No business logic.\n\n```rust\n// src/main.rs\nuse anyhow::Result;\nuse sea_orm::Database;\nuse tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};\n\n#[tokio::main]\nasync fn main() -> Result<()> {\n    // Initialize tracing\n    tracing_subscriber::registry()\n        .with(tracing_subscriber::fmt::layer())\n        .init();\n\n    // Load config\n    let config = myapp::config::load()?;\n\n    // Connect to database (SeaORM)\n    let db = Database::connect(&config.database_url).await?;\n\n    // Build application state\n    let state = myapp::AppState::new(db);\n\n    // Build router\n    let app = myapp::router::build(state);\n\n    // Run server\n    let listener = tokio::net::TcpListener::bind(&config.listen_addr).await?;\n    tracing::info!(\"listening on {}\", config.listen_addr);\n    axum::serve(listener, app).await?;\n\n    Ok(())\n}\n```\n\n### lib.rs — Library Root\n\nRe-export public API, define AppState.\n\n```rust\n// src/lib.rs\npub mod config;\npub mod db;\npub mod error;\npub mod handlers;\npub mod models;  // SeaORM entities\npub mod router;\npub mod services;\n\nuse sea_orm::DatabaseConnection;\nuse std::sync::Arc;\n\npub struct AppState {\n    pub db: DatabaseConnection,\n}\n\nimpl AppState {\n    pub fn new(db: DatabaseConnection) -> Arc<Self> {\n        Arc::new(Self { db })\n    }\n}\n```\n\n### error.rs — Error Handling\n\n```rust\n// src/error.rs\nuse axum::{http::StatusCode, response::{IntoResponse, Response}, Json};\nuse sea_orm::DbErr;\nuse serde_json::json;\n\n#[derive(Debug, thiserror::Error)]\npub enum AppError {\n    #[error(\"not found: {0}\")]\n    NotFound(String),\n\n    #[error(\"validation error: {0}\")]\n    Validation(String),\n\n    #[error(\"unauthorized\")]\n    Unauthorized,\n\n    #[error(\"internal error\")]\n    Internal(#[from] anyhow::Error),\n\n    #[error(\"database error: {0}\")]\n    Database(#[from] DbErr),\n}\n\nimpl IntoResponse for AppError {\n    fn into_response(self) -> Response {\n        let (status, message) = match &self {\n            AppError::NotFound(msg) => (StatusCode::NOT_FOUND, msg.clone()),\n            AppError::Validation(msg) => (StatusCode::BAD_REQUEST, msg.clone()),\n            AppError::Unauthorized => (StatusCode::UNAUTHORIZED, \"unauthorized\".into()),\n            AppError::Internal(_) | AppError::Database(_) => {\n                tracing::error!(\"Internal error: {:?}\", self);\n                (StatusCode::INTERNAL_SERVER_ERROR, \"internal error\".into())\n            }\n        };\n\n        (status, Json(json!({ \"error\": message }))).into_response()\n    }\n}\n\npub type Result<T> = std::result::Result<T, AppError>;\n```\n\n### handlers/ — HTTP Layer\n\n```rust\n// src/handlers/user.rs\nuse axum::{extract::{Path, State}, Json};\nuse std::sync::Arc;\nuse crate::{error::Result, models::user, services, AppState};\n\npub async fn get_user(\n    State(state): State<Arc<AppState>>,\n    Path(id): Path<i64>,\n) -> Result<Json<user::Model>> {\n    let user = services::user::find_by_id(&state.db, id).await?;\n    Ok(Json(user))\n}\n\npub async fn create_user(\n    State(state): State<Arc<AppState>>,\n    Json(input): Json<CreateUserInput>,\n) -> Result<Json<user::Model>> {\n    let user = services::user::create(&state.db, input).await?;\n    Ok(Json(user))\n}\n```\n\n### services/ — Business Logic\n\n```rust\n// src/services/user.rs\nuse sea_orm::{ActiveModelTrait, DatabaseConnection, EntityTrait, Set};\nuse crate::{error::{AppError, Result}, models::user};\n\npub async fn find_by_id(db: &DatabaseConnection, id: i64) -> Result<user::Model> {\n    user::Entity::find_by_id(id)\n        .one(db)\n        .await?\n        .ok_or_else(|| AppError::NotFound(format!(\"user {}\", id)))\n}\n\npub async fn create(db: &DatabaseConnection, input: CreateUserInput) -> Result<user::Model> {\n    let new_user = user::ActiveModel {\n        email: Set(input.email),\n        name: Set(input.name),\n        ..Default::default()\n    };\n\n    let user = new_user.insert(db).await?;\n    Ok(user)\n}\n\n// Find with relations\npub async fn find_with_posts(db: &DatabaseConnection, id: i64) -> Result<(user::Model, Vec<post::Model>)> {\n    user::Entity::find_by_id(id)\n        .find_with_related(post::Entity)\n        .all(db)\n        .await?\n        .into_iter()\n        .next()\n        .ok_or_else(|| AppError::NotFound(format!(\"user {}\", id)))\n}\n```\n\n---\n\n## Workspace Configuration\n\n```toml\n# Cargo.toml (workspace root)\n[workspace]\nresolver = \"3\"\nmembers = [\"crates/*\"]\n\n[workspace.package]\nversion = \"0.1.0\"\nedition = \"2024\"\nlicense = \"MIT\"\n\n[workspace.dependencies]\ntokio = { version = \"*\", features = [\"full\"] }\naxum = \"*\"\nserde = { version = \"*\", features = [\"derive\"] }\nserde_json = \"*\"\nsea-orm = { version = \"*\", features = [\"sqlx-postgres\", \"runtime-tokio-native-tls\"] }\nthiserror = \"*\"\nanyhow = \"*\"\ntracing = \"*\"\ntracing-subscriber = \"*\"\n```\n\n```toml\n# crates/app/Cargo.toml\n[package]\nname = \"app\"\nversion.workspace = true\nedition.workspace = true\n\n[dependencies]\ncore.path = \"../core\"\ninfra.path = \"../infra\"\ntokio.workspace = true\naxum.workspace = true\nanyhow.workspace = true\ntracing.workspace = true\ntracing-subscriber.workspace = true\n```\n\n---\n\n## CLI Application\n\n```rust\n// src/main.rs\nuse clap::Parser;\nuse anyhow::Result;\n\n#[derive(Parser)]\n#[command(name = \"myapp\", version, about)]\nstruct Cli {\n    /// Input file path\n    #[arg(short, long)]\n    input: PathBuf,\n\n    /// Output format\n    #[arg(short, long, default_value = \"json\")]\n    format: OutputFormat,\n\n    /// Verbose output\n    #[arg(short, long)]\n    verbose: bool,\n}\n\n#[derive(Clone, clap::ValueEnum)]\nenum OutputFormat {\n    Json,\n    Yaml,\n    Text,\n}\n\nfn main() -> Result<()> {\n    let cli = Cli::parse();\n\n    if cli.verbose {\n        tracing_subscriber::fmt::init();\n    }\n\n    // Process input...\n    Ok(())\n}\n```\n\n---\n\n## Testing\n\n```rust\n// tests/api_test.rs\nuse axum::{body::Body, http::{Request, StatusCode}};\nuse tower::ServiceExt;\n\n#[tokio::test]\nasync fn test_get_user() {\n    let app = create_test_app().await;\n\n    let response = app\n        .oneshot(\n            Request::builder()\n                .uri(\"/users/1\")\n                .body(Body::empty())\n                .unwrap(),\n        )\n        .await\n        .unwrap();\n\n    assert_eq!(response.status(), StatusCode::OK);\n}\n\n// Unit test with mock\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_validate_email() {\n        assert!(validate_email(\"test@example.com\").is_ok());\n        assert!(validate_email(\"invalid\").is_err());\n    }\n}\n```\n\n---\n\n## Makefile\n\n```makefile\n.PHONY: build run test lint check clean\n\nbuild:\n\tcargo build --release\n\nrun:\n\tcargo run\n\ndev:\n\tcargo watch -x run\n\ntest:\n\tcargo test\n\ntest-coverage:\n\tcargo tarpaulin --out Html\n\nlint:\n\tcargo clippy -- -D warnings\n\nfmt:\n\tcargo fmt\n\ncheck: fmt lint test\n\t@echo \"All checks passed!\"\n\nclean:\n\tcargo clean\n\n# Database (SeaORM)\ndb-migrate:\n\tsea-orm-cli migrate up\n\ndb-generate:\n\tsea-orm-cli generate entity -o src/models\n\ndb-fresh:\n\tsea-orm-cli migrate fresh\n```\n\n---\n\n## Checklist\n\n```markdown\n## Project Setup\n- [ ] Cargo.toml configured\n- [ ] Workspace structure (if multi-crate)\n- [ ] Edition 2024 / resolver = \"3\"\n\n## Architecture\n- [ ] main.rs: only wiring + startup\n- [ ] lib.rs: re-exports + AppState\n- [ ] error.rs: thiserror types\n- [ ] handlers/ services/ models/ separation\n\n## Quality\n- [ ] tracing for logging\n- [ ] clippy warnings as errors\n- [ ] cargo fmt enforced\n- [ ] Tests for critical paths\n\n## CI\n- [ ] cargo check\n- [ ] cargo clippy\n- [ ] cargo test\n- [ ] cargo fmt --check\n```\n\n---\n\n## See Also\n\n- [reference/architecture.md](reference/architecture.md) — Workspace and module patterns\n- [reference/tech-stack.md](reference/tech-stack.md) — Crate comparisons\n- [reference/patterns.md](reference/patterns.md) — Builder, Newtype, Error patterns","tags":["rust","project","claude","arsenal","majiayu000","agent-skills","ai-agents","ai-coding-assistant","automation","claude-code","code-review","developer-tools"],"capabilities":["skill","source-majiayu000","skill-rust-project","topic-agent-skills","topic-ai-agents","topic-ai-coding-assistant","topic-automation","topic-claude","topic-claude-code","topic-code-review","topic-developer-tools","topic-devops","topic-productivity","topic-prompt-engineering","topic-python"],"categories":["claude-arsenal"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/majiayu000/claude-arsenal/rust-project","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add majiayu000/claude-arsenal","source_repo":"https://github.com/majiayu000/claude-arsenal","install_from":"skills.sh"}},"qualityScore":"0.464","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 29 github stars · SKILL.md body (12,462 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-01T07:01:16.042Z","embedding":null,"createdAt":"2026-04-18T22:24:25.437Z","updatedAt":"2026-05-01T07:01:16.042Z","lastSeenAt":"2026-05-01T07:01:16.042Z","tsv":"'-3':269 '/core':1087 '/infra':1089 '/users/1':1202 '0':743,749,765 '0.1.0':1040 '0.2.0':119 '1':280 '2':301 '2024':1042,1335 '2025':10 '3':476,1035,1337 '4000':256 '4o':266 'abstract':49 'activ':319,436 'activemodel':969 'activemodeltrait':917 'actix':358 'addr':637,644 'alia':131 'also':1381 'alway':448 'anyhow':69,329,563,760,1071,1108 'anyhow.workspace':1094 'api':92,194,202,219,228,236,238,257,658 'api_test.rs':515 'app':71,300,328,529,623,648,1080,1190,1193,1197 'apperror':739,772,783,790,797,803,805,833,924,951,1022 'appli':302 'applic':612,1101 'appstat':617,660,696,701,856,1347 'arc':693,707,708,848,865,892 'architectur':7,34,548,1338 'arg':1122,1129,1139 'around':116 'assert':1209,1229,1235 'async':25,72,207,307,318,404,440,578,858,885,929,957,989,1184 'async-first':403 'async/await':52 'attribut':114 'await':610,638,649,880,905,947,982,1015,1194,1207 'axum':312,348,375,444,461,645,718,840,1050,1173 'axum.workspace':1092 'backward':81,101,140 'bad':112,129,142,151,794 'balanc':379 'base':216,229,230 'bash':283 'behavior':156 'bench':516 'bench.rs':518 'benchmark':517 'best':30,378 'binari':530 'bind':635 'bodi':1174,1175,1203,1204 'boilerpl':374 'bool':1143 'borrow':41 'build':277,475,611,620,626,1244,1250,1252 'builder':1200,1394 'busi':505,535,558,910 'call':200 'cargo':57,286,297,466,1251,1255,1258,1263,1268,1273,1278,1289,1363,1371,1373,1375,1377 'cargo.lock':472 'cargo.toml':485,525,532,538,543,1030,1326 'cd':289,295 'cfg':157,1218 'chang':87,106 'check':1248,1280,1286,1372,1379 'checker':42 'checklist':1322 'choos':346,393,477 'ci':1370 'clap':322,1105,1146 'claud':268 'clean':1249,1288,1290 'cli':16,321,1100,1118,1157,1158,1299,1308,1319 'cli.verbose':1161 'client':209,215,222,240,252,254,336 'clippi':1274,1359,1374 'clone':45,1145 'code':105 'command':1112 'comparison':1391 'compat':82,102,109,141,470 'compil':417,423 'compile-tim':416,422 'config':210,224,242,243,338,340,545,594,596,598,665 'config-r':339 'config.database':608 'config.listen':636,643 'config.rs':494 'configur':495,1028,1327 'connect':245,600,607 'contain':354 'control':413 'core':35,534 'core.path':1086 'cost':48 'cover':20 'coverag':1267 'crate':62,483,523,528,531,850,922,1037,1333,1390 'crates/app/cargo.toml':1077 'creat':13,214,253,887,902,959,1191 'createchatcompletionrequestarg':261 'createuserinput':963 'critic':1368 'cross':407 'cross-databas':406 'crud':398 'crud-heavi':397 'd':1275 'data':149,150,189,190 'databas':316,389,408,568,602,606,763,766,806,1291 'databaseconnect':689,699,706,918,935,961,995 'db':605,619,668,698,705,711,934,946,960,981,994,1014,1294,1303,1314 'db-fresh':1313 'db-gener':1302 'db-migrat':1293 'dberr':728,768 'debug':734 'default':262,349,396,976,977,1132 'default.toml':546 'defin':659 'delet':83,103,165 'depend':456,554,1085 'deploy':355 'deprec':86,113,117 'deriv':323,465,733,1054,1110,1144 'dev':1257 'develop':402 'diesel':421 'direct':88,107,203 'domain':509 'echo':1284 'ecosystem':353,366 'edit':1041,1334 'edition.workspace':1083 'els':950,1021 'email':970,1228,1231,1237 'embrac':40 'empti':1205 'enforc':1365 'ensur':473 'entir':186 'entiti':679,940,1003,1012,1310 'entitytrait':919 'entri':488,551 'enum':738,1148 'eq':1210 'ergonom':382,438 'err':1240 'error':23,64,324,327,497,671,713,736,740,746,748,752,755,757,761,762,764,808,810,815,817,822,851,923,1362,1396 'error.rs':496,712,1348 'etc':274 'export':656,1346 'extract':841 'featur':152,158,459,464,1048,1053,1061 'fetch':468 'file':1120 'find':175,875,931,941,985,991,1004,1008 'first':39,405 'flag':153 'fmt':590,1164,1277,1279,1281,1364,1378 'fn':126,145,160,171,187,213,579,703,773,859,886,930,958,990,1153,1185,1225 'format':953,1024,1128,1135 'found':742,788 'framework':311,343,345 'fresh':1315,1321 'full':460,1049 'function':123,128,173,179,181 'gemini':272 'gemini-pro':271 'generat':1304,1309 'get':860,1187 'good':163,182 'gpt':265 'gpt-4o':264 'guid':8 'handl':24,714 'handler':499,501,674,834,1351 'heavi':364,399 'html':1271 'http':335,500,719,835,1176 'i64':937,997 'id':867,877,879,933,936,943,944,955,996,1006,1007,1026 'idiomat':28 'impl':162,700,769 'info':640 'infra':540 'infra.path':1088 'infrastructur':541 'init':298,592,1165 'initi':281,582 'input':894,904,962,1119,1125,1167 'input.email':972 'input.name':975 'instead':124 'integr':99,385,445,513 'intern':756,758,804,809,813,816 'intorespons':722,770 'invalid':1238 'iter':51,1017 'json':724,731,732,820,821,844,870,882,893,895,897,907,1056,1134,1150 'kept':115 'key':220,237,239,258 'latest':450,469 'layer':110,305,549,572,591,836 'legaci':147,159 'let':223,251,259,595,604,614,622,630,778,871,898,965,978,1156,1189,1195 'lib':68,325,537,542 'lib.rs':490,651,1343 'librari':19,392,491,652 'licens':1043 'lint':1247,1272,1282 'listen':631,641,647 'litellm':89,94,191,196,232,247 'llm':91,98,193 'load':593,599 'localhost':255 'log':330,1358 'logic':506,536,559,911 'long':1124,1131,1141 'main':577,580,1154 'main.rs':487,550,1339 'makefil':547,1241,1242 'manifest':527 'markdown':1323 'match':781 'matur':365 'maximum':360,414 'member':1036 'messag':275,780,823 'microservic':351 'middlewar':357 'migrat':1295,1300,1320 'minim':373 'mit':1044 'mkdir':293 'mock':1217 'mod':664,667,670,673,676,681,684,1220 'mod.rs':503,507,511 'model':250,263,508,677,853,926,1000,1353 'modern':4,350 'modul':1386 'msg':785,792 'msg.clone':789,796 'multi':61,522,1332 'multi-cr':60,521,1331 'myapp':288,290,294,296,484,524,597,616,624,1114 'name':299,973,1079,1113 'nativ':439,1068 'need':367 'net':633 'never':451 'new':122,172,180,226,287,618,704,709,966 'new_user.insert':980 'newnam':138 'newtyp':50,1395 'next':1018 'note':120 'notfound':744,784,952,1023 'o':1311 'observ':79 'ok':650,881,906,948,983,1019,1168,1213,1234 'old':127,155,161,178 'oldnam':137 'one':945 'oneshot':1198 'openai':208 'openaiconfig':211,225 'option':493 'opus':270 'orm':315,390,567,688,727,916,1059,1298,1307,1318 'output':1127,1138 'outputformat':1136,1149 'ownership':38 'ownership-first':37 'packag':1078 'paramet':144,185 'pars':1159 'parser':1106,1111 'pass':1287 'path':842,866,868,1121,1369 'pathbuf':1126 'pattern':26,1387,1397 'perform':381,415 'phoni':1243 'pin':452 'point':489,552 'post':993,1011 'postgr':1064 'practic':31 'precis':65 'principl':36 'pro':273 'process':146,188,1166 'project':3,6,15,33,63,282,285,292,388,478,481,520,1324 'prototyp':370 'provid':201,376 'proxi':95,197,233 'pub':125,135,170,212,663,666,669,672,675,680,683,694,697,702,737,826,857,884,928,956,988 'public':657 'qualiti':1355 'quick':278 'rapid':369,401 'raw':411 're':655,1345 're-export':654,1344 'recommend':306,433 'record':320,437 'reference/architecture.md':1382,1383 'reference/patterns.md':1392,1393 'reference/tech-stack.md':1388,1389 'registri':586 'relat':987,1010 'releas':1253 'remov':183 'renam':133 'replac':176 'reproduc':474 'request':260,795,1177,1199 'reqwest':337 'resolv':1034,1336 'respons':721,723,775,777,825,1196 'response.status':1211 'result':564,581,828,830,831,852,869,896,925,938,964,998,1109,1155 'rocket':368 'root':492,653,1032 'router':621,625,682 'rs':341 'run':628,1245,1254,1256,1261 'runtim':76,308,556,1066 'runtime-tokio-native-tl':1065 'rust':2,5,14,29,32,111,204,560,661,715,837,912,1102,1170 'rust-project':1 'safeti':426 'scale':55 'schema':428 'sea':566,687,726,915,1058,1297,1306,1317 'sea-orm':1057 'sea-orm-c':1296,1305,1316 'seamless':443 'seaorm':317,395,431,603,678,1292 'see':1380 'select':344,391 'self':710,776,782,811 'separ':1354 'serd':314,462,730,1051,1055 'serial':313 'serv':646 'server':629,814 'servic':18,400,504,685,855,873,900,909,1352 'serviceext':1181 'set':920,971,974 'setup':1325 'short':1123,1130,1140 'simpl':284,480 'sinc':118 'singl':482 'skill' 'skill-rust-project' 'small':371 'source-majiayu000' 'sql':412,419 'sqlx':410,1063 'sqlx-postgr':1062 'src':486 'src/error.rs':716 'src/handlers/user.rs':838 'src/lib.rs':539,544,662 'src/llm.rs':205 'src/main.rs':533,561,1103 'src/models':1312 'src/services/user.rs':913 'stabl':427 'stack':304 'start':279,555 'startup':1342 'state':613,615,627,843,862,863,864,889,890,891 'state.db':878,903 'status':779,819 'statuscod':720,786,793,799,812,1178,1212 'std':691,829,846 'str':148,218,221 'strategi':447 'string':745,751 'struct':695,1117 'structur':22,479,1329 'subscrib':334,571,585,589,1075,1163 'subscriberext':573 'subscriberinitext':575 'super':1223 'support':441 'sync':692,847 'synchron':429 'tarpaulin':1269 'tcplisten':634 'team':372 'tech':303 'templat':454 'test':409,512,514,1169,1183,1186,1192,1215,1219,1221,1224,1226,1246,1262,1264,1266,1283,1366,1376 'test-coverag':1265 'test@example.com':1232 'tests/api_test.rs':1171 'text':1152 'thiserror':66,326,735,1070,1349 'throughput':361 'time':418,424 'tls':1069 'tokio':74,75,309,352,384,457,576,632,1046,1067,1182 'tokio.workspace':1090 'toml':455,1029,1076 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-coding-assistant' 'topic-automation' 'topic-claude' 'topic-claude-code' 'topic-code-review' 'topic-developer-tools' 'topic-devops' 'topic-productivity' 'topic-prompt-engineering' 'topic-python' 'tower':356,1180 'trace':77,331,333,570,583,584,588,639,807,1072,1074,1162,1356 'tracing-subscrib':332,1073 'tracing-subscriber.workspace':1098 'tracing.workspace':1096 'true':1082,1084,1091,1093,1095,1097,1099 'type':130,134,136,425,498,510,827,1350 'unauthor':753,754,798,800,801 'unit':1214 'unnecessari':44 'unus':104,143,184 'unwrap':1206,1208 'updat':167,467 'uri':1201 'url':217,231,234,609 'usag':169,244 'use':11,56,93,121,195,206,248,449,562,565,569,686,690,717,725,729,839,845,849,914,921,1104,1107,1172,1179,1222 'user':854,861,872,874,883,888,899,901,908,927,939,954,967,968,979,984,999,1002,1025,1188 'util':574 'valid':420,747,750,791,1227,1230,1236 'valu':1133 'valueenum':1147 'vec':276,1001 'verbos':1137,1142 'version':446,458,463,471,1039,1047,1052,1060,1115 'version.workspace':1081 'warn':1276,1360 'watch':1259 'web':17,310,342,359,502 'websocket':363 'websocket-heavi':362 'wire':553,1341 'workload':430 'workspac':21,53,58,291,519,526,1027,1031,1033,1328,1384 'workspace.dependencies':1045 'workspace.package':1038 'x':1260 'yaml':1151 'zero':47 'zero-cost':46","prices":[{"id":"948e75dd-2614-450e-95f1-4a9a254df024","listingId":"158230fa-c226-4dc8-a618-372959771f48","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"majiayu000","category":"claude-arsenal","install_from":"skills.sh"},"createdAt":"2026-04-18T22:24:25.437Z"}],"sources":[{"listingId":"158230fa-c226-4dc8-a618-372959771f48","source":"github","sourceId":"majiayu000/claude-arsenal/rust-project","sourceUrl":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/rust-project","isPrimary":false,"firstSeenAt":"2026-04-18T22:24:25.437Z","lastSeenAt":"2026-05-01T07:01:16.042Z"}],"details":{"listingId":"158230fa-c226-4dc8-a618-372959771f48","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"majiayu000","slug":"rust-project","github":{"repo":"majiayu000/claude-arsenal","stars":29,"topics":["agent-skills","ai-agents","ai-coding-assistant","automation","claude","claude-code","code-review","developer-tools","devops","productivity","prompt-engineering","python","software-development","typescript","workflows"],"license":"mit","html_url":"https://github.com/majiayu000/claude-arsenal","pushed_at":"2026-04-29T04:12:22Z","description":"52 production-ready Claude Code skills and 7 specialized agents for software development, DevOps, product workflows, and automation.","skill_md_sha":"804fa7818220990dea8034e333e002b6f012492c","skill_md_path":"skills/rust-project/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/rust-project"},"layout":"multi","source":"github","category":"claude-arsenal","frontmatter":{"name":"rust-project","description":"Modern Rust project architecture guide for 2025. Use when creating Rust projects (CLI, web services, libraries). Covers workspace structure, error handling, async patterns, and idiomatic Rust best practices."},"skills_sh_url":"https://skills.sh/majiayu000/claude-arsenal/rust-project"},"updatedAt":"2026-05-01T07:01:16.042Z"}}