[{"data":1,"prerenderedAt":1741},["ShallowReactive",2],{"page-\u002Frust\u002F33-ecosystem":3},{"id":4,"title":5,"body":6,"description":16,"extension":1734,"meta":1735,"navigation":1736,"path":1737,"seo":1738,"stem":1739,"__hash__":1740},"content\u002Frust\u002F33-ecosystem.md","33 — Ecosystem Tour",{"type":7,"value":8,"toc":1689},"minimark",[9,13,17,22,136,145,157,161,192,196,257,261,307,311,341,345,370,374,406,410,457,461,535,539,562,566,635,639,690,694,734,738,770,774,805,809,865,869,903,907,948,952,972,976,1008,1012,1044,1048,1080,1084,1136,1140,1192,1196,1216,1220,1249,1253,1270,1274,1321,1325,1359,1363,1395,1399,1486,1490,1510,1514,1540,1544,1575,1579,1582,1634,1638,1686],[10,11,5],"h1",{"id":12},"_33-ecosystem-tour",[14,15,16],"p",{},"A curated map of the Rust ecosystem. Pick the right tool for the job; don't reinvent.",[18,19,21],"h2",{"id":20},"web-frameworks","Web Frameworks",[23,24,25,41],"table",{},[26,27,28],"thead",{},[29,30,31,35,38],"tr",{},[32,33,34],"th",{},"Crate",[32,36,37],{},"Style",[32,39,40],{},"Notes",[42,43,44,59,72,85,98,110,123],"tbody",{},[29,45,46,53,56],{},[47,48,49],"td",{},[50,51,52],"code",{},"axum",[47,54,55],{},"Tokio-based, middleware via tower",[47,57,58],{},"Most popular, mature, by tokio team",[29,60,61,66,69],{},[47,62,63],{},[50,64,65],{},"actix-web",[47,67,68],{},"Actor model, fast",[47,70,71],{},"Pre-dates axum, still popular",[29,73,74,79,82],{},[47,75,76],{},[50,77,78],{},"rocket",[47,80,81],{},"Ergonomic, macros",[47,83,84],{},"Friendly API, slower release cadence",[29,86,87,92,95],{},[47,88,89],{},[50,90,91],{},"poem",[47,93,94],{},"Modular",[47,96,97],{},"Good OpenAPI integration",[29,99,100,105,108],{},[47,101,102],{},[50,103,104],{},"salvo",[47,106,107],{},"Middleware-centric",[47,109],{},[29,111,112,117,120],{},[47,113,114],{},[50,115,116],{},"warp",[47,118,119],{},"Combinator-based",[47,121,122],{},"Filter-based, older style",[29,124,125,130,133],{},[47,126,127],{},[50,128,129],{},"tide",[47,131,132],{},"async-std-based",[47,134,135],{},"Less active",[137,138,140,141,144],"h3",{"id":139},"use-with-tower-middleware","Use with ",[50,142,143],{},"tower"," middleware",[14,146,147,149,150,152,153,156],{},[50,148,143],{}," is the standard middleware\u002Fservice abstraction. ",[50,151,52],{}," builds on ",[50,154,155],{},"tower-http"," (compression, tracing, auth, CORS).",[18,158,160],{"id":159},"http-client","HTTP Client",[162,163,164,175,181,186],"ul",{},[165,166,167,170,171,174],"li",{},[50,168,169],{},"reqwest",": dominant async HTTP client (built on ",[50,172,173],{},"hyper",").",[165,176,177,180],{},[50,178,179],{},"ureq",": simple blocking client, minimal deps.",[165,182,183,185],{},[50,184,173],{},": low-level HTTP\u002F1\u002F2 client\u002Fserver.",[165,187,188,191],{},[50,189,190],{},"attohttpc",": blocking, minimal.",[18,193,195],{"id":194},"serialization","Serialization",[162,197,198,212,218,224,233,239,245,251],{},[165,199,200,203,204,207,208,211],{},[50,201,202],{},"serde",": the universal serialize\u002Fdeserialize framework. Almost every type derives ",[50,205,206],{},"Serialize","\u002F",[50,209,210],{},"Deserialize",".",[165,213,214,217],{},[50,215,216],{},"serde_json",": JSON.",[165,219,220,223],{},[50,221,222],{},"serde_yaml",": YAML.",[165,225,226,207,229,232],{},[50,227,228],{},"toml",[50,230,231],{},"toml_edit",": TOML config.",[165,234,235,238],{},[50,236,237],{},"rmp-serde",": MessagePack.",[165,240,241,244],{},[50,242,243],{},"bincode",": Rust-native binary (fast, not portable).",[165,246,247,250],{},[50,248,249],{},"postcard",": compact embedded-friendly binary.",[165,252,253,256],{},[50,254,255],{},"ciborium",": CBOR.",[18,258,260],{"id":259},"database","Database",[162,262,263,269,275,283,289,295,301],{},[165,264,265,268],{},[50,266,267],{},"sqlx",": async, compile-time checked SQL via macros.",[165,270,271,274],{},[50,272,273],{},"diesel",": ORM, sync, mature.",[165,276,277,280,281,211],{},[50,278,279],{},"sea-orm",": async ORM on top of ",[50,282,267],{},[165,284,285,288],{},[50,286,287],{},"tokio-postgres",": async PostgreSQL client.",[165,290,291,294],{},[50,292,293],{},"rusqlite",": sync SQLite.",[165,296,297,300],{},[50,298,299],{},"redis",": Redis client.",[165,302,303,306],{},[50,304,305],{},"mongodb",": official driver.",[18,308,310],{"id":309},"async-runtime","Async Runtime",[162,312,313,319,325,331],{},[165,314,315,318],{},[50,316,317],{},"tokio",": default for most projects.",[165,320,321,324],{},[50,322,323],{},"async-std",": std-mirror API.",[165,326,327,330],{},[50,328,329],{},"smol",": minimal.",[165,332,333,336,337,340],{},[50,334,335],{},"embassy",": ",[50,338,339],{},"no_std"," for embedded.",[18,342,344],{"id":343},"cli-parsing","CLI Parsing",[162,346,347,353,359,364],{},[165,348,349,352],{},[50,350,351],{},"clap",": de facto standard. Derive API is ergonomic.",[165,354,355,358],{},[50,356,357],{},"argh",": Google's lightweight derive-based.",[165,360,361,330],{},[50,362,363],{},"gumdrop",[165,365,366,369],{},[50,367,368],{},"pico-args",": tiny, no derive.",[137,371,373],{"id":372},"plus-cli-helpers","Plus CLI helpers",[162,375,376,382,388,397],{},[165,377,378,381],{},[50,379,380],{},"indicatif",": progress bars.",[165,383,384,387],{},[50,385,386],{},"dialoguer",": interactive prompts.",[165,389,390,207,393,396],{},[50,391,392],{},"console",[50,394,395],{},"owo-colors",": terminal colors.",[165,398,399,207,402,405],{},[50,400,401],{},"comfy-table",[50,403,404],{},"tabled",": tables.",[18,407,409],{"id":408},"logging-tracing","Logging & Tracing",[162,411,412,425,437,443,451],{},[165,413,414,417,418,207,421,424],{},[50,415,416],{},"log",": facade, simple ",[50,419,420],{},"info!",[50,422,423],{},"warn!"," macros.",[165,426,427,430,431,433,434,211],{},[50,428,429],{},"env_logger",": backend for ",[50,432,416],{}," controlled by ",[50,435,436],{},"RUST_LOG",[165,438,439,442],{},[50,440,441],{},"tracing",": structured, async-aware, spans. Modern choice.",[165,444,445,448,449,211],{},[50,446,447],{},"tracing-subscriber",": subscriber setup for ",[50,450,441],{},[165,452,453,456],{},[50,454,455],{},"slog",": structured logging, less common now.",[18,458,460],{"id":459},"testing","Testing",[162,462,463,469,475,481,487,493,499,505,511,517,523,529],{},[165,464,465,466,174],{},"Built-in (",[50,467,468],{},"cargo test",[165,470,471,474],{},[50,472,473],{},"proptest",": property-based.",[165,476,477,480],{},[50,478,479],{},"quickcheck",": property-based (older).",[165,482,483,486],{},[50,484,485],{},"rstest",": parametrized tests.",[165,488,489,492],{},[50,490,491],{},"mockall",": mock generation.",[165,494,495,498],{},[50,496,497],{},"mockito",": HTTP mock server.",[165,500,501,504],{},[50,502,503],{},"wiremock",": HTTP mock (async).",[165,506,507,510],{},[50,508,509],{},"insta",": snapshot testing.",[165,512,513,516],{},[50,514,515],{},"criterion",": benchmarking.",[165,518,519,522],{},[50,520,521],{},"cargo-nextest",": faster test runner.",[165,524,525,528],{},[50,526,527],{},"trybuild",": UI tests for compile errors.",[165,530,531,534],{},[50,532,533],{},"cargo-mutants",": mutation testing.",[18,536,538],{"id":537},"fuzzing","Fuzzing",[162,540,541,547,553],{},[165,542,543,546],{},[50,544,545],{},"cargo-fuzz",": libFuzzer-based.",[165,548,549,552],{},[50,550,551],{},"afl.rs",": AFL-based.",[165,554,555,207,558,561],{},[50,556,557],{},"rutensprika",[50,559,560],{},"bolero",": alternatives.",[18,563,565],{"id":564},"cryptography","Cryptography",[162,567,568,574,582,591,597,605,617,626],{},[165,569,570,573],{},[50,571,572],{},"ring",": popular, audited.",[165,575,576,579,580,174],{},[50,577,578],{},"rustls",": TLS in Rust (uses ",[50,581,572],{},[165,583,584,207,587,590],{},[50,585,586],{},"openssl",[50,588,589],{},"openssl-sys",": OpenSSL bindings.",[165,592,593,596],{},[50,594,595],{},"argon2",": password hashing.",[165,598,599,207,602,561],{},[50,600,601],{},"bcrypt",[50,603,604],{},"scrypt",[165,606,607,207,610,207,613,616],{},[50,608,609],{},"sha2",[50,611,612],{},"sha3",[50,614,615],{},"blake3",": hash functions.",[165,618,619,207,622,625],{},[50,620,621],{},"chacha20poly1305",[50,623,624],{},"aes-gcm",": AEAD ciphers.",[165,627,628,207,631,634],{},[50,629,630],{},"ed25519-dalek",[50,632,633],{},"x25519-dalek",": elliptic curve crypto.",[18,636,638],{"id":637},"networking","Networking",[162,640,641,646,651,657,663,672,678,684],{},[165,642,643,645],{},[50,644,317],{},": async runtime + TCP\u002FUDP\u002FUnix sockets.",[165,647,648,650],{},[50,649,173],{},": HTTP\u002F1, HTTP\u002F2.",[165,652,653,656],{},[50,654,655],{},"quinn",": QUIC.",[165,658,659,662],{},[50,660,661],{},"tonic",": gRPC.",[165,664,665,207,668,671],{},[50,666,667],{},"tungstenite",[50,669,670],{},"tokio-tungstenite",": WebSocket.",[165,673,674,677],{},[50,675,676],{},"paho-mqtt",": MQTT.",[165,679,680,683],{},[50,681,682],{},"lapin",": AMQP (RabbitMQ).",[165,685,686,689],{},[50,687,688],{},"rdkafka",": Kafka.",[18,691,693],{"id":692},"file-formats","File Formats",[162,695,696,704,709,720,725],{},[165,697,698,207,700,207,702,211],{},[50,699,216],{},[50,701,222],{},[50,703,228],{},[165,705,706,211],{},[50,707,708],{},"csv",[165,710,711,207,714,207,717,211],{},[50,712,713],{},"quick-xml",[50,715,716],{},"roxmltree",[50,718,719],{},"serde-xml-rs",[165,721,722,211],{},[50,723,724],{},"serde_urlencoded",[165,726,727,207,730,733],{},[50,728,729],{},"bytes",[50,731,732],{},"byteserde"," for binary protocols.",[18,735,737],{"id":736},"compression","Compression",[162,739,740,746,752,764],{},[165,741,742,745],{},[50,743,744],{},"flate2",": gzip\u002Fdeflate.",[165,747,748,751],{},[50,749,750],{},"zstd",": Zstandard.",[165,753,754,207,757,207,760,763],{},[50,755,756],{},"bzip2",[50,758,759],{},"lz4",[50,761,762],{},"xz2",": other algorithms.",[165,765,766,769],{},[50,767,768],{},"snap",": Snappy.",[18,771,773],{"id":772},"serialization-for-network-protocols","Serialization for Network Protocols",[162,775,776,781,790,799],{},[165,777,778,780],{},[50,779,729],{}," (tokio ecosystem): zero-copy byte buffers.",[165,782,783,207,786,789],{},[50,784,785],{},"prost",[50,787,788],{},"protobuf",": Protocol Buffers.",[165,791,792,207,795,798],{},[50,793,794],{},"capnp",[50,796,797],{},"capnpc",": Cap'n Proto.",[165,800,801,804],{},[50,802,803],{},"flatbuffers",": FlatBuffers.",[18,806,808],{"id":807},"gui","GUI",[162,810,811,820,826,832,838,844,853,859],{},[165,812,813,207,816,819],{},[50,814,815],{},"egui",[50,817,818],{},"eframe",": immediate-mode, easy, cross-platform.",[165,821,822,825],{},[50,823,824],{},"iced",": Elm-inspired, reactive.",[165,827,828,831],{},[50,829,830],{},"slint",": declarative UI DSL, commercial-friendly.",[165,833,834,837],{},[50,835,836],{},"tauri",": web frontend + Rust backend (Electron alternative).",[165,839,840,843],{},[50,841,842],{},"dioxus",": React-like.",[165,845,846,207,849,852],{},[50,847,848],{},"druid",[50,850,851],{},"xilem",": research projects.",[165,854,855,858],{},[50,856,857],{},"gtk-rs",": GTK bindings.",[165,860,861,864],{},[50,862,863],{},"makepad",": live-coded, GPU-rendered.",[18,866,868],{"id":867},"game-development","Game Development",[162,870,871,877,883,889,897],{},[165,872,873,876],{},[50,874,875],{},"bevy",": ECS game engine, modern, popular.",[165,878,879,882],{},[50,880,881],{},"wgpu",": portable graphics API (Vulkan\u002FMetal\u002FDX12\u002FWebGPU).",[165,884,885,888],{},[50,886,887],{},"macroquad",": simple 2D.",[165,890,891,894,895,211],{},[50,892,893],{},"amethyst",": discontinued, see ",[50,896,875],{},[165,898,899,902],{},[50,900,901],{},"ggez",": 2D, LÖVE-like.",[18,904,906],{"id":905},"numerical-data-science","Numerical & Data Science",[162,908,909,915,921,927,933,942],{},[165,910,911,914],{},[50,912,913],{},"ndarray",": N-dimensional arrays.",[165,916,917,920],{},[50,918,919],{},"nalgebra",": linear algebra.",[165,922,923,926],{},[50,924,925],{},"plotters",": plotting.",[165,928,929,932],{},[50,930,931],{},"polars",": DataFrames (Pandas-like, fast).",[165,934,935,207,938,941],{},[50,936,937],{},"arrow",[50,939,940],{},"arrow2",": Apache Arrow.",[165,943,944,947],{},[50,945,946],{},"linfa",": ML toolkit.",[18,949,951],{"id":950},"date-time","Date & Time",[162,953,954,960,966],{},[165,955,956,959],{},[50,957,958],{},"chrono",": full-featured, popular.",[165,961,962,965],{},[50,963,964],{},"time",": lighter, modern API.",[165,967,968,971],{},[50,969,970],{},"jiff",": newer, ergonomic (by BurntSushi).",[18,973,975],{"id":974},"regex-text","Regex & Text",[162,977,978,984,990,996,1002],{},[165,979,980,983],{},[50,981,982],{},"regex",": fast, Unicode-aware.",[165,985,986,989],{},[50,987,988],{},"fancy-regex",": backtracking for lookahead\u002Fbackreferences.",[165,991,992,995],{},[50,993,994],{},"aho-corasick",": multiple-pattern search.",[165,997,998,1001],{},[50,999,1000],{},"memchr",": byte search primitives.",[165,1003,1004,1007],{},[50,1005,1006],{},"unicode-segmentation",": grapheme\u002Fword splitting.",[18,1009,1011],{"id":1010},"error-handling","Error Handling",[162,1013,1014,1024,1030,1038],{},[165,1015,1016,1019,1020,1023],{},[50,1017,1018],{},"thiserror",": derive ",[50,1021,1022],{},"Error"," for libraries.",[165,1025,1026,1029],{},[50,1027,1028],{},"anyhow",": ergonomic error type for apps.",[165,1031,1032,336,1035,1037],{},[50,1033,1034],{},"eyre",[50,1036,1028],{}," fork with reports.",[165,1039,1040,1043],{},[50,1041,1042],{},"color-eyre",": prettier error reports.",[18,1045,1047],{"id":1046},"async-utilities","Async Utilities",[162,1049,1050,1056,1065,1071],{},[165,1051,1052,1055],{},[50,1053,1054],{},"async-trait",": async in traits (still useful pre-1.75).",[165,1057,1058,207,1061,1064],{},[50,1059,1060],{},"futures",[50,1062,1063],{},"futures-util",": combinators.",[165,1066,1067,1070],{},[50,1068,1069],{},"tokio-util",": codecs, tasks.",[165,1072,1073,336,1076,1079],{},[50,1074,1075],{},"async-stream",[50,1077,1078],{},"yield","-like streams.",[18,1081,1083],{"id":1082},"concurrency","Concurrency",[162,1085,1086,1092,1105,1111,1120,1130],{},[165,1087,1088,1091],{},[50,1089,1090],{},"crossbeam",": channels, epoch-based GC, scoped threads.",[165,1093,1094,1097,1098,207,1101,1104],{},[50,1095,1096],{},"parking_lot",": faster ",[50,1099,1100],{},"Mutex",[50,1102,1103],{},"RwLock"," than std.",[165,1106,1107,1110],{},[50,1108,1109],{},"rayon",": data parallelism.",[165,1112,1113,1116,1117,211],{},[50,1114,1115],{},"dashmap",": concurrent ",[50,1118,1119],{},"HashMap",[165,1121,1122,1125,1126,1129],{},[50,1123,1124],{},"arc-swap",": atomic ",[50,1127,1128],{},"Arc"," swap.",[165,1131,1132,1135],{},[50,1133,1134],{},"loom",": concurrency model checker.",[18,1137,1139],{"id":1138},"collections","Collections",[162,1141,1142,1153,1159,1168,1174,1180,1186],{},[165,1143,1144,1147,1148,207,1150,211],{},[50,1145,1146],{},"indexmap",": ordered ",[50,1149,1119],{},[50,1151,1152],{},"HashSet",[165,1154,1155,1158],{},[50,1156,1157],{},"hashbrown",": low-level hash map.",[165,1160,1161,207,1164,1167],{},[50,1162,1163],{},"smallvec",[50,1165,1166],{},"tinyvec",": inline storage.",[165,1169,1170,1173],{},[50,1171,1172],{},"arrayvec",": stack-only fixed capacity.",[165,1175,1176,1179],{},[50,1177,1178],{},"bumpalo",": arena allocator.",[165,1181,1182,1185],{},[50,1183,1184],{},"typed-arena",": typed arena.",[165,1187,1188,1191],{},[50,1189,1190],{},"im",": persistent\u002Fimmutable collections.",[18,1193,1195],{"id":1194},"serialization-helpers","Serialization Helpers",[162,1197,1198,1204,1210],{},[165,1199,1200,1203],{},[50,1201,1202],{},"serde_with",": custom serde helpers.",[165,1205,1206,1209],{},[50,1207,1208],{},"serde_repr",": serialize enums as integers.",[165,1211,1212,1215],{},[50,1213,1214],{},"serde-aux",": extra helpers.",[18,1217,1219],{"id":1218},"configuration","Configuration",[162,1221,1222,1228,1234,1240],{},[165,1223,1224,1227],{},[50,1225,1226],{},"config",": multi-source config (env, file, CLI).",[165,1229,1230,1233],{},[50,1231,1232],{},"figment",": layered config (used by Rocket).",[165,1235,1236,1239],{},[50,1237,1238],{},"envy",": struct-of-env-vars via serde.",[165,1241,1242,207,1245,207,1247,211],{},[50,1243,1244],{}," envy",[50,1246,1244],{},[50,1248,1238],{},[18,1250,1252],{"id":1251},"http-server-middleware","HTTP Server Middleware",[162,1254,1255,1260,1265],{},[165,1256,1257,1259],{},[50,1258,143],{},": middleware abstraction.",[165,1261,1262,1264],{},[50,1263,155],{},": tracing, compression, CORS, auth, fs, timeout.",[165,1266,1267,211],{},[50,1268,1269],{},"axum::middleware",[18,1271,1273],{"id":1272},"webassembly","WebAssembly",[162,1275,1276,1282,1288,1297,1303,1309,1315],{},[165,1277,1278,1281],{},[50,1279,1280],{},"wasm-bindgen",": JS interop.",[165,1283,1284,1287],{},[50,1285,1286],{},"wasm-pack",": build & publish.",[165,1289,1290,207,1293,1296],{},[50,1291,1292],{},"web-sys",[50,1294,1295],{},"js-sys",": bindings to Web APIs.",[165,1298,1299,1302],{},[50,1300,1301],{},"gloo",": idiomatic wrappers.",[165,1304,1305,1308],{},[50,1306,1307],{},"yew",": React-like in WASM.",[165,1310,1311,1314],{},[50,1312,1313],{},"seed",": alternative.",[165,1316,1317,1320],{},[50,1318,1319],{},"leptos",": modern, signal-based.",[18,1322,1324],{"id":1323},"embedded","Embedded",[162,1326,1327,1333,1342,1347,1353],{},[165,1328,1329,1332],{},[50,1330,1331],{},"embedded-hal",": hardware abstraction traits.",[165,1334,1335,207,1338,1341],{},[50,1336,1337],{},"cortex-m",[50,1339,1340],{},"cortex-m-rt",": ARM Cortex.",[165,1343,1344,1346],{},[50,1345,335],{},": async embedded.",[165,1348,1349,1352],{},[50,1350,1351],{},"defmt",": efficient logging.",[165,1354,1355,1358],{},[50,1356,1357],{},"probe-rs",": debugging\u002Fprobing.",[18,1360,1362],{"id":1361},"parsing-dsls","Parsing & DSLs",[162,1364,1365,1371,1377,1383,1389],{},[165,1366,1367,1370],{},[50,1368,1369],{},"nom",": parser combinators.",[165,1372,1373,1376],{},[50,1374,1375],{},"pest",": PEG-based, easy.",[165,1378,1379,1382],{},[50,1380,1381],{},"lalrpop",": LR parser generator.",[165,1384,1385,1388],{},[50,1386,1387],{},"chumsky",": zero-copy parser combinators.",[165,1390,1391,1394],{},[50,1392,1393],{},"logos",": fast lexer.",[18,1396,1398],{"id":1397},"build-release","Build & Release",[162,1400,1401,1407,1413,1419,1424,1433,1439,1445,1451,1457,1463,1469,1475,1481],{},[165,1402,1403,1406],{},[50,1404,1405],{},"cargo-release",": versioning\u002Fpublishing.",[165,1408,1409,1412],{},[50,1410,1411],{},"cargo-deny",": license\u002Fadvisory checks.",[165,1414,1415,1418],{},[50,1416,1417],{},"cargo-audit",": security advisories.",[165,1420,1421,1423],{},[50,1422,521],{},": faster tests.",[165,1425,1426,207,1429,1432],{},[50,1427,1428],{},"cargo-udeps",[50,1430,1431],{},"cargo-machete",": unused dep detection.",[165,1434,1435,1438],{},[50,1436,1437],{},"cargo-expand",": macro expansion.",[165,1440,1441,1444],{},[50,1442,1443],{},"cargo-bloat",": binary size analysis.",[165,1446,1447,1450],{},[50,1448,1449],{},"cargo-flamegraph",": profiling.",[165,1452,1453,1456],{},[50,1454,1455],{},"cargo-miri",": UB detection (nightly).",[165,1458,1459,1462],{},[50,1460,1461],{},"cross",": cross-compilation.",[165,1464,1465,1468],{},[50,1466,1467],{},"cargo-zigbuild",": Zig-backed cross-linker.",[165,1470,1471,1474],{},[50,1472,1473],{},"maturin",": Python package building.",[165,1476,1477,1480],{},[50,1478,1479],{},"napi-rs",": Node.js bindings.",[165,1482,1483,1485],{},[50,1484,1286],{},": WASM packaging.",[18,1487,1489],{"id":1488},"editor-support","Editor Support",[162,1491,1492,1498,1504],{},[165,1493,1494,1497],{},[50,1495,1496],{},"rust-analyzer",": official IDE server (VS Code, Vim, Emacs, Zed).",[165,1499,1500,1503],{},[50,1501,1502],{},"rustfmt",": formatter.",[165,1505,1506,1509],{},[50,1507,1508],{},"clippy",": linter.",[18,1511,1513],{"id":1512},"quality-lints","Quality Lints",[162,1515,1516,1522,1528,1534],{},[165,1517,1518,1521],{},[50,1519,1520],{},"clippy::all",": standard.",[165,1523,1524,1527],{},[50,1525,1526],{},"clippy::pedantic",": stricter.",[165,1529,1530,1533],{},[50,1531,1532],{},"clippy::nursery",": experimental.",[165,1535,1536,1539],{},[50,1537,1538],{},"clippy::cargo",": crate-level checks.",[18,1541,1543],{"id":1542},"ci-tools","CI Tools",[162,1545,1546,1551,1556,1562,1566],{},[165,1547,1548,1550],{},[50,1549,1411],{},": license + advisories + bans.",[165,1552,1553,1555],{},[50,1554,1417],{},": RustSec advisories.",[165,1557,1558,1561],{},[50,1559,1560],{},"cargo-hack",": feature matrix testing.",[165,1563,1564,534],{},[50,1565,533],{},[165,1567,1568,207,1571,1574],{},[50,1569,1570],{},"rust-toolchain",[50,1572,1573],{},"dtolnay\u002Frust-toolchain",": GitHub Actions setup.",[18,1576,1578],{"id":1577},"choosing-crates","Choosing Crates",[14,1580,1581],{},"Heuristics:",[162,1583,1584,1590,1597,1606,1612],{},[165,1585,1586,1587,1589],{},"Prefer std\u002F",[50,1588,317],{}," ecosystem.",[165,1591,1592,1593,1596],{},"Check ",[50,1594,1595],{},"crates.io"," for maintenance (last publish, downloads, open issues).",[165,1598,1599,1600,1602,1603,1605],{},"Prefer crates with ",[50,1601,578],{}," over ",[50,1604,586],{}," (no system dep).",[165,1607,1608,1609,1611],{},"Prefer ",[50,1610,202],{},"-based serialization.",[165,1613,1614,1615,1617,1618,1617,1620,1617,1622,1617,1624,1617,1626,1617,1628,1630,1631,1633],{},"For new projects: ",[50,1616,52],{}," + ",[50,1619,317],{},[50,1621,202],{},[50,1623,267],{},[50,1625,351],{},[50,1627,441],{},[50,1629,1028],{}," (app) or ",[50,1632,1018],{}," (lib).",[18,1635,1637],{"id":1636},"summary","Summary",[14,1639,1640,1641,1643,1644,1643,1646,1648,1649,1651,1652,1654,1655,1657,1658,1660,1661,207,1663,1665,1666,1668,1669,1671,1672,1671,1674,1671,1676,1671,1678,1680,1681,1683,1684,211],{},"Use the ecosystem; don't reinvent. The ",[50,1642,317],{},"-",[50,1645,202],{},[50,1647,143],{}," stack underlies most server-side Rust. For new projects: pick ",[50,1650,52],{}," (web), ",[50,1653,267],{}," (DB), ",[50,1656,351],{}," (CLI), ",[50,1659,441],{}," (logging), ",[50,1662,1028],{},[50,1664,1018],{}," (errors), ",[50,1667,202],{}," (serialization). For tools: ",[50,1670,1496],{},", ",[50,1673,1508],{},[50,1675,1411],{},[50,1677,521],{},[50,1679,1437],{},". For fuzzing: ",[50,1682,545],{},". For benchmarks: ",[50,1685,515],{},[14,1687,1688],{},"Next: Common pitfalls and idiomatic fixes.",{"title":1690,"searchDepth":1691,"depth":1691,"links":1692},"",2,[1693,1698,1699,1700,1701,1702,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733],{"id":20,"depth":1691,"text":21,"children":1694},[1695],{"id":139,"depth":1696,"text":1697},3,"Use with tower middleware",{"id":159,"depth":1691,"text":160},{"id":194,"depth":1691,"text":195},{"id":259,"depth":1691,"text":260},{"id":309,"depth":1691,"text":310},{"id":343,"depth":1691,"text":344,"children":1703},[1704],{"id":372,"depth":1696,"text":373},{"id":408,"depth":1691,"text":409},{"id":459,"depth":1691,"text":460},{"id":537,"depth":1691,"text":538},{"id":564,"depth":1691,"text":565},{"id":637,"depth":1691,"text":638},{"id":692,"depth":1691,"text":693},{"id":736,"depth":1691,"text":737},{"id":772,"depth":1691,"text":773},{"id":807,"depth":1691,"text":808},{"id":867,"depth":1691,"text":868},{"id":905,"depth":1691,"text":906},{"id":950,"depth":1691,"text":951},{"id":974,"depth":1691,"text":975},{"id":1010,"depth":1691,"text":1011},{"id":1046,"depth":1691,"text":1047},{"id":1082,"depth":1691,"text":1083},{"id":1138,"depth":1691,"text":1139},{"id":1194,"depth":1691,"text":1195},{"id":1218,"depth":1691,"text":1219},{"id":1251,"depth":1691,"text":1252},{"id":1272,"depth":1691,"text":1273},{"id":1323,"depth":1691,"text":1324},{"id":1361,"depth":1691,"text":1362},{"id":1397,"depth":1691,"text":1398},{"id":1488,"depth":1691,"text":1489},{"id":1512,"depth":1691,"text":1513},{"id":1542,"depth":1691,"text":1543},{"id":1577,"depth":1691,"text":1578},{"id":1636,"depth":1691,"text":1637},"md",{},true,"\u002Frust\u002F33-ecosystem",{"title":5,"description":16},"rust\u002F33-ecosystem","OQ_hn2B5C_NU7ksVrftHjUqMvqTtBqpmY7gz5MlJTRg",1785944093629]