[{"data":1,"prerenderedAt":2086},["ShallowReactive",2],{"navigation":3,"\u002Fintegrations\u002Fweb\u002Frama":335,"\u002Fintegrations\u002Fweb\u002Frama-surround":2081},[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":168,"body":337,"description":2067,"extension":2068,"links":2069,"meta":2078,"navigation":567,"path":169,"seo":2079,"stem":170,"__hash__":2080},"docs\u002F6.integrations\u002F1.web\u002F06.rama.md",{"type":338,"value":339,"toc":2058},"minimark",[340,365,370,478,495,499,1278,1283,1296,1663,1672,1676,1875,1881,1885,1892,2012,2018,2022,2054],[341,342,343,344,351,352,356,357,360,361,364],"p",{},"Extractors for ",[345,346,350],"a",{"href":347,"rel":348},"https:\u002F\u002Framaproxy.org\u002F",[349],"nofollow","Rama"," 0.4 ",[353,354,355],"code",{},"WebService"," handlers, plus a ",[353,358,359],{},"ValidateJsonLayer"," for proxy and gateway service stacks. Shared rules (status codes, error body, coercion, headers and cookies) are on the ",[345,362,363],{"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-rama = \"0.5\"\nrama = { version = \"0.4\", features = [\"http\"] }\n","Cargo.toml","toml","",[353,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-rama ",[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,441,444,446,448,451,454,457,460,462,465,467,470,472,475],{"class":383,"line":432},4,[381,434,435],{"class":401},"rama ",[381,437,405],{"class":387},[381,439,440],{"class":387}," {",[381,442,443],{"class":401}," version ",[381,445,405],{"class":387},[381,447,408],{"class":387},[381,449,450],{"class":411},"0.4",[381,452,453],{"class":387},"\"",[381,455,456],{"class":387},",",[381,458,459],{"class":401}," features ",[381,461,405],{"class":387},[381,463,464],{"class":387}," [",[381,466,453],{"class":387},[381,468,469],{"class":411},"http",[381,471,453],{"class":387},[381,473,474],{"class":387},"]",[381,476,477],{"class":387}," }\n",[341,479,480,481,484,485,487,488,492,493,364],{},"The crate has no features of its own; it pulls ",[353,482,483],{},"rama"," with ",[353,486,469],{}," only. MSRV ",[489,490,491],"strong",{},"1.96"," (Rama's own), see ",[345,494,23],{"href":24},[366,496,498],{"id":497},"example","Example",[371,500,504],{"className":501,"code":502,"language":503,"meta":377,"style":377},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use rama::http::service::web::WebService;\nuse vld_rama::{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    }\n}\n\nvld::schema! {\n    #[derive(Debug)]\n    pub struct Search {\n        pub q: String => vld::string().min(1),\n        pub page: Option\u003Ci64> => vld::number().int().min(1).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\nasync fn create(VldJson(user): VldJson\u003CCreateUser>) -> String {\n    format!(\"created {}\", user.name)\n}\n\nasync fn search(VldQuery(q): VldQuery\u003CSearch>) -> String {\n    format!(\"q={} page={}\", q.q, q.page.unwrap_or(1))\n}\n\nasync fn get_user(VldPath(p): VldPath\u003CUserPath>) -> String {\n    format!(\"user #{}\", p.id)\n}\n\nlet svc = WebService::default()\n    .with_post(\"\u002Fusers\", create)\n    .with_get(\"\u002Fsearch\", search)\n    .with_get(\"\u002Fusers\u002F{id}\", get_user);\n","rust",[353,505,506,537,563,569,583,601,616,667,695,701,707,712,723,736,748,779,830,835,840,845,856,869,881,916,921,926,931,973,1002,1007,1012,1049,1098,1103,1108,1144,1170,1175,1180,1202,1226,1249],{"__ignoreMap":377},[381,507,508,512,515,518,520,522,525,527,530,532,534],{"class":383,"line":384},[381,509,511],{"class":510},"sbssI","use",[381,513,514],{"class":391}," rama",[381,516,517],{"class":387},"::",[381,519,469],{"class":391},[381,521,517],{"class":387},[381,523,524],{"class":391},"service",[381,526,517],{"class":387},[381,528,529],{"class":391},"web",[381,531,517],{"class":387},[381,533,355],{"class":391},[381,535,536],{"class":387},";\n",[381,538,539,541,544,547,550,552,555,557,560],{"class":383,"line":398},[381,540,511],{"class":510},[381,542,543],{"class":391}," vld_rama",[381,545,546],{"class":387},"::{",[381,548,549],{"class":391},"VldJson",[381,551,456],{"class":387},[381,553,554],{"class":391}," VldPath",[381,556,456],{"class":387},[381,558,559],{"class":391}," VldQuery",[381,561,562],{"class":387},"};\n",[381,564,565],{"class":383,"line":418},[381,566,568],{"emptyLinePlaceholder":567},true,"\n",[381,570,571,574,576,580],{"class":383,"line":432},[381,572,573],{"class":391},"vld",[381,575,517],{"class":387},[381,577,579],{"class":578},"s2Zo4","schema!",[381,581,582],{"class":387}," {\n",[381,584,586,589,592,595,598],{"class":383,"line":585},5,[381,587,588],{"class":387},"    #[",[381,590,591],{"class":401},"derive",[381,593,594],{"class":387},"(",[381,596,597],{"class":391},"Debug",[381,599,600],{"class":387},")]\n",[381,602,604,608,611,614],{"class":383,"line":603},6,[381,605,607],{"class":606},"spNyl","    pub",[381,609,610],{"class":606}," struct",[381,612,613],{"class":391}," CreateUser",[381,615,582],{"class":387},[381,617,619,622,625,628,631,634,637,639,642,645,648,650,653,656,659,661,664],{"class":383,"line":618},7,[381,620,621],{"class":606},"        pub",[381,623,624],{"class":401}," name",[381,626,627],{"class":387},":",[381,629,630],{"class":391}," String",[381,632,633],{"class":387}," =>",[381,635,636],{"class":391}," vld",[381,638,517],{"class":387},[381,640,641],{"class":578},"string",[381,643,644],{"class":387},"().",[381,646,647],{"class":578},"min",[381,649,594],{"class":387},[381,651,652],{"class":510},"2",[381,654,655],{"class":387},").",[381,657,658],{"class":578},"max",[381,660,594],{"class":387},[381,662,663],{"class":510},"50",[381,665,666],{"class":387},"),\n",[381,668,670,672,675,677,679,681,683,685,687,689,692],{"class":383,"line":669},8,[381,671,621],{"class":606},[381,673,674],{"class":401}," email",[381,676,627],{"class":387},[381,678,630],{"class":391},[381,680,633],{"class":387},[381,682,636],{"class":391},[381,684,517],{"class":387},[381,686,641],{"class":578},[381,688,644],{"class":387},[381,690,691],{"class":578},"email",[381,693,694],{"class":387},"(),\n",[381,696,698],{"class":383,"line":697},9,[381,699,700],{"class":387},"    }\n",[381,702,704],{"class":383,"line":703},10,[381,705,706],{"class":387},"}\n",[381,708,710],{"class":383,"line":709},11,[381,711,568],{"emptyLinePlaceholder":567},[381,713,715,717,719,721],{"class":383,"line":714},12,[381,716,573],{"class":391},[381,718,517],{"class":387},[381,720,579],{"class":578},[381,722,582],{"class":387},[381,724,726,728,730,732,734],{"class":383,"line":725},13,[381,727,588],{"class":387},[381,729,591],{"class":401},[381,731,594],{"class":387},[381,733,597],{"class":391},[381,735,600],{"class":387},[381,737,739,741,743,746],{"class":383,"line":738},14,[381,740,607],{"class":606},[381,742,610],{"class":606},[381,744,745],{"class":391}," Search",[381,747,582],{"class":387},[381,749,751,753,756,758,760,762,764,766,768,770,772,774,777],{"class":383,"line":750},15,[381,752,621],{"class":606},[381,754,755],{"class":401}," q",[381,757,627],{"class":387},[381,759,630],{"class":391},[381,761,633],{"class":387},[381,763,636],{"class":391},[381,765,517],{"class":387},[381,767,641],{"class":578},[381,769,644],{"class":387},[381,771,647],{"class":578},[381,773,594],{"class":387},[381,775,776],{"class":510},"1",[381,778,666],{"class":387},[381,780,782,784,787,789,792,795,798,801,803,805,807,810,812,815,817,819,821,823,825,828],{"class":383,"line":781},16,[381,783,621],{"class":606},[381,785,786],{"class":401}," page",[381,788,627],{"class":387},[381,790,791],{"class":391}," Option",[381,793,794],{"class":387},"\u003C",[381,796,797],{"class":391},"i64",[381,799,800],{"class":387},">",[381,802,633],{"class":387},[381,804,636],{"class":391},[381,806,517],{"class":387},[381,808,809],{"class":578},"number",[381,811,644],{"class":387},[381,813,814],{"class":578},"int",[381,816,644],{"class":387},[381,818,647],{"class":578},[381,820,594],{"class":387},[381,822,776],{"class":510},[381,824,655],{"class":387},[381,826,827],{"class":578},"optional",[381,829,694],{"class":387},[381,831,833],{"class":383,"line":832},17,[381,834,700],{"class":387},[381,836,838],{"class":383,"line":837},18,[381,839,706],{"class":387},[381,841,843],{"class":383,"line":842},19,[381,844,568],{"emptyLinePlaceholder":567},[381,846,848,850,852,854],{"class":383,"line":847},20,[381,849,573],{"class":391},[381,851,517],{"class":387},[381,853,579],{"class":578},[381,855,582],{"class":387},[381,857,859,861,863,865,867],{"class":383,"line":858},21,[381,860,588],{"class":387},[381,862,591],{"class":401},[381,864,594],{"class":387},[381,866,597],{"class":391},[381,868,600],{"class":387},[381,870,872,874,876,879],{"class":383,"line":871},22,[381,873,607],{"class":606},[381,875,610],{"class":606},[381,877,878],{"class":391}," UserPath",[381,880,582],{"class":387},[381,882,884,886,889,891,894,896,898,900,902,904,906,908,910,912,914],{"class":383,"line":883},23,[381,885,621],{"class":606},[381,887,888],{"class":401}," id",[381,890,627],{"class":387},[381,892,893],{"class":391}," i64",[381,895,633],{"class":387},[381,897,636],{"class":391},[381,899,517],{"class":387},[381,901,809],{"class":578},[381,903,644],{"class":387},[381,905,814],{"class":578},[381,907,644],{"class":387},[381,909,647],{"class":578},[381,911,594],{"class":387},[381,913,776],{"class":510},[381,915,666],{"class":387},[381,917,919],{"class":383,"line":918},24,[381,920,700],{"class":387},[381,922,924],{"class":383,"line":923},25,[381,925,706],{"class":387},[381,927,929],{"class":383,"line":928},26,[381,930,568],{"emptyLinePlaceholder":567},[381,932,934,937,940,943,945,947,949,952,955,958,960,963,966,969,971],{"class":383,"line":933},27,[381,935,936],{"class":510},"async",[381,938,939],{"class":510}," fn",[381,941,942],{"class":578}," create",[381,944,594],{"class":387},[381,946,549],{"class":578},[381,948,594],{"class":387},[381,950,951],{"class":401},"user",[381,953,954],{"class":387},"):",[381,956,957],{"class":391}," VldJson",[381,959,794],{"class":387},[381,961,962],{"class":391},"CreateUser",[381,964,965],{"class":387},">)",[381,967,968],{"class":387}," ->",[381,970,630],{"class":391},[381,972,582],{"class":387},[381,974,976,979,981,983,986,989,991,994,996,999],{"class":383,"line":975},28,[381,977,978],{"class":578},"    format!",[381,980,594],{"class":387},[381,982,453],{"class":387},[381,984,985],{"class":411},"created ",[381,987,988],{"class":387},"{}\"",[381,990,456],{"class":387},[381,992,993],{"class":401}," user",[381,995,364],{"class":387},[381,997,998],{"class":401},"name",[381,1000,1001],{"class":387},")\n",[381,1003,1005],{"class":383,"line":1004},29,[381,1006,706],{"class":387},[381,1008,1010],{"class":383,"line":1009},30,[381,1011,568],{"emptyLinePlaceholder":567},[381,1013,1015,1017,1019,1022,1024,1027,1029,1032,1034,1036,1038,1041,1043,1045,1047],{"class":383,"line":1014},31,[381,1016,936],{"class":510},[381,1018,939],{"class":510},[381,1020,1021],{"class":578}," search",[381,1023,594],{"class":387},[381,1025,1026],{"class":578},"VldQuery",[381,1028,594],{"class":387},[381,1030,1031],{"class":401},"q",[381,1033,954],{"class":387},[381,1035,559],{"class":391},[381,1037,794],{"class":387},[381,1039,1040],{"class":391},"Search",[381,1042,965],{"class":387},[381,1044,968],{"class":387},[381,1046,630],{"class":391},[381,1048,582],{"class":387},[381,1050,1052,1054,1056,1058,1061,1064,1067,1069,1071,1073,1075,1077,1079,1081,1083,1086,1088,1091,1093,1095],{"class":383,"line":1051},32,[381,1053,978],{"class":578},[381,1055,594],{"class":387},[381,1057,453],{"class":387},[381,1059,1060],{"class":411},"q=",[381,1062,1063],{"class":387},"{}",[381,1065,1066],{"class":411}," page=",[381,1068,988],{"class":387},[381,1070,456],{"class":387},[381,1072,755],{"class":401},[381,1074,364],{"class":387},[381,1076,1031],{"class":401},[381,1078,456],{"class":387},[381,1080,755],{"class":401},[381,1082,364],{"class":387},[381,1084,1085],{"class":401},"page",[381,1087,364],{"class":387},[381,1089,1090],{"class":578},"unwrap_or",[381,1092,594],{"class":387},[381,1094,776],{"class":510},[381,1096,1097],{"class":387},"))\n",[381,1099,1101],{"class":383,"line":1100},33,[381,1102,706],{"class":387},[381,1104,1106],{"class":383,"line":1105},34,[381,1107,568],{"emptyLinePlaceholder":567},[381,1109,1111,1113,1115,1118,1120,1123,1125,1127,1129,1131,1133,1136,1138,1140,1142],{"class":383,"line":1110},35,[381,1112,936],{"class":510},[381,1114,939],{"class":510},[381,1116,1117],{"class":578}," get_user",[381,1119,594],{"class":387},[381,1121,1122],{"class":578},"VldPath",[381,1124,594],{"class":387},[381,1126,341],{"class":401},[381,1128,954],{"class":387},[381,1130,554],{"class":391},[381,1132,794],{"class":387},[381,1134,1135],{"class":391},"UserPath",[381,1137,965],{"class":387},[381,1139,968],{"class":387},[381,1141,630],{"class":391},[381,1143,582],{"class":387},[381,1145,1147,1149,1151,1153,1156,1158,1160,1163,1165,1168],{"class":383,"line":1146},36,[381,1148,978],{"class":578},[381,1150,594],{"class":387},[381,1152,453],{"class":387},[381,1154,1155],{"class":411},"user #",[381,1157,988],{"class":387},[381,1159,456],{"class":387},[381,1161,1162],{"class":401}," p",[381,1164,364],{"class":387},[381,1166,1167],{"class":401},"id",[381,1169,1001],{"class":387},[381,1171,1173],{"class":383,"line":1172},37,[381,1174,706],{"class":387},[381,1176,1178],{"class":383,"line":1177},38,[381,1179,568],{"emptyLinePlaceholder":567},[381,1181,1183,1186,1189,1191,1194,1196,1199],{"class":383,"line":1182},39,[381,1184,1185],{"class":606},"let",[381,1187,1188],{"class":401}," svc ",[381,1190,405],{"class":387},[381,1192,1193],{"class":391}," WebService",[381,1195,517],{"class":387},[381,1197,1198],{"class":578},"default",[381,1200,1201],{"class":387},"()\n",[381,1203,1205,1208,1211,1213,1215,1218,1220,1222,1224],{"class":383,"line":1204},40,[381,1206,1207],{"class":387},"    .",[381,1209,1210],{"class":578},"with_post",[381,1212,594],{"class":387},[381,1214,453],{"class":387},[381,1216,1217],{"class":411},"\u002Fusers",[381,1219,453],{"class":387},[381,1221,456],{"class":387},[381,1223,942],{"class":401},[381,1225,1001],{"class":387},[381,1227,1229,1231,1234,1236,1238,1241,1243,1245,1247],{"class":383,"line":1228},41,[381,1230,1207],{"class":387},[381,1232,1233],{"class":578},"with_get",[381,1235,594],{"class":387},[381,1237,453],{"class":387},[381,1239,1240],{"class":411},"\u002Fsearch",[381,1242,453],{"class":387},[381,1244,456],{"class":387},[381,1246,1021],{"class":401},[381,1248,1001],{"class":387},[381,1250,1252,1254,1256,1258,1260,1263,1266,1268,1271,1273,1275],{"class":383,"line":1251},42,[381,1253,1207],{"class":387},[381,1255,1233],{"class":578},[381,1257,594],{"class":387},[381,1259,453],{"class":387},[381,1261,1262],{"class":411},"\u002Fusers\u002F",[381,1264,1265],{"class":387},"{",[381,1267,1167],{"class":411},[381,1269,1270],{"class":387},"}\"",[381,1272,456],{"class":387},[381,1274,1117],{"class":401},[381,1276,1277],{"class":387},");\n",[1279,1280,1282],"h3",{"id":1281},"as-a-layer","As a layer",[341,1284,1285,1288,1289,1292,1293,627],{},[353,1286,1287],{},"ValidateJsonLayer\u003CT>"," validates JSON bodies before the inner service runs and stores the value as ",[353,1290,1291],{},"Validated\u003CT>"," in the request extensions. Read it with ",[353,1294,1295],{},"validated::\u003CT>(&req)",[371,1297,1299],{"className":501,"code":1298,"language":503,"meta":377,"style":377},"use rama::http::{Body, Request, Response};\nuse rama::{Layer, Service};\nuse vld_rama::{validated, ValidateJsonLayer};\n\n#[derive(Clone)]\nstruct Backend;\n\nimpl Service\u003CRequest> for Backend {\n    type Output = Response;\n    type Error = std::convert::Infallible;\n\n    async fn serve(&self, req: Request) -> Result\u003CSelf::Output, Self::Error> {\n        \u002F\u002F None for non-JSON requests: the layer lets them through unread.\n        let name = validated::\u003CCreateUser>(&req).map_or(\"-\".into(), |u| u.name);\n        Ok(Response::new(Body::from(name)))\n    }\n}\n\nlet gateway = ValidateJsonLayer::\u003CCreateUser>::new().layer(Backend);\n",[353,1300,1301,1328,1346,1364,1368,1382,1392,1396,1418,1433,1457,1461,1518,1524,1588,1619,1623,1627,1631],{"__ignoreMap":377},[381,1302,1303,1305,1307,1309,1311,1313,1316,1318,1321,1323,1326],{"class":383,"line":384},[381,1304,511],{"class":510},[381,1306,514],{"class":391},[381,1308,517],{"class":387},[381,1310,469],{"class":391},[381,1312,546],{"class":387},[381,1314,1315],{"class":391},"Body",[381,1317,456],{"class":387},[381,1319,1320],{"class":391}," Request",[381,1322,456],{"class":387},[381,1324,1325],{"class":391}," Response",[381,1327,562],{"class":387},[381,1329,1330,1332,1334,1336,1339,1341,1344],{"class":383,"line":398},[381,1331,511],{"class":510},[381,1333,514],{"class":391},[381,1335,546],{"class":387},[381,1337,1338],{"class":391},"Layer",[381,1340,456],{"class":387},[381,1342,1343],{"class":391}," Service",[381,1345,562],{"class":387},[381,1347,1348,1350,1352,1354,1357,1359,1362],{"class":383,"line":418},[381,1349,511],{"class":510},[381,1351,543],{"class":391},[381,1353,546],{"class":387},[381,1355,1356],{"class":391},"validated",[381,1358,456],{"class":387},[381,1360,1361],{"class":391}," ValidateJsonLayer",[381,1363,562],{"class":387},[381,1365,1366],{"class":383,"line":432},[381,1367,568],{"emptyLinePlaceholder":567},[381,1369,1370,1373,1375,1377,1380],{"class":383,"line":585},[381,1371,1372],{"class":387},"#[",[381,1374,591],{"class":401},[381,1376,594],{"class":387},[381,1378,1379],{"class":391},"Clone",[381,1381,600],{"class":387},[381,1383,1384,1387,1390],{"class":383,"line":603},[381,1385,1386],{"class":606},"struct",[381,1388,1389],{"class":391}," Backend",[381,1391,536],{"class":387},[381,1393,1394],{"class":383,"line":618},[381,1395,568],{"emptyLinePlaceholder":567},[381,1397,1398,1401,1403,1405,1408,1410,1414,1416],{"class":383,"line":669},[381,1399,1400],{"class":510},"impl",[381,1402,1343],{"class":391},[381,1404,794],{"class":387},[381,1406,1407],{"class":391},"Request",[381,1409,800],{"class":387},[381,1411,1413],{"class":1412},"s7zQu"," for",[381,1415,1389],{"class":391},[381,1417,582],{"class":387},[381,1419,1420,1423,1426,1429,1431],{"class":383,"line":697},[381,1421,1422],{"class":606},"    type",[381,1424,1425],{"class":391}," Output",[381,1427,1428],{"class":387}," =",[381,1430,1325],{"class":391},[381,1432,536],{"class":387},[381,1434,1435,1437,1440,1442,1445,1447,1450,1452,1455],{"class":383,"line":703},[381,1436,1422],{"class":606},[381,1438,1439],{"class":391}," Error",[381,1441,1428],{"class":387},[381,1443,1444],{"class":391}," std",[381,1446,517],{"class":387},[381,1448,1449],{"class":391},"convert",[381,1451,517],{"class":387},[381,1453,1454],{"class":391},"Infallible",[381,1456,536],{"class":387},[381,1458,1459],{"class":383,"line":709},[381,1460,568],{"emptyLinePlaceholder":567},[381,1462,1463,1466,1468,1471,1474,1477,1479,1482,1484,1486,1489,1491,1494,1496,1499,1501,1504,1506,1509,1511,1514,1516],{"class":383,"line":714},[381,1464,1465],{"class":510},"    async",[381,1467,939],{"class":510},[381,1469,1470],{"class":578}," serve",[381,1472,1473],{"class":387},"(&",[381,1475,1476],{"class":401},"self",[381,1478,456],{"class":387},[381,1480,1481],{"class":401}," req",[381,1483,627],{"class":387},[381,1485,1320],{"class":391},[381,1487,1488],{"class":387},")",[381,1490,968],{"class":387},[381,1492,1493],{"class":391}," Result",[381,1495,794],{"class":387},[381,1497,1498],{"class":401},"Self",[381,1500,517],{"class":387},[381,1502,1503],{"class":391},"Output",[381,1505,456],{"class":387},[381,1507,1508],{"class":401}," Self",[381,1510,517],{"class":387},[381,1512,1513],{"class":391},"Error",[381,1515,800],{"class":387},[381,1517,582],{"class":387},[381,1519,1520],{"class":383,"line":725},[381,1521,1523],{"class":1522},"sHwdD","        \u002F\u002F None for non-JSON requests: the layer lets them through unread.\n",[381,1525,1526,1529,1532,1534,1537,1540,1542,1545,1548,1550,1553,1555,1557,1560,1562,1564,1567,1570,1573,1576,1579,1582,1584,1586],{"class":383,"line":738},[381,1527,1528],{"class":606},"        let",[381,1530,1531],{"class":401}," name ",[381,1533,405],{"class":387},[381,1535,1536],{"class":578}," validated",[381,1538,1539],{"class":387},"::\u003C",[381,1541,962],{"class":391},[381,1543,1544],{"class":387},">(&",[381,1546,1547],{"class":401},"req",[381,1549,655],{"class":387},[381,1551,1552],{"class":578},"map_or",[381,1554,594],{"class":387},[381,1556,453],{"class":387},[381,1558,1559],{"class":411},"-",[381,1561,453],{"class":387},[381,1563,364],{"class":387},[381,1565,1566],{"class":578},"into",[381,1568,1569],{"class":387},"(),",[381,1571,1572],{"class":387}," |",[381,1574,1575],{"class":401},"u",[381,1577,1578],{"class":387},"|",[381,1580,1581],{"class":401}," u",[381,1583,364],{"class":387},[381,1585,998],{"class":401},[381,1587,1277],{"class":387},[381,1589,1590,1593,1595,1598,1600,1603,1605,1607,1609,1612,1614,1616],{"class":383,"line":750},[381,1591,1592],{"class":391},"        Ok",[381,1594,594],{"class":387},[381,1596,1597],{"class":391},"Response",[381,1599,517],{"class":387},[381,1601,1602],{"class":578},"new",[381,1604,594],{"class":387},[381,1606,1315],{"class":391},[381,1608,517],{"class":387},[381,1610,1611],{"class":578},"from",[381,1613,594],{"class":387},[381,1615,998],{"class":401},[381,1617,1618],{"class":387},")))\n",[381,1620,1621],{"class":383,"line":781},[381,1622,700],{"class":387},[381,1624,1625],{"class":383,"line":832},[381,1626,706],{"class":387},[381,1628,1629],{"class":383,"line":837},[381,1630,568],{"emptyLinePlaceholder":567},[381,1632,1633,1635,1638,1640,1642,1644,1646,1649,1651,1653,1656,1658,1661],{"class":383,"line":842},[381,1634,1185],{"class":606},[381,1636,1637],{"class":401}," gateway ",[381,1639,405],{"class":387},[381,1641,1361],{"class":391},[381,1643,1539],{"class":387},[381,1645,962],{"class":391},[381,1647,1648],{"class":387},">::",[381,1650,1602],{"class":578},[381,1652,644],{"class":387},[381,1654,1655],{"class":578},"layer",[381,1657,594],{"class":387},[381,1659,1660],{"class":391},"Backend",[381,1662,1277],{"class":387},[341,1664,1665,1667,1668,1671],{},[353,1666,962],{}," must be ",[353,1669,1670],{},"Clone + Debug + Send + Sync + 'static"," for the layer.",[366,1673,1675],{"id":1674},"api","API",[1677,1678,1679,1692],"table",{},[1680,1681,1682],"thead",{},[1683,1684,1685,1689],"tr",{},[1686,1687,1688],"th",{},"Item",[1686,1690,1691],{},"Purpose",[1693,1694,1695,1717,1727,1744,1757,1767,1781,1797,1807,1816,1828,1838,1862],"tbody",{},[1683,1696,1697,1703],{},[1698,1699,1700],"td",{},[353,1701,1702],{},"VldJson\u003CT>",[1698,1704,1705,1706,1709,1710,1713,1714],{},"JSON body (",[353,1707,1708],{},"FromRequest"," \u002F ",[353,1711,1712],{},"FromRequestBody","); 415 without a JSON ",[353,1715,1716],{},"Content-Type",[1683,1718,1719,1724],{},[1698,1720,1721],{},[353,1722,1723],{},"VldQuery\u003CT>",[1698,1725,1726],{},"Query string, coerced",[1683,1728,1729,1734],{},[1698,1730,1731],{},[353,1732,1733],{},"VldPath\u003CT>",[1698,1735,1736,1737,1740,1741,1743],{},"Route parameters (",[353,1738,1739],{},"\u002Fusers\u002F{id}","), coerced; ",[353,1742,1063],{}," on a route without parameters",[1683,1745,1746,1751],{},[1698,1747,1748],{},[353,1749,1750],{},"VldForm\u003CT>",[1698,1752,1753,1756],{},[353,1754,1755],{},"application\u002Fx-www-form-urlencoded"," body (never the query string)",[1683,1758,1759,1764],{},[1698,1760,1761],{},[353,1762,1763],{},"VldHeaders\u003CT>",[1698,1765,1766],{},"Request headers",[1683,1768,1769,1774],{},[1698,1770,1771],{},[353,1772,1773],{},"VldCookie\u003CT>",[1698,1775,1776,1777,1780],{},"Cookies from every ",[353,1778,1779],{},"Cookie"," header",[1683,1782,1783,1787],{},[1698,1784,1785],{},[353,1786,1287],{},[1698,1788,1789,1790,1793,1794],{},"Layer; ",[353,1791,1792],{},"new()"," (2 MiB) or ",[353,1795,1796],{},"with_limit(bytes)",[1683,1798,1799,1804],{},[1698,1800,1801],{},[353,1802,1803],{},"ValidateJsonService\u003CS, T>",[1698,1805,1806],{},"The service the layer produces",[1683,1808,1809,1813],{},[1698,1810,1811],{},[353,1812,1291],{},[1698,1814,1815],{},"Extension wrapper holding the validated value",[1683,1817,1818,1822],{},[1698,1819,1820],{},[353,1821,1295],{},[1698,1823,1824,1827],{},[353,1825,1826],{},"Option\u003CT>"," from the extensions",[1683,1829,1830,1835],{},[1698,1831,1832],{},[353,1833,1834],{},"VldBodyLimit(usize)",[1698,1836,1837],{},"Request extension that sets the extractor body limit",[1683,1839,1840,1845],{},[1698,1841,1842],{},[353,1843,1844],{},"VldRejection",[1698,1846,1847,1848,1851,1852,1851,1855,1858,1859],{},"Rejection: ",[353,1849,1850],{},"status()",", ",[353,1853,1854],{},"body()",[353,1856,1857],{},"error()","; implements ",[353,1860,1861],{},"IntoResponse",[1683,1863,1864,1869],{},[1698,1865,1866],{},[353,1867,1868],{},"prelude",[1698,1870,1871,1872],{},"All of the above plus ",[353,1873,1874],{},"vld::prelude::*",[341,1876,1877,1878,364],{},"All extractors deref to ",[353,1879,1880],{},"T",[366,1882,1884],{"id":1883},"body-limit","Body limit",[341,1886,1887,1888,1891],{},"Extractors read at most 2 MiB. Set another limit per router with the ",[353,1889,1890],{},"VldBodyLimit"," extension:",[371,1893,1895],{"className":501,"code":1894,"language":503,"meta":377,"style":377},"use rama::layer::AddInputExtensionLayer;\nuse rama::Layer;\nuse vld_rama::VldBodyLimit;\n\nlet svc = AddInputExtensionLayer::new(VldBodyLimit(64 * 1024)).into_layer(\n    WebService::default().with_post(\"\u002Fusers\", create),\n);\n",[353,1896,1897,1914,1926,1938,1942,1981,2008],{"__ignoreMap":377},[381,1898,1899,1901,1903,1905,1907,1909,1912],{"class":383,"line":384},[381,1900,511],{"class":510},[381,1902,514],{"class":391},[381,1904,517],{"class":387},[381,1906,1655],{"class":391},[381,1908,517],{"class":387},[381,1910,1911],{"class":391},"AddInputExtensionLayer",[381,1913,536],{"class":387},[381,1915,1916,1918,1920,1922,1924],{"class":383,"line":398},[381,1917,511],{"class":510},[381,1919,514],{"class":391},[381,1921,517],{"class":387},[381,1923,1338],{"class":391},[381,1925,536],{"class":387},[381,1927,1928,1930,1932,1934,1936],{"class":383,"line":418},[381,1929,511],{"class":510},[381,1931,543],{"class":391},[381,1933,517],{"class":387},[381,1935,1890],{"class":391},[381,1937,536],{"class":387},[381,1939,1940],{"class":383,"line":432},[381,1941,568],{"emptyLinePlaceholder":567},[381,1943,1944,1946,1948,1950,1953,1955,1957,1959,1961,1963,1966,1969,1972,1975,1978],{"class":383,"line":585},[381,1945,1185],{"class":606},[381,1947,1188],{"class":401},[381,1949,405],{"class":387},[381,1951,1952],{"class":391}," AddInputExtensionLayer",[381,1954,517],{"class":387},[381,1956,1602],{"class":578},[381,1958,594],{"class":387},[381,1960,1890],{"class":578},[381,1962,594],{"class":387},[381,1964,1965],{"class":510},"64",[381,1967,1968],{"class":387}," *",[381,1970,1971],{"class":510}," 1024",[381,1973,1974],{"class":387},")).",[381,1976,1977],{"class":578},"into_layer",[381,1979,1980],{"class":387},"(\n",[381,1982,1983,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006],{"class":383,"line":603},[381,1984,1985],{"class":391},"    WebService",[381,1987,517],{"class":387},[381,1989,1198],{"class":578},[381,1991,644],{"class":387},[381,1993,1210],{"class":578},[381,1995,594],{"class":387},[381,1997,453],{"class":387},[381,1999,1217],{"class":411},[381,2001,453],{"class":387},[381,2003,456],{"class":387},[381,2005,942],{"class":401},[381,2007,666],{"class":387},[381,2009,2010],{"class":383,"line":618},[381,2011,1277],{"class":387},[341,2013,2014,2015,364],{},"The layer takes its own limit: ",[353,2016,2017],{},"ValidateJsonLayer::\u003CT>::with_limit(64 * 1024)",[366,2019,2021],{"id":2020},"gotchas","Gotchas",[2023,2024,2025,2034,2047],"ul",{},[2026,2027,2028,2031,2032,364],"li",{},[353,2029,2030],{},"validated()"," returns ",[353,2033,1826],{},[2026,2035,2036,2037,2039,2040,2043,2044,364],{},"The layer passes requests without a JSON ",[353,2038,1716],{}," through ",[489,2041,2042],{},"without reading the body",", so a handler behind it must handle ",[353,2045,2046],{},"None",[2026,2048,2049,2050,2053],{},"An over-limit body is 413 only when the error is Rama's ",[353,2051,2052],{},"LengthLimitError","; any other body read error is a 422.",[2055,2056,2057],"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":2059},[2060,2061,2064,2065,2066],{"id":368,"depth":398,"text":369},{"id":497,"depth":398,"text":498,"children":2062},[2063],{"id":1281,"depth":418,"text":1282},{"id":1674,"depth":398,"text":1675},{"id":1883,"depth":398,"text":1884},{"id":2020,"depth":398,"text":2021},"Rama extractors and a JSON validation layer for vld schemas.","md",[2070,2075],{"label":2071,"icon":2072,"to":2073,"target":2074},"crates.io","i-simple-icons-rust","https:\u002F\u002Fcrates.io\u002Fcrates\u002Fvld-rama","_blank",{"label":2076,"icon":307,"to":2077,"target":2074},"docs.rs","https:\u002F\u002Fdocs.rs\u002Fvld-rama",{},{"title":168,"description":2067},"hiElZKG8IudWSf2lJ7WMUABwtIil6RRIY0ANVDK0UXw",[2082,2084],{"title":164,"path":165,"stem":166,"description":2083,"children":-1},"Poem extractors that validate JSON bodies, query strings, path parameters, forms, headers and cookies with vld schemas.",{"title":172,"path":173,"stem":174,"description":2085,"children":-1},"Rocket request guards that validate JSON bodies, query strings, path segments, forms, headers and cookies with vld schemas, plus JSON error catchers.",1794036361104]