[{"data":1,"prerenderedAt":1886},["ShallowReactive",2],{"navigation":3,"\u002Fintegrations\u002Fweb\u002Faxum":335,"\u002Fintegrations\u002Fweb\u002Faxum-surround":1881},[4,27,73,95,121,135,305,331],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":23,"path":24,"stem":25},"MSRV","\u002Fgetting-started\u002Fmsrv","1.getting-started\u002F9.msrv",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Schemas","i-lucide-shapes","\u002Fschemas","2.schemas",[33,37,41,45,49,53,57,61,65,69],{"title":34,"path":35,"stem":36},"Strings","\u002Fschemas\u002Fstrings","2.schemas\u002F1.strings",{"title":38,"path":39,"stem":40},"Custom rules","\u002Fschemas\u002Frules","2.schemas\u002F10.rules",{"title":42,"path":43,"stem":44},"Numbers","\u002Fschemas\u002Fnumbers","2.schemas\u002F2.numbers",{"title":46,"path":47,"stem":48},"Booleans, literals and enums","\u002Fschemas\u002Fprimitives","2.schemas\u002F3.primitives",{"title":50,"path":51,"stem":52},"Dates and times","\u002Fschemas\u002Fdates","2.schemas\u002F4.dates",{"title":54,"path":55,"stem":56},"Collections","\u002Fschemas\u002Fcollections","2.schemas\u002F5.collections",{"title":58,"path":59,"stem":60},"Dynamic objects","\u002Fschemas\u002Fobjects","2.schemas\u002F6.objects",{"title":62,"path":63,"stem":64},"Modifiers","\u002Fschemas\u002Fmodifiers","2.schemas\u002F7.modifiers",{"title":66,"path":67,"stem":68},"Combinators","\u002Fschemas\u002Fcombinators","2.schemas\u002F8.combinators",{"title":70,"path":71,"stem":72},"Other types","\u002Fschemas\u002Fspecial-types","2.schemas\u002F9.special-types",{"title":74,"icon":75,"path":76,"stem":77,"children":78,"page":26},"Structs","i-lucide-braces","\u002Fstructs","3.structs",[79,83,87,91],{"title":80,"path":81,"stem":82},"schema! macro","\u002Fstructs\u002Fschema-macro","3.structs\u002F1.schema-macro",{"title":84,"path":85,"stem":86},"#[derive(Validate)]","\u002Fstructs\u002Fderive","3.structs\u002F2.derive",{"title":88,"path":89,"stem":90},"Parse vs validate","\u002Fstructs\u002Fparse-vs-validate","3.structs\u002F3.parse-vs-validate",{"title":92,"path":93,"stem":94},"Lenient parsing","\u002Fstructs\u002Flenient","3.structs\u002F4.lenient",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":26},"Errors","i-lucide-triangle-alert","\u002Ferrors","4.errors",[101,105,109,113,117],{"title":102,"path":103,"stem":104},"Error model","\u002Ferrors\u002Foverview","4.errors\u002F1.overview",{"title":106,"path":107,"stem":108},"Issue codes","\u002Ferrors\u002Fissue-codes","4.errors\u002F2.issue-codes",{"title":110,"path":111,"stem":112},"Formatting","\u002Ferrors\u002Fformatting","4.errors\u002F3.formatting",{"title":114,"path":115,"stem":116},"Custom messages","\u002Ferrors\u002Fcustom-messages","4.errors\u002F4.custom-messages",{"title":118,"path":119,"stem":120},"Translations","\u002Ferrors\u002Fi18n","4.errors\u002F5.i18n",{"title":122,"icon":123,"path":124,"stem":125,"children":126,"page":26},"OpenAPI","i-lucide-file-json","\u002Fopenapi","5.openapi",[127,131],{"title":128,"path":129,"stem":130},"JSON Schema and OpenAPI","\u002Fopenapi\u002Fjson-schema","5.openapi\u002F1.json-schema",{"title":132,"path":133,"stem":134},"Schema diff","\u002Fopenapi\u002Fdiff","5.openapi\u002F2.diff",{"title":136,"icon":137,"path":138,"stem":139,"children":140,"page":26},"Integrations","i-lucide-plug","\u002Fintegrations","6.integrations",[141,191,209,223,245,259,273,291],{"title":142,"icon":143,"path":144,"stem":145,"children":146,"page":26},"Web frameworks","i-lucide-globe","\u002Fintegrations\u002Fweb","6.integrations\u002F1.web",[147,151,155,159,163,167,171,175,179,183,187],{"title":148,"path":149,"stem":150},"Web adapters overview","\u002Fintegrations\u002Fweb\u002Foverview","6.integrations\u002F1.web\u002F01.overview",{"title":152,"path":153,"stem":154},"vld-axum","\u002Fintegrations\u002Fweb\u002Faxum","6.integrations\u002F1.web\u002F02.axum",{"title":156,"path":157,"stem":158},"vld-actix","\u002Fintegrations\u002Fweb\u002Factix","6.integrations\u002F1.web\u002F03.actix",{"title":160,"path":161,"stem":162},"vld-ntex","\u002Fintegrations\u002Fweb\u002Fntex","6.integrations\u002F1.web\u002F04.ntex",{"title":164,"path":165,"stem":166},"vld-poem","\u002Fintegrations\u002Fweb\u002Fpoem","6.integrations\u002F1.web\u002F05.poem",{"title":168,"path":169,"stem":170},"vld-rama","\u002Fintegrations\u002Fweb\u002Frama","6.integrations\u002F1.web\u002F06.rama",{"title":172,"path":173,"stem":174},"vld-rocket","\u002Fintegrations\u002Fweb\u002Frocket","6.integrations\u002F1.web\u002F07.rocket",{"title":176,"path":177,"stem":178},"vld-salvo","\u002Fintegrations\u002Fweb\u002Fsalvo","6.integrations\u002F1.web\u002F08.salvo",{"title":180,"path":181,"stem":182},"vld-tower","\u002Fintegrations\u002Fweb\u002Ftower","6.integrations\u002F1.web\u002F09.tower",{"title":184,"path":185,"stem":186},"vld-warp","\u002Fintegrations\u002Fweb\u002Fwarp","6.integrations\u002F1.web\u002F10.warp",{"title":188,"path":189,"stem":190},"vld-tonic","\u002Fintegrations\u002Fweb\u002Ftonic","6.integrations\u002F1.web\u002F11.tonic",{"title":192,"icon":193,"path":194,"stem":195,"children":196,"page":26},"OpenAPI and JSON Schema","i-lucide-file-code","\u002Fintegrations\u002Fopenapi","6.integrations\u002F2.openapi",[197,201,205],{"title":198,"path":199,"stem":200},"vld-utoipa","\u002Fintegrations\u002Fopenapi\u002Futoipa","6.integrations\u002F2.openapi\u002F1.utoipa",{"title":202,"path":203,"stem":204},"vld-schemars","\u002Fintegrations\u002Fopenapi\u002Fschemars","6.integrations\u002F2.openapi\u002F2.schemars",{"title":206,"path":207,"stem":208},"vld-aide","\u002Fintegrations\u002Fopenapi\u002Faide","6.integrations\u002F2.openapi\u002F3.aide",{"title":210,"icon":211,"path":212,"stem":213,"children":214,"page":26},"Codegen and test data","i-lucide-wand","\u002Fintegrations\u002Fcodegen","6.integrations\u002F3.codegen",[215,219],{"title":216,"path":217,"stem":218},"vld-ts","\u002Fintegrations\u002Fcodegen\u002Fts","6.integrations\u002F3.codegen\u002F1.ts",{"title":220,"path":221,"stem":222},"vld-fake","\u002Fintegrations\u002Fcodegen\u002Ffake","6.integrations\u002F3.codegen\u002F2.fake",{"title":224,"icon":225,"path":226,"stem":227,"children":228,"page":26},"Databases","i-lucide-database","\u002Fintegrations\u002Fdatabase","6.integrations\u002F4.database",[229,233,237,241],{"title":230,"path":231,"stem":232},"vld-sqlx","\u002Fintegrations\u002Fdatabase\u002Fsqlx","6.integrations\u002F4.database\u002F1.sqlx",{"title":234,"path":235,"stem":236},"vld-diesel","\u002Fintegrations\u002Fdatabase\u002Fdiesel","6.integrations\u002F4.database\u002F2.diesel",{"title":238,"path":239,"stem":240},"vld-sea","\u002Fintegrations\u002Fdatabase\u002Fsea-orm","6.integrations\u002F4.database\u002F3.sea-orm",{"title":242,"path":243,"stem":244},"vld-surrealdb","\u002Fintegrations\u002Fdatabase\u002Fsurrealdb","6.integrations\u002F4.database\u002F4.surrealdb",{"title":246,"icon":247,"path":248,"stem":249,"children":250,"page":26},"Messaging","i-lucide-mail","\u002Fintegrations\u002Fmessaging","6.integrations\u002F5.messaging",[251,255],{"title":252,"path":253,"stem":254},"vld-redis","\u002Fintegrations\u002Fmessaging\u002Fredis","6.integrations\u002F5.messaging\u002F1.redis",{"title":256,"path":257,"stem":258},"vld-lapin","\u002Fintegrations\u002Fmessaging\u002Flapin","6.integrations\u002F5.messaging\u002F2.lapin",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":26},"Config and CLI","i-lucide-terminal","\u002Fintegrations\u002Fconfig-cli","6.integrations\u002F6.config-cli",[265,269],{"title":266,"path":267,"stem":268},"vld-config","\u002Fintegrations\u002Fconfig-cli\u002Fconfig","6.integrations\u002F6.config-cli\u002F1.config",{"title":270,"path":271,"stem":272},"vld-clap","\u002Fintegrations\u002Fconfig-cli\u002Fclap","6.integrations\u002F6.config-cli\u002F2.clap",{"title":274,"icon":275,"path":276,"stem":277,"children":278,"page":26},"UI frameworks","i-lucide-monitor","\u002Fintegrations\u002Fui","6.integrations\u002F7.ui",[279,283,287],{"title":280,"path":281,"stem":282},"vld-dioxus","\u002Fintegrations\u002Fui\u002Fdioxus","6.integrations\u002F7.ui\u002F1.dioxus",{"title":284,"path":285,"stem":286},"vld-leptos","\u002Fintegrations\u002Fui\u002Fleptos","6.integrations\u002F7.ui\u002F2.leptos",{"title":288,"path":289,"stem":290},"vld-tauri","\u002Fintegrations\u002Fui\u002Ftauri","6.integrations\u002F7.ui\u002F3.tauri",{"title":292,"icon":293,"path":294,"stem":295,"children":296,"page":26},"Shared crates","i-lucide-package","\u002Fintegrations\u002Fshared","6.integrations\u002F8.shared",[297,301],{"title":298,"path":299,"stem":300},"vld-http-common","\u002Fintegrations\u002Fshared\u002Fhttp-common","6.integrations\u002F8.shared\u002F1.http-common",{"title":302,"path":303,"stem":304},"vld-integration-common","\u002Fintegrations\u002Fshared\u002Fintegration-common","6.integrations\u002F8.shared\u002F2.integration-common",{"title":306,"icon":307,"path":308,"stem":309,"children":310,"page":26},"Guides","i-lucide-book-open","\u002Fguides","7.guides",[311,315,319,323,327],{"title":312,"path":313,"stem":314},"Migration","\u002Fguides\u002Fmigration","7.guides\u002F1.migration",{"title":316,"path":317,"stem":318},"Security notes","\u002Fguides\u002Fsecurity","7.guides\u002F2.security",{"title":320,"path":321,"stem":322},"Performance","\u002Fguides\u002Fperformance","7.guides\u002F3.performance",{"title":324,"path":325,"stem":326},"Contributing","\u002Fguides\u002Fcontributing","7.guides\u002F4.contributing",{"title":328,"path":329,"stem":330},"FAQ","\u002Fguides\u002Ffaq","7.guides\u002F5.faq",{"title":332,"path":333,"stem":334},"Changelog","\u002Fchangelog","9.changelog",{"id":336,"title":152,"body":337,"description":1867,"extension":1868,"links":1869,"meta":1878,"navigation":530,"path":153,"seo":1879,"stem":154,"__hash__":1880},"docs\u002F6.integrations\u002F1.web\u002F02.axum.md",{"type":338,"value":339,"toc":1860},"minimark",[340,365,370,445,455,459,1444,1494,1511,1515,1670,1695,1699,1714,1816,1820,1856],[341,342,343,344,348,349,348,352,355,356,359,360,364],"p",{},"Drop-in replacements for axum's ",[345,346,347],"code",{},"Json",", ",[345,350,351],{},"Query",[345,353,354],{},"Path"," and ",[345,357,358],{},"Form",", plus header and cookie extractors. Behaviour shared with the other adapters (status codes, error body, coercion, header\u002Fcookie rules) is described in the ",[361,362,363],"a",{"href":149},"web adapters overview",".",[366,367,369],"h2",{"id":368},"install","Install",[371,372,378],"pre",{"className":373,"code":374,"filename":375,"language":376,"meta":377,"style":377},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[dependencies]\nvld = \"0.5\"\nvld-axum = \"0.5\"\naxum = \"0.8\"\n","Cargo.toml","toml","",[345,379,380,396,416,430],{"__ignoreMap":377},[381,382,385,389,393],"span",{"class":383,"line":384},"line",1,[381,386,388],{"class":387},"sMK4o","[",[381,390,392],{"class":391},"sBMFI","dependencies",[381,394,395],{"class":387},"]\n",[381,397,399,403,406,409,413],{"class":383,"line":398},2,[381,400,402],{"class":401},"sTEyZ","vld ",[381,404,405],{"class":387},"=",[381,407,408],{"class":387}," \"",[381,410,412],{"class":411},"sfazB","0.5",[381,414,415],{"class":387},"\"\n",[381,417,419,422,424,426,428],{"class":383,"line":418},3,[381,420,421],{"class":401},"vld-axum ",[381,423,405],{"class":387},[381,425,408],{"class":387},[381,427,412],{"class":411},[381,429,415],{"class":387},[381,431,433,436,438,440,443],{"class":383,"line":432},4,[381,434,435],{"class":401},"axum ",[381,437,405],{"class":387},[381,439,408],{"class":387},[381,441,442],{"class":411},"0.8",[381,444,415],{"class":387},[341,446,447,448,451,452,454],{},"No features. Works with axum ",[449,450,442],"strong",{},". MSRV 1.85 (see ",[361,453,23],{"href":24},").",[366,456,458],{"id":457},"example","Example",[371,460,465],{"className":461,"code":462,"filename":463,"language":464,"meta":377,"style":377},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use axum::{routing::{get, post}, Router};\nuse vld_axum::{VldJson, VldPath, VldQuery};\n\nvld::schema! {\n    #[derive(Debug)]\n    pub struct CreateUser {\n        pub name: String => vld::string().min(2).max(50),\n        pub email: String => vld::string().email(),\n        pub age: Option\u003Ci64> => vld::number().int().min(0).max(150).optional(),\n    }\n}\n\nvld::schema! {\n    #[derive(Debug)]\n    pub struct UserPath {\n        pub id: i64 => vld::number().int().min(1),\n    }\n}\n\nvld::schema! {\n    #[derive(Debug)]\n    pub struct Search {\n        pub q: String => vld::string().min(1).max(200),\n        pub page: Option\u003Ci64> => vld::number().int().min(1).optional(),\n    }\n}\n\nasync fn create_user(VldJson(user): VldJson\u003CCreateUser>) -> String {\n    format!(\"created {}\", user.name)\n}\n\nasync fn get_user(VldPath(path): VldPath\u003CUserPath>) -> String {\n    format!(\"user #{}\", path.id)\n}\n\nasync fn search(VldQuery(q): VldQuery\u003CSearch>) -> String {\n    format!(\"{} (page {})\", q.q, q.page.unwrap_or(1))\n}\n\n#[tokio::main]\nasync fn main() {\n    let app = Router::new()\n        .route(\"\u002Fusers\", post(create_user))\n        .route(\"\u002Fusers\u002F{id}\", get(get_user))\n        .route(\"\u002Fsearch\", get(search));\n\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:3000\").await.unwrap();\n    axum::serve(listener, app).await.unwrap();\n}\n","main.rs","rust",[345,466,467,502,526,532,547,565,580,630,658,719,725,731,736,747,760,772,808,813,818,823,834,847,859,898,942,947,952,957,999,1029,1034,1039,1076,1102,1107,1112,1149,1199,1204,1209,1225,1240,1261,1290,1324,1352,1357,1408,1439],{"__ignoreMap":377},[381,468,469,473,476,479,482,484,487,490,493,496,499],{"class":383,"line":384},[381,470,472],{"class":471},"sbssI","use",[381,474,475],{"class":391}," axum",[381,477,478],{"class":387},"::{",[381,480,481],{"class":391},"routing",[381,483,478],{"class":387},[381,485,486],{"class":391},"get",[381,488,489],{"class":387},",",[381,491,492],{"class":391}," post",[381,494,495],{"class":387},"},",[381,497,498],{"class":391}," Router",[381,500,501],{"class":387},"};\n",[381,503,504,506,509,511,514,516,519,521,524],{"class":383,"line":398},[381,505,472],{"class":471},[381,507,508],{"class":391}," vld_axum",[381,510,478],{"class":387},[381,512,513],{"class":391},"VldJson",[381,515,489],{"class":387},[381,517,518],{"class":391}," VldPath",[381,520,489],{"class":387},[381,522,523],{"class":391}," VldQuery",[381,525,501],{"class":387},[381,527,528],{"class":383,"line":418},[381,529,531],{"emptyLinePlaceholder":530},true,"\n",[381,533,534,537,540,544],{"class":383,"line":432},[381,535,536],{"class":391},"vld",[381,538,539],{"class":387},"::",[381,541,543],{"class":542},"s2Zo4","schema!",[381,545,546],{"class":387}," {\n",[381,548,550,553,556,559,562],{"class":383,"line":549},5,[381,551,552],{"class":387},"    #[",[381,554,555],{"class":401},"derive",[381,557,558],{"class":387},"(",[381,560,561],{"class":391},"Debug",[381,563,564],{"class":387},")]\n",[381,566,568,572,575,578],{"class":383,"line":567},6,[381,569,571],{"class":570},"spNyl","    pub",[381,573,574],{"class":570}," struct",[381,576,577],{"class":391}," CreateUser",[381,579,546],{"class":387},[381,581,583,586,589,592,595,598,601,603,606,609,612,614,617,619,622,624,627],{"class":383,"line":582},7,[381,584,585],{"class":570},"        pub",[381,587,588],{"class":401}," name",[381,590,591],{"class":387},":",[381,593,594],{"class":391}," String",[381,596,597],{"class":387}," =>",[381,599,600],{"class":391}," vld",[381,602,539],{"class":387},[381,604,605],{"class":542},"string",[381,607,608],{"class":387},"().",[381,610,611],{"class":542},"min",[381,613,558],{"class":387},[381,615,616],{"class":471},"2",[381,618,454],{"class":387},[381,620,621],{"class":542},"max",[381,623,558],{"class":387},[381,625,626],{"class":471},"50",[381,628,629],{"class":387},"),\n",[381,631,633,635,638,640,642,644,646,648,650,652,655],{"class":383,"line":632},8,[381,634,585],{"class":570},[381,636,637],{"class":401}," email",[381,639,591],{"class":387},[381,641,594],{"class":391},[381,643,597],{"class":387},[381,645,600],{"class":391},[381,647,539],{"class":387},[381,649,605],{"class":542},[381,651,608],{"class":387},[381,653,654],{"class":542},"email",[381,656,657],{"class":387},"(),\n",[381,659,661,663,666,668,671,674,677,680,682,684,686,689,691,694,696,698,700,703,705,707,709,712,714,717],{"class":383,"line":660},9,[381,662,585],{"class":570},[381,664,665],{"class":401}," age",[381,667,591],{"class":387},[381,669,670],{"class":391}," Option",[381,672,673],{"class":387},"\u003C",[381,675,676],{"class":391},"i64",[381,678,679],{"class":387},">",[381,681,597],{"class":387},[381,683,600],{"class":391},[381,685,539],{"class":387},[381,687,688],{"class":542},"number",[381,690,608],{"class":387},[381,692,693],{"class":542},"int",[381,695,608],{"class":387},[381,697,611],{"class":542},[381,699,558],{"class":387},[381,701,702],{"class":471},"0",[381,704,454],{"class":387},[381,706,621],{"class":542},[381,708,558],{"class":387},[381,710,711],{"class":471},"150",[381,713,454],{"class":387},[381,715,716],{"class":542},"optional",[381,718,657],{"class":387},[381,720,722],{"class":383,"line":721},10,[381,723,724],{"class":387},"    }\n",[381,726,728],{"class":383,"line":727},11,[381,729,730],{"class":387},"}\n",[381,732,734],{"class":383,"line":733},12,[381,735,531],{"emptyLinePlaceholder":530},[381,737,739,741,743,745],{"class":383,"line":738},13,[381,740,536],{"class":391},[381,742,539],{"class":387},[381,744,543],{"class":542},[381,746,546],{"class":387},[381,748,750,752,754,756,758],{"class":383,"line":749},14,[381,751,552],{"class":387},[381,753,555],{"class":401},[381,755,558],{"class":387},[381,757,561],{"class":391},[381,759,564],{"class":387},[381,761,763,765,767,770],{"class":383,"line":762},15,[381,764,571],{"class":570},[381,766,574],{"class":570},[381,768,769],{"class":391}," UserPath",[381,771,546],{"class":387},[381,773,775,777,780,782,785,787,789,791,793,795,797,799,801,803,806],{"class":383,"line":774},16,[381,776,585],{"class":570},[381,778,779],{"class":401}," id",[381,781,591],{"class":387},[381,783,784],{"class":391}," i64",[381,786,597],{"class":387},[381,788,600],{"class":391},[381,790,539],{"class":387},[381,792,688],{"class":542},[381,794,608],{"class":387},[381,796,693],{"class":542},[381,798,608],{"class":387},[381,800,611],{"class":542},[381,802,558],{"class":387},[381,804,805],{"class":471},"1",[381,807,629],{"class":387},[381,809,811],{"class":383,"line":810},17,[381,812,724],{"class":387},[381,814,816],{"class":383,"line":815},18,[381,817,730],{"class":387},[381,819,821],{"class":383,"line":820},19,[381,822,531],{"emptyLinePlaceholder":530},[381,824,826,828,830,832],{"class":383,"line":825},20,[381,827,536],{"class":391},[381,829,539],{"class":387},[381,831,543],{"class":542},[381,833,546],{"class":387},[381,835,837,839,841,843,845],{"class":383,"line":836},21,[381,838,552],{"class":387},[381,840,555],{"class":401},[381,842,558],{"class":387},[381,844,561],{"class":391},[381,846,564],{"class":387},[381,848,850,852,854,857],{"class":383,"line":849},22,[381,851,571],{"class":570},[381,853,574],{"class":570},[381,855,856],{"class":391}," Search",[381,858,546],{"class":387},[381,860,862,864,867,869,871,873,875,877,879,881,883,885,887,889,891,893,896],{"class":383,"line":861},23,[381,863,585],{"class":570},[381,865,866],{"class":401}," q",[381,868,591],{"class":387},[381,870,594],{"class":391},[381,872,597],{"class":387},[381,874,600],{"class":391},[381,876,539],{"class":387},[381,878,605],{"class":542},[381,880,608],{"class":387},[381,882,611],{"class":542},[381,884,558],{"class":387},[381,886,805],{"class":471},[381,888,454],{"class":387},[381,890,621],{"class":542},[381,892,558],{"class":387},[381,894,895],{"class":471},"200",[381,897,629],{"class":387},[381,899,901,903,906,908,910,912,914,916,918,920,922,924,926,928,930,932,934,936,938,940],{"class":383,"line":900},24,[381,902,585],{"class":570},[381,904,905],{"class":401}," page",[381,907,591],{"class":387},[381,909,670],{"class":391},[381,911,673],{"class":387},[381,913,676],{"class":391},[381,915,679],{"class":387},[381,917,597],{"class":387},[381,919,600],{"class":391},[381,921,539],{"class":387},[381,923,688],{"class":542},[381,925,608],{"class":387},[381,927,693],{"class":542},[381,929,608],{"class":387},[381,931,611],{"class":542},[381,933,558],{"class":387},[381,935,805],{"class":471},[381,937,454],{"class":387},[381,939,716],{"class":542},[381,941,657],{"class":387},[381,943,945],{"class":383,"line":944},25,[381,946,724],{"class":387},[381,948,950],{"class":383,"line":949},26,[381,951,730],{"class":387},[381,953,955],{"class":383,"line":954},27,[381,956,531],{"emptyLinePlaceholder":530},[381,958,960,963,966,969,971,973,975,978,981,984,986,989,992,995,997],{"class":383,"line":959},28,[381,961,962],{"class":471},"async",[381,964,965],{"class":471}," fn",[381,967,968],{"class":542}," create_user",[381,970,558],{"class":387},[381,972,513],{"class":542},[381,974,558],{"class":387},[381,976,977],{"class":401},"user",[381,979,980],{"class":387},"):",[381,982,983],{"class":391}," VldJson",[381,985,673],{"class":387},[381,987,988],{"class":391},"CreateUser",[381,990,991],{"class":387},">)",[381,993,994],{"class":387}," ->",[381,996,594],{"class":391},[381,998,546],{"class":387},[381,1000,1002,1005,1007,1010,1013,1016,1018,1021,1023,1026],{"class":383,"line":1001},29,[381,1003,1004],{"class":542},"    format!",[381,1006,558],{"class":387},[381,1008,1009],{"class":387},"\"",[381,1011,1012],{"class":411},"created ",[381,1014,1015],{"class":387},"{}\"",[381,1017,489],{"class":387},[381,1019,1020],{"class":401}," user",[381,1022,364],{"class":387},[381,1024,1025],{"class":401},"name",[381,1027,1028],{"class":387},")\n",[381,1030,1032],{"class":383,"line":1031},30,[381,1033,730],{"class":387},[381,1035,1037],{"class":383,"line":1036},31,[381,1038,531],{"emptyLinePlaceholder":530},[381,1040,1042,1044,1046,1049,1051,1054,1056,1059,1061,1063,1065,1068,1070,1072,1074],{"class":383,"line":1041},32,[381,1043,962],{"class":471},[381,1045,965],{"class":471},[381,1047,1048],{"class":542}," get_user",[381,1050,558],{"class":387},[381,1052,1053],{"class":542},"VldPath",[381,1055,558],{"class":387},[381,1057,1058],{"class":401},"path",[381,1060,980],{"class":387},[381,1062,518],{"class":391},[381,1064,673],{"class":387},[381,1066,1067],{"class":391},"UserPath",[381,1069,991],{"class":387},[381,1071,994],{"class":387},[381,1073,594],{"class":391},[381,1075,546],{"class":387},[381,1077,1079,1081,1083,1085,1088,1090,1092,1095,1097,1100],{"class":383,"line":1078},33,[381,1080,1004],{"class":542},[381,1082,558],{"class":387},[381,1084,1009],{"class":387},[381,1086,1087],{"class":411},"user #",[381,1089,1015],{"class":387},[381,1091,489],{"class":387},[381,1093,1094],{"class":401}," path",[381,1096,364],{"class":387},[381,1098,1099],{"class":401},"id",[381,1101,1028],{"class":387},[381,1103,1105],{"class":383,"line":1104},34,[381,1106,730],{"class":387},[381,1108,1110],{"class":383,"line":1109},35,[381,1111,531],{"emptyLinePlaceholder":530},[381,1113,1115,1117,1119,1122,1124,1127,1129,1132,1134,1136,1138,1141,1143,1145,1147],{"class":383,"line":1114},36,[381,1116,962],{"class":471},[381,1118,965],{"class":471},[381,1120,1121],{"class":542}," search",[381,1123,558],{"class":387},[381,1125,1126],{"class":542},"VldQuery",[381,1128,558],{"class":387},[381,1130,1131],{"class":401},"q",[381,1133,980],{"class":387},[381,1135,523],{"class":391},[381,1137,673],{"class":387},[381,1139,1140],{"class":391},"Search",[381,1142,991],{"class":387},[381,1144,994],{"class":387},[381,1146,594],{"class":391},[381,1148,546],{"class":387},[381,1150,1152,1154,1156,1159,1162,1165,1168,1170,1172,1174,1176,1178,1180,1182,1184,1187,1189,1192,1194,1196],{"class":383,"line":1151},37,[381,1153,1004],{"class":542},[381,1155,558],{"class":387},[381,1157,1158],{"class":387},"\"{}",[381,1160,1161],{"class":411}," (page ",[381,1163,1164],{"class":387},"{}",[381,1166,1167],{"class":411},")",[381,1169,1009],{"class":387},[381,1171,489],{"class":387},[381,1173,866],{"class":401},[381,1175,364],{"class":387},[381,1177,1131],{"class":401},[381,1179,489],{"class":387},[381,1181,866],{"class":401},[381,1183,364],{"class":387},[381,1185,1186],{"class":401},"page",[381,1188,364],{"class":387},[381,1190,1191],{"class":542},"unwrap_or",[381,1193,558],{"class":387},[381,1195,805],{"class":471},[381,1197,1198],{"class":387},"))\n",[381,1200,1202],{"class":383,"line":1201},38,[381,1203,730],{"class":387},[381,1205,1207],{"class":383,"line":1206},39,[381,1208,531],{"emptyLinePlaceholder":530},[381,1210,1212,1215,1218,1220,1223],{"class":383,"line":1211},40,[381,1213,1214],{"class":387},"#[",[381,1216,1217],{"class":401},"tokio",[381,1219,539],{"class":387},[381,1221,1222],{"class":401},"main",[381,1224,395],{"class":387},[381,1226,1228,1230,1232,1235,1238],{"class":383,"line":1227},41,[381,1229,962],{"class":471},[381,1231,965],{"class":471},[381,1233,1234],{"class":542}," main",[381,1236,1237],{"class":387},"()",[381,1239,546],{"class":387},[381,1241,1243,1246,1249,1251,1253,1255,1258],{"class":383,"line":1242},42,[381,1244,1245],{"class":570},"    let",[381,1247,1248],{"class":401}," app ",[381,1250,405],{"class":387},[381,1252,498],{"class":391},[381,1254,539],{"class":387},[381,1256,1257],{"class":542},"new",[381,1259,1260],{"class":387},"()\n",[381,1262,1264,1267,1270,1272,1274,1277,1279,1281,1283,1285,1288],{"class":383,"line":1263},43,[381,1265,1266],{"class":387},"        .",[381,1268,1269],{"class":542},"route",[381,1271,558],{"class":387},[381,1273,1009],{"class":387},[381,1275,1276],{"class":411},"\u002Fusers",[381,1278,1009],{"class":387},[381,1280,489],{"class":387},[381,1282,492],{"class":542},[381,1284,558],{"class":387},[381,1286,1287],{"class":401},"create_user",[381,1289,1198],{"class":387},[381,1291,1293,1295,1297,1299,1301,1304,1307,1309,1312,1314,1317,1319,1322],{"class":383,"line":1292},44,[381,1294,1266],{"class":387},[381,1296,1269],{"class":542},[381,1298,558],{"class":387},[381,1300,1009],{"class":387},[381,1302,1303],{"class":411},"\u002Fusers\u002F",[381,1305,1306],{"class":387},"{",[381,1308,1099],{"class":411},[381,1310,1311],{"class":387},"}\"",[381,1313,489],{"class":387},[381,1315,1316],{"class":542}," get",[381,1318,558],{"class":387},[381,1320,1321],{"class":401},"get_user",[381,1323,1198],{"class":387},[381,1325,1327,1329,1331,1333,1335,1338,1340,1342,1344,1346,1349],{"class":383,"line":1326},45,[381,1328,1266],{"class":387},[381,1330,1269],{"class":542},[381,1332,558],{"class":387},[381,1334,1009],{"class":387},[381,1336,1337],{"class":411},"\u002Fsearch",[381,1339,1009],{"class":387},[381,1341,489],{"class":387},[381,1343,1316],{"class":542},[381,1345,558],{"class":387},[381,1347,1348],{"class":401},"search",[381,1350,1351],{"class":387},"));\n",[381,1353,1355],{"class":383,"line":1354},46,[381,1356,531],{"emptyLinePlaceholder":530},[381,1358,1360,1362,1365,1367,1370,1372,1375,1377,1380,1382,1385,1387,1389,1392,1394,1396,1400,1402,1405],{"class":383,"line":1359},47,[381,1361,1245],{"class":570},[381,1363,1364],{"class":401}," listener ",[381,1366,405],{"class":387},[381,1368,1369],{"class":391}," tokio",[381,1371,539],{"class":387},[381,1373,1374],{"class":391},"net",[381,1376,539],{"class":387},[381,1378,1379],{"class":391},"TcpListener",[381,1381,539],{"class":387},[381,1383,1384],{"class":542},"bind",[381,1386,558],{"class":387},[381,1388,1009],{"class":387},[381,1390,1391],{"class":411},"127.0.0.1:3000",[381,1393,1009],{"class":387},[381,1395,454],{"class":387},[381,1397,1399],{"class":1398},"s7zQu","await",[381,1401,364],{"class":387},[381,1403,1404],{"class":542},"unwrap",[381,1406,1407],{"class":387},"();\n",[381,1409,1411,1414,1416,1419,1421,1424,1426,1429,1431,1433,1435,1437],{"class":383,"line":1410},48,[381,1412,1413],{"class":391},"    axum",[381,1415,539],{"class":387},[381,1417,1418],{"class":542},"serve",[381,1420,558],{"class":387},[381,1422,1423],{"class":401},"listener",[381,1425,489],{"class":387},[381,1427,1428],{"class":401}," app",[381,1430,454],{"class":387},[381,1432,1399],{"class":1398},[381,1434,364],{"class":387},[381,1436,1404],{"class":542},[381,1438,1407],{"class":387},[381,1440,1442],{"class":383,"line":1441},49,[381,1443,730],{"class":387},[371,1445,1449],{"className":1446,"code":1447,"language":1448,"meta":377,"style":377},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST localhost:3000\u002Fusers -H 'content-type: application\u002Fjson' -d '{\"name\":\"A\",\"email\":\"bad\"}'\n# 422 {\"error\":\"Validation failed\",\"issues\":[{\"path\":\".name\",...,\"code\":\"too_small\"},{\"path\":\".email\",...,\"code\":\"invalid_email\"}]}\n","bash",[345,1450,1451,1488],{"__ignoreMap":377},[381,1452,1453,1456,1459,1462,1465,1468,1471,1474,1477,1480,1482,1485],{"class":383,"line":384},[381,1454,1455],{"class":391},"curl",[381,1457,1458],{"class":411}," -X",[381,1460,1461],{"class":411}," POST",[381,1463,1464],{"class":411}," localhost:3000\u002Fusers",[381,1466,1467],{"class":411}," -H",[381,1469,1470],{"class":387}," '",[381,1472,1473],{"class":411},"content-type: application\u002Fjson",[381,1475,1476],{"class":387},"'",[381,1478,1479],{"class":411}," -d",[381,1481,1470],{"class":387},[381,1483,1484],{"class":411},"{\"name\":\"A\",\"email\":\"bad\"}",[381,1486,1487],{"class":387},"'\n",[381,1489,1490],{"class":383,"line":398},[381,1491,1493],{"class":1492},"sHwdD","# 422 {\"error\":\"Validation failed\",\"issues\":[{\"path\":\".name\",...,\"code\":\"too_small\"},{\"path\":\".email\",...,\"code\":\"invalid_email\"}]}\n",[341,1495,1496,1497,1500,1501,1504,1505,1508,1509,364],{},"The full example with all six extractors is ",[345,1498,1499],{},"crates\u002Fvld-axum\u002Fexamples\u002Faxum_basic.rs"," (",[345,1502,1503],{},"cargo run -p vld-axum --example axum_basic","); ",[345,1506,1507],{},"axum_openapi.rs"," adds ",[361,1510,198],{"href":199},[366,1512,1514],{"id":1513},"api","API",[1516,1517,1518,1531],"table",{},[1519,1520,1521],"thead",{},[1522,1523,1524,1528],"tr",{},[1525,1526,1527],"th",{},"Item",[1525,1529,1530],{},"Description",[1532,1533,1534,1552,1565,1585,1601,1618,1632,1655],"tbody",{},[1522,1535,1536,1542],{},[1537,1538,1539],"td",{},[345,1540,1541],{},"VldJson\u003CT>",[1537,1543,1544,1545,1548,1549],{},"JSON body (requires a JSON ",[345,1546,1547],{},"Content-Type","); replaces ",[345,1550,1551],{},"axum::Json\u003CT>",[1522,1553,1554,1559],{},[1537,1555,1556],{},[345,1557,1558],{},"VldQuery\u003CT>",[1537,1560,1561,1562],{},"Query string; replaces ",[345,1563,1564],{},"axum::extract::Query\u003CT>",[1522,1566,1567,1572],{},[1537,1568,1569],{},[345,1570,1571],{},"VldPath\u003CT>",[1537,1573,1574,1575,1578,1579,1548,1582],{},"Path parameters (",[345,1576,1577],{},"\u002Fusers\u002F{id}",", wildcards ",[345,1580,1581],{},"{*rest}",[345,1583,1584],{},"axum::extract::Path\u003CT>",[1522,1586,1587,1592],{},[1537,1588,1589],{},[345,1590,1591],{},"VldForm\u003CT>",[1537,1593,1594,1597,1598],{},[345,1595,1596],{},"application\u002Fx-www-form-urlencoded"," body; replaces ",[345,1599,1600],{},"axum::extract::Form\u003CT>",[1522,1602,1603,1608],{},[1537,1604,1605],{},[345,1606,1607],{},"VldHeaders\u003CT>",[1537,1609,1610,1611,1614,1615,1167],{},"Request headers (",[345,1612,1613],{},"X-Request-Id"," → ",[345,1616,1617],{},"x_request_id",[1522,1619,1620,1625],{},[1537,1621,1622],{},[345,1623,1624],{},"VldCookie\u003CT>",[1537,1626,1627,1628,1631],{},"Cookies from all ",[345,1629,1630],{},"Cookie"," headers",[1522,1633,1634,1639],{},[1537,1635,1636],{},[345,1637,1638],{},"VldJsonRejection",[1537,1640,1641,1642,348,1645,348,1648,1651,1652],{},"Rejection of every extractor: ",[345,1643,1644],{},"status()",[345,1646,1647],{},"body()",[345,1649,1650],{},"error()","; implements ",[345,1653,1654],{},"IntoResponse",[1522,1656,1657,1662],{},[1537,1658,1659],{},[345,1660,1661],{},"prelude",[1537,1663,1664,1665,355,1667],{},"The extractors, ",[345,1666,1638],{},[345,1668,1669],{},"vld::prelude::*",[341,1671,1672,1673,1676,1677,1680,1681,1684,1685,1688,1689,355,1691,1694],{},"All extractors are tuple structs (",[345,1674,1675],{},"VldJson(pub T)",") and implement ",[345,1678,1679],{},"Deref"," \u002F ",[345,1682,1683],{},"DerefMut"," to ",[345,1686,1687],{},"T",". ",[345,1690,513],{},[345,1692,1693],{},"VldForm"," consume the body, so put them last in the handler's arguments, as with axum's own extractors.",[366,1696,1698],{"id":1697},"body-limit","Body limit",[341,1700,1701,355,1703,1705,1706,1709,1710,1713],{},[345,1702,513],{},[345,1704,1693],{}," read the body through axum's ",[345,1707,1708],{},"Bytes"," extractor, so axum's ",[345,1711,1712],{},"DefaultBodyLimit"," applies (2 MiB by default):",[371,1715,1717],{"className":461,"code":1716,"language":464,"meta":377,"style":377},"use axum::extract::DefaultBodyLimit;\n\nlet app = Router::new()\n    .route(\"\u002Fupload\", post(create_user))\n    .layer(DefaultBodyLimit::max(8 * 1024 * 1024));\n",[345,1718,1719,1737,1741,1758,1784],{"__ignoreMap":377},[381,1720,1721,1723,1725,1727,1730,1732,1734],{"class":383,"line":384},[381,1722,472],{"class":471},[381,1724,475],{"class":391},[381,1726,539],{"class":387},[381,1728,1729],{"class":391},"extract",[381,1731,539],{"class":387},[381,1733,1712],{"class":391},[381,1735,1736],{"class":387},";\n",[381,1738,1739],{"class":383,"line":398},[381,1740,531],{"emptyLinePlaceholder":530},[381,1742,1743,1746,1748,1750,1752,1754,1756],{"class":383,"line":418},[381,1744,1745],{"class":570},"let",[381,1747,1248],{"class":401},[381,1749,405],{"class":387},[381,1751,498],{"class":391},[381,1753,539],{"class":387},[381,1755,1257],{"class":542},[381,1757,1260],{"class":387},[381,1759,1760,1763,1765,1767,1769,1772,1774,1776,1778,1780,1782],{"class":383,"line":432},[381,1761,1762],{"class":387},"    .",[381,1764,1269],{"class":542},[381,1766,558],{"class":387},[381,1768,1009],{"class":387},[381,1770,1771],{"class":411},"\u002Fupload",[381,1773,1009],{"class":387},[381,1775,489],{"class":387},[381,1777,492],{"class":542},[381,1779,558],{"class":387},[381,1781,1287],{"class":401},[381,1783,1198],{"class":387},[381,1785,1786,1788,1791,1793,1795,1797,1799,1801,1804,1807,1810,1812,1814],{"class":383,"line":549},[381,1787,1762],{"class":387},[381,1789,1790],{"class":542},"layer",[381,1792,558],{"class":387},[381,1794,1712],{"class":391},[381,1796,539],{"class":387},[381,1798,621],{"class":542},[381,1800,558],{"class":387},[381,1802,1803],{"class":471},"8",[381,1805,1806],{"class":387}," *",[381,1808,1809],{"class":471}," 1024",[381,1811,1806],{"class":387},[381,1813,1809],{"class":471},[381,1815,1351],{"class":387},[366,1817,1819],{"id":1818},"gotchas","Gotchas",[1821,1822,1823,1836,1843],"ul",{},[1824,1825,1826,1828,1829,1832,1833,1835],"li",{},[345,1827,1638],{}," is the rejection of ",[449,1830,1831],{},"all"," extractors, not only ",[345,1834,513],{}," (the name is historical).",[1824,1837,1838,1839,1842],{},"Path parameters that are not valid UTF-8 after percent-decoding are decoded lossily (",[345,1840,1841],{},"U+FFFD",") instead of failing the request with axum's 400.",[1824,1844,1845,1846,1849,1850,355,1853,364],{},"Custom error responses: take ",[345,1847,1848],{},"Result\u003CVldJson\u003CT>, VldJsonRejection>"," as the argument and build your own response from ",[345,1851,1852],{},"rejection.status()",[345,1854,1855],{},"rejection.error()",[1857,1858,1859],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":377,"searchDepth":398,"depth":418,"links":1861},[1862,1863,1864,1865,1866],{"id":368,"depth":398,"text":369},{"id":457,"depth":398,"text":458},{"id":1513,"depth":398,"text":1514},{"id":1697,"depth":398,"text":1698},{"id":1818,"depth":398,"text":1819},"Axum extractors that validate JSON bodies, query strings, path parameters, forms, headers and cookies with vld schemas.","md",[1870,1875],{"label":1871,"icon":1872,"to":1873,"target":1874},"crates.io","i-simple-icons-rust","https:\u002F\u002Fcrates.io\u002Fcrates\u002Fvld-axum","_blank",{"label":1876,"icon":307,"to":1877,"target":1874},"docs.rs","https:\u002F\u002Fdocs.rs\u002Fvld-axum",{},{"title":152,"description":1867},"t9Iz5_ui7YqdUkWTyKOS6zsH7V3C4yqJp_VcShh62YY",[1882,1884],{"title":148,"path":149,"stem":150,"description":1883,"children":-1},"What every vld web integration has in common — extractors, status codes, the error body, coercion, header and cookie rules, and body limits.",{"title":156,"path":157,"stem":158,"description":1885,"children":-1},"Actix-web extractors that validate JSON bodies, query strings, path parameters, forms, headers and cookies with vld schemas.",1794036360707]