[{"data":1,"prerenderedAt":1941},["ShallowReactive",2],{"navigation":3,"\u002Fstructs\u002Fschema-macro":335,"\u002Fstructs\u002Fschema-macro-surround":1936},[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":80,"body":337,"description":1930,"extension":1931,"links":1932,"meta":1933,"navigation":385,"path":81,"seo":1934,"stem":82,"__hash__":1935},"docs\u002F3.structs\u002F1.schema-macro.md",{"type":338,"value":339,"toc":1918},"minimark",[340,348,755,762,767,861,864,868,874,1050,1091,1111,1115,1327,1366,1370,1382,1411,1415,1420,1445,1449,1460,1633,1637,1656,1879,1886,1890,1914],[341,342,343,347],"p",{},[344,345,346],"code",{},"vld::schema!"," declares a normal Rust struct together with a schema per field. It needs no feature and no proc-macro.",[349,350,355],"pre",{"className":351,"code":352,"language":353,"meta":354,"style":354},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use vld::prelude::*;\n\nvld::schema! {\n    #[derive(Debug, Clone, serde::Serialize)]\n    pub struct User {\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).optional(),\n        pub tags: Vec\u003CString> => vld::array(vld::string()).max_len(5).with_default(vec![]),\n    }\n}\n\nlet user = User::parse(r#\"{\"name\": \"Alice\", \"email\": \"alice@example.com\", \"age\": 30}\"#).unwrap();\nassert_eq!(user.age, Some(30));\nassert!(user.tags.is_empty());\n","rust","",[344,356,357,380,387,402,437,452,502,530,582,643,649,655,660,702,732],{"__ignoreMap":354},[358,359,362,366,370,374,377],"span",{"class":360,"line":361},"line",1,[358,363,365],{"class":364},"sbssI","use",[358,367,369],{"class":368},"sBMFI"," vld",[358,371,373],{"class":372},"sMK4o","::",[358,375,376],{"class":368},"prelude",[358,378,379],{"class":372},"::*;\n",[358,381,383],{"class":360,"line":382},2,[358,384,386],{"emptyLinePlaceholder":385},true,"\n",[358,388,390,393,395,399],{"class":360,"line":389},3,[358,391,392],{"class":368},"vld",[358,394,373],{"class":372},[358,396,398],{"class":397},"s2Zo4","schema!",[358,400,401],{"class":372}," {\n",[358,403,405,408,412,415,418,421,424,426,429,431,434],{"class":360,"line":404},4,[358,406,407],{"class":372},"    #[",[358,409,411],{"class":410},"sTEyZ","derive",[358,413,414],{"class":372},"(",[358,416,417],{"class":368},"Debug",[358,419,420],{"class":372},",",[358,422,423],{"class":368}," Clone",[358,425,420],{"class":372},[358,427,428],{"class":410}," serde",[358,430,373],{"class":372},[358,432,433],{"class":368},"Serialize",[358,435,436],{"class":372},")]\n",[358,438,440,444,447,450],{"class":360,"line":439},5,[358,441,443],{"class":442},"spNyl","    pub",[358,445,446],{"class":442}," struct",[358,448,449],{"class":368}," User",[358,451,401],{"class":372},[358,453,455,458,461,464,467,470,472,474,477,480,483,485,488,491,494,496,499],{"class":360,"line":454},6,[358,456,457],{"class":442},"        pub",[358,459,460],{"class":410}," name",[358,462,463],{"class":372},":",[358,465,466],{"class":368}," String",[358,468,469],{"class":372}," =>",[358,471,369],{"class":368},[358,473,373],{"class":372},[358,475,476],{"class":397},"string",[358,478,479],{"class":372},"().",[358,481,482],{"class":397},"min",[358,484,414],{"class":372},[358,486,487],{"class":364},"2",[358,489,490],{"class":372},").",[358,492,493],{"class":397},"max",[358,495,414],{"class":372},[358,497,498],{"class":364},"50",[358,500,501],{"class":372},"),\n",[358,503,505,507,510,512,514,516,518,520,522,524,527],{"class":360,"line":504},7,[358,506,457],{"class":442},[358,508,509],{"class":410}," email",[358,511,463],{"class":372},[358,513,466],{"class":368},[358,515,469],{"class":372},[358,517,369],{"class":368},[358,519,373],{"class":372},[358,521,476],{"class":397},[358,523,479],{"class":372},[358,525,526],{"class":397},"email",[358,528,529],{"class":372},"(),\n",[358,531,533,535,538,540,543,546,549,552,554,556,558,561,563,566,568,570,572,575,577,580],{"class":360,"line":532},8,[358,534,457],{"class":442},[358,536,537],{"class":410}," age",[358,539,463],{"class":372},[358,541,542],{"class":368}," Option",[358,544,545],{"class":372},"\u003C",[358,547,548],{"class":368},"i64",[358,550,551],{"class":372},">",[358,553,469],{"class":372},[358,555,369],{"class":368},[358,557,373],{"class":372},[358,559,560],{"class":397},"number",[358,562,479],{"class":372},[358,564,565],{"class":397},"int",[358,567,479],{"class":372},[358,569,482],{"class":397},[358,571,414],{"class":372},[358,573,574],{"class":364},"0",[358,576,490],{"class":372},[358,578,579],{"class":397},"optional",[358,581,529],{"class":372},[358,583,585,587,590,592,595,597,600,602,604,606,608,611,613,615,617,619,622,625,627,630,632,635,637,640],{"class":360,"line":584},9,[358,586,457],{"class":442},[358,588,589],{"class":410}," tags",[358,591,463],{"class":372},[358,593,594],{"class":368}," Vec",[358,596,545],{"class":372},[358,598,599],{"class":368},"String",[358,601,551],{"class":372},[358,603,469],{"class":372},[358,605,369],{"class":368},[358,607,373],{"class":372},[358,609,610],{"class":397},"array",[358,612,414],{"class":372},[358,614,392],{"class":368},[358,616,373],{"class":372},[358,618,476],{"class":397},[358,620,621],{"class":372},"()).",[358,623,624],{"class":397},"max_len",[358,626,414],{"class":372},[358,628,629],{"class":364},"5",[358,631,490],{"class":372},[358,633,634],{"class":397},"with_default",[358,636,414],{"class":372},[358,638,639],{"class":397},"vec!",[358,641,642],{"class":372},"[]),\n",[358,644,646],{"class":360,"line":645},10,[358,647,648],{"class":372},"    }\n",[358,650,652],{"class":360,"line":651},11,[358,653,654],{"class":372},"}\n",[358,656,658],{"class":360,"line":657},12,[358,659,386],{"emptyLinePlaceholder":385},[358,661,663,666,669,672,674,676,679,681,685,688,691,694,696,699],{"class":360,"line":662},13,[358,664,665],{"class":442},"let",[358,667,668],{"class":410}," user ",[358,670,671],{"class":372},"=",[358,673,449],{"class":368},[358,675,373],{"class":372},[358,677,678],{"class":397},"parse",[358,680,414],{"class":372},[358,682,684],{"class":683},"sfazB","r",[358,686,687],{"class":372},"#\"",[358,689,690],{"class":683},"{\"name\": \"Alice\", \"email\": \"alice@example.com\", \"age\": 30}",[358,692,693],{"class":372},"\"#",[358,695,490],{"class":372},[358,697,698],{"class":397},"unwrap",[358,700,701],{"class":372},"();\n",[358,703,705,708,710,713,716,719,721,724,726,729],{"class":360,"line":704},14,[358,706,707],{"class":397},"assert_eq!",[358,709,414],{"class":372},[358,711,712],{"class":410},"user",[358,714,715],{"class":372},".",[358,717,718],{"class":410},"age",[358,720,420],{"class":372},[358,722,723],{"class":368}," Some",[358,725,414],{"class":372},[358,727,728],{"class":364},"30",[358,730,731],{"class":372},"));\n",[358,733,735,738,740,742,744,747,749,752],{"class":360,"line":734},15,[358,736,737],{"class":397},"assert!",[358,739,414],{"class":372},[358,741,712],{"class":410},[358,743,715],{"class":372},[358,745,746],{"class":410},"tags",[358,748,715],{"class":372},[358,750,751],{"class":397},"is_empty",[358,753,754],{"class":372},"());\n",[341,756,757,758,761],{},"Each field is ",[344,759,760],{},"name: Type [as \"json_key\"] => schema",". The schema's output type must be the field type.",[763,764,766],"h2",{"id":765},"generated-api","Generated API",[768,769,770,783],"table",{},[771,772,773],"thead",{},[774,775,776,780],"tr",{},[777,778,779],"th",{},"Item",[777,781,782],{},"Purpose",[784,785,786,800,813,823,845],"tbody",{},[774,787,788,794],{},[789,790,791],"td",{},[344,792,793],{},"User::parse(input)",[789,795,796,797],{},"parse a JSON string, bytes, file path or ",[344,798,799],{},"&serde_json::Value",[774,801,802,807],{},[789,803,804],{},[344,805,806],{},"User::parse_value(&value)",[789,808,809,810],{},"parse a ",[344,811,812],{},"serde_json::Value",[774,814,815,820],{},[789,816,817],{},[344,818,819],{},"impl VldParse for User",[789,821,822],{},"used by every integration crate (extractors, DB wrappers, …)",[774,824,825,834],{},[789,826,827,830,831],{},[344,828,829],{},"User::validate(&instance)"," \u002F ",[344,832,833],{},"User::is_valid(&instance)",[789,835,836,837,839,840,844],{},"check an existing value that implements ",[344,838,433],{}," (see ",[841,842,843],"a",{"href":89},"parse vs validate",")",[774,846,847,855],{},[789,848,849,830,852],{},[344,850,851],{},"User::json_schema()",[344,853,854],{},"User::to_openapi_document()",[789,856,857,858],{},"with feature ",[344,859,860],{},"openapi",[341,862,863],{},"Unknown keys in the input are ignored.",[763,865,867],{"id":866},"renaming-fields","Renaming fields",[341,869,870,873],{},[344,871,872],{},"as \"jsonKey\""," sets the JSON name for both parsing and validation:",[349,875,877],{"className":351,"code":876,"language":353,"meta":354,"style":354},"vld::schema! {\n    pub struct ApiUser {\n        pub first_name: String as \"firstName\" => vld::string().min(1),\n        pub last_name: String as \"lastName\" => vld::string().min(1),\n    }\n}\n\nlet u = ApiUser::parse(r#\"{\"firstName\": \"John\", \"lastName\": \"Doe\"}\"#).unwrap();\nassert_eq!(u.first_name, \"John\");\n",[344,878,879,889,900,942,980,984,988,992,1024],{"__ignoreMap":354},[358,880,881,883,885,887],{"class":360,"line":361},[358,882,392],{"class":368},[358,884,373],{"class":372},[358,886,398],{"class":397},[358,888,401],{"class":372},[358,890,891,893,895,898],{"class":360,"line":382},[358,892,443],{"class":442},[358,894,446],{"class":442},[358,896,897],{"class":368}," ApiUser",[358,899,401],{"class":372},[358,901,902,904,907,909,911,914,917,920,923,925,927,929,931,933,935,937,940],{"class":360,"line":389},[358,903,457],{"class":442},[358,905,906],{"class":410}," first_name",[358,908,463],{"class":372},[358,910,466],{"class":368},[358,912,913],{"class":364}," as",[358,915,916],{"class":372}," \"",[358,918,919],{"class":683},"firstName",[358,921,922],{"class":372},"\"",[358,924,469],{"class":372},[358,926,369],{"class":368},[358,928,373],{"class":372},[358,930,476],{"class":397},[358,932,479],{"class":372},[358,934,482],{"class":397},[358,936,414],{"class":372},[358,938,939],{"class":364},"1",[358,941,501],{"class":372},[358,943,944,946,949,951,953,955,957,960,962,964,966,968,970,972,974,976,978],{"class":360,"line":404},[358,945,457],{"class":442},[358,947,948],{"class":410}," last_name",[358,950,463],{"class":372},[358,952,466],{"class":368},[358,954,913],{"class":364},[358,956,916],{"class":372},[358,958,959],{"class":683},"lastName",[358,961,922],{"class":372},[358,963,469],{"class":372},[358,965,369],{"class":368},[358,967,373],{"class":372},[358,969,476],{"class":397},[358,971,479],{"class":372},[358,973,482],{"class":397},[358,975,414],{"class":372},[358,977,939],{"class":364},[358,979,501],{"class":372},[358,981,982],{"class":360,"line":439},[358,983,648],{"class":372},[358,985,986],{"class":360,"line":454},[358,987,654],{"class":372},[358,989,990],{"class":360,"line":504},[358,991,386],{"emptyLinePlaceholder":385},[358,993,994,996,999,1001,1003,1005,1007,1009,1011,1013,1016,1018,1020,1022],{"class":360,"line":532},[358,995,665],{"class":442},[358,997,998],{"class":410}," u ",[358,1000,671],{"class":372},[358,1002,897],{"class":368},[358,1004,373],{"class":372},[358,1006,678],{"class":397},[358,1008,414],{"class":372},[358,1010,684],{"class":683},[358,1012,687],{"class":372},[358,1014,1015],{"class":683},"{\"firstName\": \"John\", \"lastName\": \"Doe\"}",[358,1017,693],{"class":372},[358,1019,490],{"class":372},[358,1021,698],{"class":397},[358,1023,701],{"class":372},[358,1025,1026,1028,1030,1033,1035,1038,1040,1042,1045,1047],{"class":360,"line":584},[358,1027,707],{"class":397},[358,1029,414],{"class":372},[358,1031,1032],{"class":410},"u",[358,1034,715],{"class":372},[358,1036,1037],{"class":410},"first_name",[358,1039,420],{"class":372},[358,1041,916],{"class":372},[358,1043,1044],{"class":683},"John",[358,1046,922],{"class":372},[358,1048,1049],{"class":372},");\n",[341,1051,1052,1053,1056,1057,1060,1061,1064,1065,1068,1069,1072,1073,1072,1076,1079,1080,1083,1084,1086,1087,1079,1089,490],{},"Without ",[344,1054,1055],{},"as",", the macro follows serde attributes written inside it: field ",[344,1058,1059],{},"#[serde(rename = \"...\")]"," or ",[344,1062,1063],{},"rename(serialize = \"...\", deserialize = \"...\")",", then struct ",[344,1066,1067],{},"#[serde(rename_all = \"...\")]",". ",[344,1070,1071],{},"alias",", ",[344,1074,1075],{},"flatten",[344,1077,1078],{},"skip"," and ",[344,1081,1082],{},"default"," are not interpreted by ",[344,1085,398],{}," (the derive supports ",[344,1088,1078],{},[344,1090,1082],{},[341,1092,1093,1096,1097,1099,1100,1103,1104,1107,1108,490],{},[344,1094,1095],{},"as \"key\""," is invisible to serde. If the struct also derives ",[344,1098,433],{},", add a matching ",[344,1101,1102],{},"#[serde(rename)]",". Raw identifiers map to their bare name (",[344,1105,1106],{},"r#type"," → ",[344,1109,1110],{},"\"type\"",[763,1112,1114],{"id":1113},"nested-structs","Nested structs",[349,1116,1118],{"className":351,"code":1117,"language":353,"meta":354,"style":354},"vld::schema! {\n    #[derive(Debug, Clone)]\n    pub struct Address {\n        pub city: String => vld::string().min(1),\n    }\n}\n\nvld::schema! {\n    #[derive(Debug)]\n    pub struct Customer {\n        pub name: String => vld::string(),\n        pub address: Address => vld::nested(Address::parse_value),\n        pub billing: Option\u003CAddress> => vld::nested!(Address).optional(),\n    }\n}\n",[344,1119,1120,1130,1146,1157,1186,1190,1194,1198,1208,1220,1231,1251,1283,1319,1323],{"__ignoreMap":354},[358,1121,1122,1124,1126,1128],{"class":360,"line":361},[358,1123,392],{"class":368},[358,1125,373],{"class":372},[358,1127,398],{"class":397},[358,1129,401],{"class":372},[358,1131,1132,1134,1136,1138,1140,1142,1144],{"class":360,"line":382},[358,1133,407],{"class":372},[358,1135,411],{"class":410},[358,1137,414],{"class":372},[358,1139,417],{"class":368},[358,1141,420],{"class":372},[358,1143,423],{"class":368},[358,1145,436],{"class":372},[358,1147,1148,1150,1152,1155],{"class":360,"line":389},[358,1149,443],{"class":442},[358,1151,446],{"class":442},[358,1153,1154],{"class":368}," Address",[358,1156,401],{"class":372},[358,1158,1159,1161,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184],{"class":360,"line":404},[358,1160,457],{"class":442},[358,1162,1163],{"class":410}," city",[358,1165,463],{"class":372},[358,1167,466],{"class":368},[358,1169,469],{"class":372},[358,1171,369],{"class":368},[358,1173,373],{"class":372},[358,1175,476],{"class":397},[358,1177,479],{"class":372},[358,1179,482],{"class":397},[358,1181,414],{"class":372},[358,1183,939],{"class":364},[358,1185,501],{"class":372},[358,1187,1188],{"class":360,"line":439},[358,1189,648],{"class":372},[358,1191,1192],{"class":360,"line":454},[358,1193,654],{"class":372},[358,1195,1196],{"class":360,"line":504},[358,1197,386],{"emptyLinePlaceholder":385},[358,1199,1200,1202,1204,1206],{"class":360,"line":532},[358,1201,392],{"class":368},[358,1203,373],{"class":372},[358,1205,398],{"class":397},[358,1207,401],{"class":372},[358,1209,1210,1212,1214,1216,1218],{"class":360,"line":584},[358,1211,407],{"class":372},[358,1213,411],{"class":410},[358,1215,414],{"class":372},[358,1217,417],{"class":368},[358,1219,436],{"class":372},[358,1221,1222,1224,1226,1229],{"class":360,"line":645},[358,1223,443],{"class":442},[358,1225,446],{"class":442},[358,1227,1228],{"class":368}," Customer",[358,1230,401],{"class":372},[358,1232,1233,1235,1237,1239,1241,1243,1245,1247,1249],{"class":360,"line":651},[358,1234,457],{"class":442},[358,1236,460],{"class":410},[358,1238,463],{"class":372},[358,1240,466],{"class":368},[358,1242,469],{"class":372},[358,1244,369],{"class":368},[358,1246,373],{"class":372},[358,1248,476],{"class":397},[358,1250,529],{"class":372},[358,1252,1253,1255,1258,1260,1262,1264,1266,1268,1271,1273,1276,1278,1281],{"class":360,"line":657},[358,1254,457],{"class":442},[358,1256,1257],{"class":410}," address",[358,1259,463],{"class":372},[358,1261,1154],{"class":368},[358,1263,469],{"class":372},[358,1265,369],{"class":368},[358,1267,373],{"class":372},[358,1269,1270],{"class":397},"nested",[358,1272,414],{"class":372},[358,1274,1275],{"class":368},"Address",[358,1277,373],{"class":372},[358,1279,1280],{"class":410},"parse_value",[358,1282,501],{"class":372},[358,1284,1285,1287,1290,1292,1294,1296,1298,1300,1302,1304,1306,1309,1311,1313,1315,1317],{"class":360,"line":662},[358,1286,457],{"class":442},[358,1288,1289],{"class":410}," billing",[358,1291,463],{"class":372},[358,1293,542],{"class":368},[358,1295,545],{"class":372},[358,1297,1275],{"class":368},[358,1299,551],{"class":372},[358,1301,469],{"class":372},[358,1303,369],{"class":368},[358,1305,373],{"class":372},[358,1307,1308],{"class":397},"nested!",[358,1310,414],{"class":372},[358,1312,1275],{"class":368},[358,1314,490],{"class":372},[358,1316,579],{"class":397},[358,1318,529],{"class":372},[358,1320,1321],{"class":360,"line":704},[358,1322,648],{"class":372},[358,1324,1325],{"class":360,"line":734},[358,1326,654],{"class":372},[1328,1329,1330,1344],"ul",{},[1331,1332,1333,1336,1337,1340,1341,490],"li",{},[344,1334,1335],{},"vld::nested(T::parse_value)"," — use ",[344,1338,1339],{},"T"," as a field schema; errors keep their path (",[344,1342,1343],{},".address.city",[1331,1345,1346,1349,1350,1352,1353,1355,1356,1359,1360,1107,1363,490],{},[344,1347,1348],{},"vld::nested!(T)"," — the same, and with ",[344,1351,860],{}," registers ",[344,1354,1339],{}," as an OpenAPI component referenced by ",[344,1357,1358],{},"$ref",". Generic types get a sanitized component name (",[344,1361,1362],{},"Page\u003CUser>",[344,1364,1365],{},"Page_User_",[763,1367,1369],{"id":1368},"schema-caching","Schema caching",[341,1371,1372,1373,1377,1378,1381],{},"Field schemas are built ",[1374,1375,1376],"strong",{},"once per process",", on first use, and stored in a ",[344,1379,1380],{},"static",". Two consequences:",[1328,1383,1384,1398],{},[1331,1385,1386,1387,1390,1391,830,1394,1397],{},"Field schemas must be ",[344,1388,1389],{},"Send + Sync + 'static"," (closures in ",[344,1392,1393],{},"refine",[344,1395,1396],{},"transform"," must not borrow local data).",[1331,1399,1400,1401,1404,1405,1410],{},"A schema built from runtime values, such as ",[344,1402,1403],{},"vld::string().max(config.limit)",", freezes the value seen on the first parse. Build such schemas at runtime with ",[841,1406,1407],{"href":59},[344,1408,1409],{},"vld::object()"," instead.",[763,1412,1414],{"id":1413},"companion-macros","Companion macros",[1416,1417,1419],"h3",{"id":1418},"schema_validated","schema_validated!",[341,1421,1422,1425,1426,1428,1429,1432,1433,1072,1436,1439,1440,1079,1442,715],{},[344,1423,1424],{},"vld::schema_validated!"," is ",[344,1427,398],{}," plus ",[841,1430,1431],{"href":93},"lenient parsing"," (",[344,1434,1435],{},"validate_fields()",[344,1437,1438],{},"parse_lenient()",") in one declaration. Field types must implement ",[344,1441,433],{},[344,1443,1444],{},"Default",[1416,1446,1448],{"id":1447},"impl_validate_fields","impl_validate_fields!",[341,1450,1451,1452,830,1454,1456,1457,1459],{},"Adds ",[344,1453,1435],{},[344,1455,1438],{}," to a struct already declared with ",[344,1458,398],{},". It repeats the field list:",[349,1461,1463],{"className":351,"code":1462,"language":353,"meta":354,"style":354},"vld::impl_validate_fields!(User {\n    name: String => vld::string().min(2).max(50),\n    email: String => vld::string().email(),\n    age: Option\u003Ci64> => vld::number().int().min(0).optional(),\n    tags: Vec\u003CString> => vld::array(vld::string()).max_len(5).with_default(vec![]),\n});\n",[344,1464,1465,1480,1515,1538,1579,1628],{"__ignoreMap":354},[358,1466,1467,1469,1471,1473,1475,1478],{"class":360,"line":361},[358,1468,392],{"class":368},[358,1470,373],{"class":372},[358,1472,1448],{"class":397},[358,1474,414],{"class":372},[358,1476,1477],{"class":368},"User",[358,1479,401],{"class":372},[358,1481,1482,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1513],{"class":360,"line":382},[358,1483,1484],{"class":410},"    name",[358,1486,463],{"class":372},[358,1488,466],{"class":368},[358,1490,469],{"class":372},[358,1492,369],{"class":368},[358,1494,373],{"class":372},[358,1496,476],{"class":397},[358,1498,479],{"class":372},[358,1500,482],{"class":397},[358,1502,414],{"class":372},[358,1504,487],{"class":364},[358,1506,490],{"class":372},[358,1508,493],{"class":397},[358,1510,414],{"class":372},[358,1512,498],{"class":364},[358,1514,501],{"class":372},[358,1516,1517,1520,1522,1524,1526,1528,1530,1532,1534,1536],{"class":360,"line":389},[358,1518,1519],{"class":410},"    email",[358,1521,463],{"class":372},[358,1523,466],{"class":368},[358,1525,469],{"class":372},[358,1527,369],{"class":368},[358,1529,373],{"class":372},[358,1531,476],{"class":397},[358,1533,479],{"class":372},[358,1535,526],{"class":397},[358,1537,529],{"class":372},[358,1539,1540,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577],{"class":360,"line":404},[358,1541,1542],{"class":410},"    age",[358,1544,463],{"class":372},[358,1546,542],{"class":368},[358,1548,545],{"class":372},[358,1550,548],{"class":368},[358,1552,551],{"class":372},[358,1554,469],{"class":372},[358,1556,369],{"class":368},[358,1558,373],{"class":372},[358,1560,560],{"class":397},[358,1562,479],{"class":372},[358,1564,565],{"class":397},[358,1566,479],{"class":372},[358,1568,482],{"class":397},[358,1570,414],{"class":372},[358,1572,574],{"class":364},[358,1574,490],{"class":372},[358,1576,579],{"class":397},[358,1578,529],{"class":372},[358,1580,1581,1584,1586,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610,1612,1614,1616,1618,1620,1622,1624,1626],{"class":360,"line":439},[358,1582,1583],{"class":410},"    tags",[358,1585,463],{"class":372},[358,1587,594],{"class":368},[358,1589,545],{"class":372},[358,1591,599],{"class":368},[358,1593,551],{"class":372},[358,1595,469],{"class":372},[358,1597,369],{"class":368},[358,1599,373],{"class":372},[358,1601,610],{"class":397},[358,1603,414],{"class":372},[358,1605,392],{"class":368},[358,1607,373],{"class":372},[358,1609,476],{"class":397},[358,1611,621],{"class":372},[358,1613,624],{"class":397},[358,1615,414],{"class":372},[358,1617,629],{"class":364},[358,1619,490],{"class":372},[358,1621,634],{"class":397},[358,1623,414],{"class":372},[358,1625,639],{"class":397},[358,1627,642],{"class":372},[358,1629,1630],{"class":360,"line":454},[358,1631,1632],{"class":372},"});\n",[1416,1634,1636],{"id":1635},"impl_rules","impl_rules!",[341,1638,1451,1639,1079,1642,1645,1646,1649,1650,1652,1653,1655],{},[344,1640,1641],{},"validate()",[344,1643,1644],{},"is_valid()"," ",[1374,1647,1648],{},"instance methods"," to a struct you did not declare with ",[344,1651,398],{},". Only the listed field types need ",[344,1654,433],{},"; the struct itself needs nothing.",[349,1657,1659],{"className":351,"code":1658,"language":353,"meta":354,"style":354},"struct Product {\n    name: String,\n    price: f64,\n}\n\nvld::impl_rules!(Product {\n    name => vld::string().min(2).max(100),\n    price => vld::number().positive(),\n});\n\nlet p = Product { name: \"X\".into(), price: -1.0 };\nassert!(!p.is_valid());\nassert_eq!(p.validate().unwrap_err().issues.len(), 2);\n",[344,1660,1661,1671,1682,1694,1698,1702,1717,1750,1770,1774,1778,1828,1844],{"__ignoreMap":354},[358,1662,1663,1666,1669],{"class":360,"line":361},[358,1664,1665],{"class":442},"struct",[358,1667,1668],{"class":368}," Product",[358,1670,401],{"class":372},[358,1672,1673,1675,1677,1679],{"class":360,"line":382},[358,1674,1484],{"class":410},[358,1676,463],{"class":372},[358,1678,466],{"class":368},[358,1680,1681],{"class":372},",\n",[358,1683,1684,1687,1689,1692],{"class":360,"line":389},[358,1685,1686],{"class":410},"    price",[358,1688,463],{"class":372},[358,1690,1691],{"class":368}," f64",[358,1693,1681],{"class":372},[358,1695,1696],{"class":360,"line":404},[358,1697,654],{"class":372},[358,1699,1700],{"class":360,"line":439},[358,1701,386],{"emptyLinePlaceholder":385},[358,1703,1704,1706,1708,1710,1712,1715],{"class":360,"line":454},[358,1705,392],{"class":368},[358,1707,373],{"class":372},[358,1709,1636],{"class":397},[358,1711,414],{"class":372},[358,1713,1714],{"class":368},"Product",[358,1716,401],{"class":372},[358,1718,1719,1722,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1748],{"class":360,"line":504},[358,1720,1721],{"class":410},"    name ",[358,1723,1724],{"class":372},"=>",[358,1726,369],{"class":368},[358,1728,373],{"class":372},[358,1730,476],{"class":397},[358,1732,479],{"class":372},[358,1734,482],{"class":397},[358,1736,414],{"class":372},[358,1738,487],{"class":364},[358,1740,490],{"class":372},[358,1742,493],{"class":397},[358,1744,414],{"class":372},[358,1746,1747],{"class":364},"100",[358,1749,501],{"class":372},[358,1751,1752,1755,1757,1759,1761,1763,1765,1768],{"class":360,"line":532},[358,1753,1754],{"class":410},"    price ",[358,1756,1724],{"class":372},[358,1758,369],{"class":368},[358,1760,373],{"class":372},[358,1762,560],{"class":397},[358,1764,479],{"class":372},[358,1766,1767],{"class":397},"positive",[358,1769,529],{"class":372},[358,1771,1772],{"class":360,"line":584},[358,1773,1632],{"class":372},[358,1775,1776],{"class":360,"line":645},[358,1777,386],{"emptyLinePlaceholder":385},[358,1779,1780,1782,1785,1787,1789,1792,1794,1796,1798,1801,1803,1805,1808,1811,1814,1816,1819,1821,1823,1825],{"class":360,"line":651},[358,1781,665],{"class":442},[358,1783,1784],{"class":410}," p ",[358,1786,671],{"class":372},[358,1788,1668],{"class":368},[358,1790,1791],{"class":372}," {",[358,1793,460],{"class":410},[358,1795,463],{"class":372},[358,1797,916],{"class":372},[358,1799,1800],{"class":683},"X",[358,1802,922],{"class":372},[358,1804,715],{"class":372},[358,1806,1807],{"class":397},"into",[358,1809,1810],{"class":372},"(),",[358,1812,1813],{"class":410}," price",[358,1815,463],{"class":372},[358,1817,1818],{"class":372}," -",[358,1820,939],{"class":364},[358,1822,715],{"class":372},[358,1824,574],{"class":364},[358,1826,1827],{"class":372}," };\n",[358,1829,1830,1832,1835,1837,1839,1842],{"class":360,"line":657},[358,1831,737],{"class":397},[358,1833,1834],{"class":372},"(!",[358,1836,341],{"class":410},[358,1838,715],{"class":372},[358,1840,1841],{"class":397},"is_valid",[358,1843,754],{"class":372},[358,1845,1846,1848,1850,1852,1854,1857,1859,1862,1864,1867,1869,1872,1874,1877],{"class":360,"line":662},[358,1847,707],{"class":397},[358,1849,414],{"class":372},[358,1851,341],{"class":410},[358,1853,715],{"class":372},[358,1855,1856],{"class":397},"validate",[358,1858,479],{"class":372},[358,1860,1861],{"class":397},"unwrap_err",[358,1863,479],{"class":372},[358,1865,1866],{"class":410},"issues",[358,1868,715],{"class":372},[358,1870,1871],{"class":397},"len",[358,1873,1810],{"class":372},[358,1875,1876],{"class":364}," 2",[358,1878,1049],{"class":372},[341,1880,1881,1882,1885],{},"Use ",[344,1883,1884],{},"field as \"wireName\" => schema"," to report errors under a JSON name.",[1416,1887,1889],{"id":1888},"impl_default","impl_default!",[341,1891,1892,1895,1896,1898,1899,1902,1903,1906,1907,1910,1911,715],{},[344,1893,1894],{},"vld::impl_default!(Config { host, port })"," implements ",[344,1897,1444],{}," using each field ",[1374,1900,1901],{},"type's"," default (like ",[344,1904,1905],{},"#[derive(Default)]","). Schema defaults from ",[344,1908,1909],{},".with_default()"," are not used; to get them, parse an empty object: ",[344,1912,1913],{},"Config::parse_value(&serde_json::json!({}))",[1915,1916,1917],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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);}",{"title":354,"searchDepth":382,"depth":389,"links":1919},[1920,1921,1922,1923,1924],{"id":765,"depth":382,"text":766},{"id":866,"depth":382,"text":867},{"id":1113,"depth":382,"text":1114},{"id":1368,"depth":382,"text":1369},{"id":1413,"depth":382,"text":1414,"children":1925},[1926,1927,1928,1929],{"id":1418,"depth":389,"text":1419},{"id":1447,"depth":389,"text":1448},{"id":1635,"depth":389,"text":1636},{"id":1888,"depth":389,"text":1889},"Declare validated structs with vld::schema!, rename fields, nest structs and add validation to existing types.","md",null,{},{"title":80,"description":1930},"0Vz9qLcaNft7FsOjWBG8qvI_G574C7cPVLE9Tod3hNA",[1937,1939],{"title":70,"path":71,"stem":72,"description":1938,"children":-1},"from_serde, from_str, bytes, decimal, IP networks, socket addresses, paths, files, durations, raw JSON and nested schemas.",{"title":84,"path":85,"stem":86,"description":1940,"children":-1},"The derive macro for structs and enums — field attributes, serde renames and tagging, skip and default, generics and lenient parsing.",1794036356985]