[{"data":1,"prerenderedAt":1981},["ShallowReactive",2],{"navigation":3,"\u002Fschemas\u002Fspecial-types":335,"\u002Fschemas\u002Fspecial-types-surround":1976},[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":70,"body":337,"description":1970,"extension":1971,"links":1972,"meta":1973,"navigation":488,"path":71,"seo":1974,"stem":72,"__hash__":1975},"docs\u002F2.schemas\u002F9.special-types.md",{"type":338,"value":339,"toc":1959},"minimark",[340,345,349,431,798,817,821,834,914,1008,1012,1025,1117,1144,1148,1218,1235,1239,1271,1408,1423,1427,1457,1461,1469,1532,1571,1715,1719,1760,1916,1926,1930,1955],[341,342,344],"h2",{"id":343},"from_serde-and-from_str","from_serde and from_str",[346,347,348],"p",{},"Bridge any existing Rust type into a schema.",[350,351,352,368],"table",{},[353,354,355],"thead",{},[356,357,358,362,365],"tr",{},[359,360,361],"th",{},"Constructor",[359,363,364],{},"Reads",[359,366,367],{},"Error",[369,370,371,401],"tbody",{},[356,372,373,380,395],{},[374,375,376],"td",{},[377,378,379],"code",{},"vld::from_serde::\u003CT>()",[374,381,382,383,386,387,390,391,394],{},"the JSON value through ",[377,384,385],{},"T: Deserialize"," (Rust enums, ",[377,388,389],{},"uuid::Uuid",", ",[377,392,393],{},"url::Url",", …)",[374,396,397,400],{},[377,398,399],{},"parse_error"," with serde's message",[356,402,403,408,419],{},[374,404,405],{},[377,406,407],{},"vld::from_str::\u003CT>()",[374,409,410,411,414,415,418],{},"a JSON string through ",[377,412,413],{},"T: FromStr"," (",[377,416,417],{},"IpAddr",", numbers in strings, …)",[374,420,421,414,424,427,428],{},[377,422,423],{},"invalid_format",[377,425,426],{},"from_str",") with the error's ",[377,429,430],{},"Display",[432,433,438],"pre",{"className":434,"code":435,"language":436,"meta":437,"style":437},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use vld::prelude::*;\nuse std::net::IpAddr;\n\n#[derive(Debug, PartialEq, serde::Deserialize)]\n#[serde(rename_all = \"snake_case\")]\nenum Status { Active, OnHold }\n\nlet status = vld::from_serde::\u003CStatus>()\n    .schema(serde_json::json!({\"type\": \"string\", \"enum\": [\"active\", \"on_hold\"]}));\nassert_eq!(status.parse(r#\"\"on_hold\"\"#).unwrap(), Status::OnHold);\n\nlet ip = vld::from_str::\u003CIpAddr>().parse(r#\"\"::1\"\"#).unwrap();\nassert!(ip.is_loopback());\n","rust","",[377,439,440,463,483,490,525,553,577,582,610,681,731,736,779],{"__ignoreMap":437},[441,442,445,449,453,457,460],"span",{"class":443,"line":444},"line",1,[441,446,448],{"class":447},"sbssI","use",[441,450,452],{"class":451},"sBMFI"," vld",[441,454,456],{"class":455},"sMK4o","::",[441,458,459],{"class":451},"prelude",[441,461,462],{"class":455},"::*;\n",[441,464,466,468,471,473,476,478,480],{"class":443,"line":465},2,[441,467,448],{"class":447},[441,469,470],{"class":451}," std",[441,472,456],{"class":455},[441,474,475],{"class":451},"net",[441,477,456],{"class":455},[441,479,417],{"class":451},[441,481,482],{"class":455},";\n",[441,484,486],{"class":443,"line":485},3,[441,487,489],{"emptyLinePlaceholder":488},true,"\n",[441,491,493,496,500,503,506,509,512,514,517,519,522],{"class":443,"line":492},4,[441,494,495],{"class":455},"#[",[441,497,499],{"class":498},"sTEyZ","derive",[441,501,502],{"class":455},"(",[441,504,505],{"class":451},"Debug",[441,507,508],{"class":455},",",[441,510,511],{"class":451}," PartialEq",[441,513,508],{"class":455},[441,515,516],{"class":498}," serde",[441,518,456],{"class":455},[441,520,521],{"class":451},"Deserialize",[441,523,524],{"class":455},")]\n",[441,526,528,530,533,535,538,541,544,548,551],{"class":443,"line":527},5,[441,529,495],{"class":455},[441,531,532],{"class":498},"serde",[441,534,502],{"class":455},[441,536,537],{"class":498},"rename_all ",[441,539,540],{"class":455},"=",[441,542,543],{"class":455}," \"",[441,545,547],{"class":546},"sfazB","snake_case",[441,549,550],{"class":455},"\"",[441,552,524],{"class":455},[441,554,556,560,563,566,569,571,574],{"class":443,"line":555},6,[441,557,559],{"class":558},"spNyl","enum",[441,561,562],{"class":451}," Status",[441,564,565],{"class":455}," {",[441,567,568],{"class":451}," Active",[441,570,508],{"class":455},[441,572,573],{"class":451}," OnHold",[441,575,576],{"class":455}," }\n",[441,578,580],{"class":443,"line":579},7,[441,581,489],{"emptyLinePlaceholder":488},[441,583,585,588,591,593,595,597,601,604,607],{"class":443,"line":584},8,[441,586,587],{"class":558},"let",[441,589,590],{"class":498}," status ",[441,592,540],{"class":455},[441,594,452],{"class":451},[441,596,456],{"class":455},[441,598,600],{"class":599},"s2Zo4","from_serde",[441,602,603],{"class":455},"::\u003C",[441,605,606],{"class":451},"Status",[441,608,609],{"class":455},">()\n",[441,611,613,616,619,621,624,626,629,632,634,637,639,642,644,647,649,651,653,655,657,659,662,664,667,669,671,673,676,678],{"class":443,"line":612},9,[441,614,615],{"class":455},"    .",[441,617,618],{"class":599},"schema",[441,620,502],{"class":455},[441,622,623],{"class":451},"serde_json",[441,625,456],{"class":455},[441,627,628],{"class":599},"json!",[441,630,631],{"class":455},"({",[441,633,550],{"class":455},[441,635,636],{"class":546},"type",[441,638,550],{"class":455},[441,640,641],{"class":455},":",[441,643,543],{"class":455},[441,645,646],{"class":546},"string",[441,648,550],{"class":455},[441,650,508],{"class":455},[441,652,543],{"class":455},[441,654,559],{"class":546},[441,656,550],{"class":455},[441,658,641],{"class":455},[441,660,661],{"class":455}," [",[441,663,550],{"class":455},[441,665,666],{"class":546},"active",[441,668,550],{"class":455},[441,670,508],{"class":455},[441,672,543],{"class":455},[441,674,675],{"class":546},"on_hold",[441,677,550],{"class":455},[441,679,680],{"class":455},"]}));\n",[441,682,684,687,689,692,695,698,700,703,706,709,712,715,718,721,723,725,728],{"class":443,"line":683},10,[441,685,686],{"class":599},"assert_eq!",[441,688,502],{"class":455},[441,690,691],{"class":498},"status",[441,693,694],{"class":455},".",[441,696,697],{"class":599},"parse",[441,699,502],{"class":455},[441,701,702],{"class":546},"r",[441,704,705],{"class":455},"#\"",[441,707,708],{"class":546},"\"on_hold\"",[441,710,711],{"class":455},"\"#",[441,713,714],{"class":455},").",[441,716,717],{"class":599},"unwrap",[441,719,720],{"class":455},"(),",[441,722,562],{"class":451},[441,724,456],{"class":455},[441,726,727],{"class":451},"OnHold",[441,729,730],{"class":455},");\n",[441,732,734],{"class":443,"line":733},11,[441,735,489],{"emptyLinePlaceholder":488},[441,737,739,741,744,746,748,750,752,754,756,759,761,763,765,767,770,772,774,776],{"class":443,"line":738},12,[441,740,587],{"class":558},[441,742,743],{"class":498}," ip ",[441,745,540],{"class":455},[441,747,452],{"class":451},[441,749,456],{"class":455},[441,751,426],{"class":599},[441,753,603],{"class":455},[441,755,417],{"class":451},[441,757,758],{"class":455},">().",[441,760,697],{"class":599},[441,762,502],{"class":455},[441,764,702],{"class":546},[441,766,705],{"class":455},[441,768,769],{"class":546},"\"::1\"",[441,771,711],{"class":455},[441,773,714],{"class":455},[441,775,717],{"class":599},[441,777,778],{"class":455},"();\n",[441,780,782,785,787,790,792,795],{"class":443,"line":781},13,[441,783,784],{"class":599},"assert!",[441,786,502],{"class":455},[441,788,789],{"class":498},"ip",[441,791,694],{"class":455},[441,793,794],{"class":599},"is_loopback",[441,796,797],{"class":455},"());\n",[346,799,800,801,804,805,807,808,804,811,813,814,694],{},"The JSON Schema is ",[377,802,803],{},"{}"," for ",[377,806,600],{}," and ",[377,809,810],{},"{\"type\": \"string\"}",[377,812,426],{},"; set your own with ",[377,815,816],{},".schema(json)",[341,818,820],{"id":819},"bytes","Bytes",[346,822,823,826,827,830,831,694],{},[377,824,825],{},"vld::bytes()"," returns ",[377,828,829],{},"Vec\u003Cu8>",". By default it reads a JSON array of integers ",[377,832,833],{},"0..=255",[350,835,836,846],{},[353,837,838],{},[356,839,840,843],{},[359,841,842],{},"Method",[359,844,845],{},"Effect",[369,847,848,858,875,889],{},[356,849,850,855],{},[374,851,852],{},[377,853,854],{},"base64()",[374,856,857],{},"also accept a padded Base64 string",[356,859,860,865],{},[374,861,862],{},[377,863,864],{},"base64url()",[374,866,867,868,807,871,874],{},"also accept a Base64URL string (",[377,869,870],{},"+",[377,872,873],{},"\u002F"," rejected)",[356,876,877,882],{},[374,878,879],{},[377,880,881],{},"hex()",[374,883,884,885,888],{},"also accept a hex string (optional ",[377,886,887],{},"0x"," prefix)",[356,890,891,906],{},[374,892,893,896,897,896,900,896,903],{},[377,894,895],{},"min_len"," \u002F ",[377,898,899],{},"max_len",[377,901,902],{},"len",[377,904,905],{},"non_empty()",[374,907,908,909,913],{},"size of the ",[910,911,912],"strong",{},"decoded"," bytes",[432,915,917],{"className":434,"code":916,"language":436,"meta":437,"style":437},"let key = vld::bytes().base64().len(4);\nassert_eq!(key.parse(r#\"\"AAECAw==\"\"#).unwrap(), vec![0, 1, 2, 3]);\n",[377,918,919,951],{"__ignoreMap":437},[441,920,921,923,926,928,930,932,934,937,940,942,944,946,949],{"class":443,"line":444},[441,922,587],{"class":558},[441,924,925],{"class":498}," key ",[441,927,540],{"class":455},[441,929,452],{"class":451},[441,931,456],{"class":455},[441,933,819],{"class":599},[441,935,936],{"class":455},"().",[441,938,939],{"class":599},"base64",[441,941,936],{"class":455},[441,943,902],{"class":599},[441,945,502],{"class":455},[441,947,948],{"class":447},"4",[441,950,730],{"class":455},[441,952,953,955,957,960,962,964,966,968,970,973,975,977,979,981,984,987,990,992,995,997,1000,1002,1005],{"class":443,"line":465},[441,954,686],{"class":599},[441,956,502],{"class":455},[441,958,959],{"class":498},"key",[441,961,694],{"class":455},[441,963,697],{"class":599},[441,965,502],{"class":455},[441,967,702],{"class":546},[441,969,705],{"class":455},[441,971,972],{"class":546},"\"AAECAw==\"",[441,974,711],{"class":455},[441,976,714],{"class":455},[441,978,717],{"class":599},[441,980,720],{"class":455},[441,982,983],{"class":599}," vec!",[441,985,986],{"class":455},"[",[441,988,989],{"class":447},"0",[441,991,508],{"class":455},[441,993,994],{"class":447}," 1",[441,996,508],{"class":455},[441,998,999],{"class":447}," 2",[441,1001,508],{"class":455},[441,1003,1004],{"class":447}," 3",[441,1006,1007],{"class":455},"]);\n",[341,1009,1011],{"id":1010},"decimal","Decimal",[346,1013,1014,1015,1017,1018,826,1021,1024],{},"Feature ",[377,1016,1010],{},". ",[377,1019,1020],{},"vld::decimal()",[377,1022,1023],{},"rust_decimal::Decimal"," from a JSON string or number (plain or scientific notation). Bounds take strings so they keep full precision:",[432,1026,1028],{"className":434,"code":1027,"language":436,"meta":437,"style":437},"\u002F\u002F features = [\"decimal\"]\nlet amount = vld::decimal().non_negative().max(\"1000000\").multiple_of(\"0.01\");\nassert!(amount.parse(r#\"\"19.99\"\"#).is_ok());\n",[377,1029,1030,1036,1086],{"__ignoreMap":437},[441,1031,1032],{"class":443,"line":444},[441,1033,1035],{"class":1034},"sHwdD","\u002F\u002F features = [\"decimal\"]\n",[441,1037,1038,1040,1043,1045,1047,1049,1051,1053,1056,1058,1061,1063,1065,1068,1070,1072,1075,1077,1079,1082,1084],{"class":443,"line":465},[441,1039,587],{"class":558},[441,1041,1042],{"class":498}," amount ",[441,1044,540],{"class":455},[441,1046,452],{"class":451},[441,1048,456],{"class":455},[441,1050,1010],{"class":599},[441,1052,936],{"class":455},[441,1054,1055],{"class":599},"non_negative",[441,1057,936],{"class":455},[441,1059,1060],{"class":599},"max",[441,1062,502],{"class":455},[441,1064,550],{"class":455},[441,1066,1067],{"class":546},"1000000",[441,1069,550],{"class":455},[441,1071,714],{"class":455},[441,1073,1074],{"class":599},"multiple_of",[441,1076,502],{"class":455},[441,1078,550],{"class":455},[441,1080,1081],{"class":546},"0.01",[441,1083,550],{"class":455},[441,1085,730],{"class":455},[441,1087,1088,1090,1092,1095,1097,1099,1101,1103,1105,1108,1110,1112,1115],{"class":443,"line":485},[441,1089,784],{"class":599},[441,1091,502],{"class":455},[441,1093,1094],{"class":498},"amount",[441,1096,694],{"class":455},[441,1098,697],{"class":599},[441,1100,502],{"class":455},[441,1102,702],{"class":546},[441,1104,705],{"class":455},[441,1106,1107],{"class":546},"\"19.99\"",[441,1109,711],{"class":455},[441,1111,714],{"class":455},[441,1113,1114],{"class":599},"is_ok",[441,1116,797],{"class":455},[346,1118,1119,1120,390,1123,390,1125,390,1128,390,1131,390,1133,390,1136,390,1139,390,1141,694],{},"Methods: ",[377,1121,1122],{},"min",[377,1124,1060],{},[377,1126,1127],{},"gt",[377,1129,1130],{},"lt",[377,1132,1074],{},[377,1134,1135],{},"positive",[377,1137,1138],{},"negative",[377,1140,1055],{},[377,1142,1143],{},"non_positive",[341,1145,1147],{"id":1146},"network-types","Network types",[350,1149,1150,1162],{},[353,1151,1152],{},[356,1153,1154,1156,1159],{},[359,1155,361],{},[359,1157,1158],{},"Output",[359,1160,1161],{},"Methods",[369,1163,1164,1189],{},[356,1165,1166,1175,1181],{},[374,1167,1168,1171,1172,1174],{},[377,1169,1170],{},"vld::ip_network()"," (feature ",[377,1173,475],{},")",[374,1176,1177,1180],{},[377,1178,1179],{},"ipnet::IpNet"," from a CIDR string",[374,1182,1183,390,1186],{},[377,1184,1185],{},"ipv4_only()",[377,1187,1188],{},"ipv6_only()",[356,1190,1191,1196,1210],{},[374,1192,1193],{},[377,1194,1195],{},"vld::socket_addr()",[374,1197,1198,1201,1202,1205,1206,1209],{},[377,1199,1200],{},"std::net::SocketAddr"," from ",[377,1203,1204],{},"ipv4:port"," or ",[377,1207,1208],{},"[ipv6]:port"," (no hostnames)",[374,1211,1212,390,1215],{},[377,1213,1214],{},"min_port(p)",[377,1216,1217],{},"max_port(p)",[346,1219,1220,1221,1228,1229,1231,1232,694],{},"For IP addresses as plain strings use ",[1222,1223,1225],"a",{"href":1224},"\u002Fschemas\u002Fstrings#network",[377,1226,1227],{},"string().ip()","; for ",[377,1230,417],{}," use ",[377,1233,1234],{},"from_str::\u003CIpAddr>()",[341,1236,1238],{"id":1237},"duration","Duration",[346,1240,1241,826,1244,1247,1248,390,1251,1254,1255,390,1258,390,1261,1264,1265,896,1268,694],{},[377,1242,1243],{},"vld::duration()",[377,1245,1246],{},"std::time::Duration",". It accepts a non-negative number of seconds (",[377,1249,1250],{},"3",[377,1252,1253],{},"1.5",") or a string: ",[377,1256,1257],{},"\"10s\"",[377,1259,1260],{},"\"1.5s\"",[377,1262,1263],{},"\"250ms\""," (integer milliseconds), ISO 8601 ",[377,1266,1267],{},"\"PT15S\"",[377,1269,1270],{},"\"PT1.5S\"",[432,1272,1274],{"className":434,"code":1273,"language":436,"meta":437,"style":437},"use std::time::Duration;\n\nlet timeout = vld::duration().max_secs(60);\nassert_eq!(timeout.parse(r#\"\"250ms\"\"#).unwrap(), Duration::from_millis(250));\nassert_eq!(timeout.parse(\"1.5\").unwrap(), Duration::from_millis(1500));\n",[377,1275,1276,1293,1297,1324,1369],{"__ignoreMap":437},[441,1277,1278,1280,1282,1284,1287,1289,1291],{"class":443,"line":444},[441,1279,448],{"class":447},[441,1281,470],{"class":451},[441,1283,456],{"class":455},[441,1285,1286],{"class":451},"time",[441,1288,456],{"class":455},[441,1290,1238],{"class":451},[441,1292,482],{"class":455},[441,1294,1295],{"class":443,"line":465},[441,1296,489],{"emptyLinePlaceholder":488},[441,1298,1299,1301,1304,1306,1308,1310,1312,1314,1317,1319,1322],{"class":443,"line":485},[441,1300,587],{"class":558},[441,1302,1303],{"class":498}," timeout ",[441,1305,540],{"class":455},[441,1307,452],{"class":451},[441,1309,456],{"class":455},[441,1311,1237],{"class":599},[441,1313,936],{"class":455},[441,1315,1316],{"class":599},"max_secs",[441,1318,502],{"class":455},[441,1320,1321],{"class":447},"60",[441,1323,730],{"class":455},[441,1325,1326,1328,1330,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1356,1358,1361,1363,1366],{"class":443,"line":492},[441,1327,686],{"class":599},[441,1329,502],{"class":455},[441,1331,1332],{"class":498},"timeout",[441,1334,694],{"class":455},[441,1336,697],{"class":599},[441,1338,502],{"class":455},[441,1340,702],{"class":546},[441,1342,705],{"class":455},[441,1344,1263],{"class":546},[441,1346,711],{"class":455},[441,1348,714],{"class":455},[441,1350,717],{"class":599},[441,1352,720],{"class":455},[441,1354,1355],{"class":451}," Duration",[441,1357,456],{"class":455},[441,1359,1360],{"class":599},"from_millis",[441,1362,502],{"class":455},[441,1364,1365],{"class":447},"250",[441,1367,1368],{"class":455},"));\n",[441,1370,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1406],{"class":443,"line":527},[441,1372,686],{"class":599},[441,1374,502],{"class":455},[441,1376,1332],{"class":498},[441,1378,694],{"class":455},[441,1380,697],{"class":599},[441,1382,502],{"class":455},[441,1384,550],{"class":455},[441,1386,1253],{"class":546},[441,1388,550],{"class":455},[441,1390,714],{"class":455},[441,1392,717],{"class":599},[441,1394,720],{"class":455},[441,1396,1355],{"class":451},[441,1398,456],{"class":455},[441,1400,1360],{"class":599},[441,1402,502],{"class":455},[441,1404,1405],{"class":447},"1500",[441,1407,1368],{"class":455},[346,1409,1410,1411,390,1414,390,1417,390,1420,694],{},"Bounds: ",[377,1412,1413],{},"min(Duration)",[377,1415,1416],{},"max(Duration)",[377,1418,1419],{},"min_secs(u64)",[377,1421,1422],{},"max_secs(u64)",[341,1424,1426],{"id":1425},"raw-json","Raw JSON",[346,1428,1429,1432,1433,1436,1437,390,1440,390,1443,390,1446,414,1449,1452,1453,1456],{},[377,1430,1431],{},"vld::json_value()"," returns a ",[377,1434,1435],{},"serde_json::Value"," with shape constraints: ",[377,1438,1439],{},"object()",[377,1441,1442],{},"array()",[377,1444,1445],{},"require_key(\"id\")",[377,1447,1448],{},"max_depth(n)",[377,1450,1451],{},"json_too_deep"," when nesting is deeper). Use ",[377,1454,1455],{},"vld::any()"," to accept anything without checks.",[341,1458,1460],{"id":1459},"path","Path",[346,1462,1463,826,1466,694],{},[377,1464,1465],{},"vld::path()",[377,1467,1468],{},"std::path::PathBuf",[350,1470,1471,1480],{},[353,1472,1473],{},[356,1474,1475,1477],{},[359,1476,842],{},[359,1478,1479],{},"Check",[369,1481,1482,1495,1515],{},[356,1483,1484,1492],{},[374,1485,1486,896,1489],{},[377,1487,1488],{},"absolute()",[377,1490,1491],{},"relative()",[374,1493,1494],{},"path form",[356,1496,1497,1508],{},[374,1498,1499,896,1502,896,1505],{},[377,1500,1501],{},"exists()",[377,1503,1504],{},"file()",[377,1506,1507],{},"dir()",[374,1509,1510,1511,1514],{},"checked against the ",[910,1512,1513],{},"server's"," filesystem",[356,1516,1517,1522],{},[374,1518,1519],{},[377,1520,1521],{},"within(base)",[374,1523,1524,1525,1528,1529],{},"the path must stay inside ",[377,1526,1527],{},"base","; returns ",[377,1530,1531],{},"base.join(input)",[1533,1534,1535],"warning",{},[346,1536,1537,1538,1540,1541,1544,1545,896,1547,896,1549,1551,1552,1555,1556,390,1558,1560,1561,807,1564,1567,1568,694],{},"Paths from requests are untrusted. Without ",[377,1539,1521],{},", any absolute path or ",[377,1542,1543],{},".."," is accepted, and ",[377,1546,1501],{},[377,1548,1504],{},[377,1550,1507],{}," tell a client whether arbitrary paths exist on your machine. ",[377,1553,1554],{},"within"," resolves ",[377,1557,694],{},[377,1559,1543],{}," and existing symlinks before the check, so ",[377,1562,1563],{},"\"..\u002Fetc\u002Fpasswd\"",[377,1565,1566],{},"\"\u002Fbase\u002F..\u002Fetc\u002Fx\""," are rejected even if they do not exist. Read the ",[1222,1569,1570],{"href":317},"security guide",[432,1572,1574],{"className":434,"code":1573,"language":436,"meta":437,"style":437},"let upload = vld::path().relative().within(\"\u002Fsrv\u002Fuploads\");\nlet p = upload.parse(r#\"\"avatars\u002Fada.png\"\"#).unwrap();\nassert_eq!(p, std::path::PathBuf::from(\"\u002Fsrv\u002Fuploads\u002Favatars\u002Fada.png\"));\nassert!(upload.parse(r#\"\"..\u002Fetc\u002Fpasswd\"\"#).is_err()); \u002F\u002F path_outside_base\n",[377,1575,1576,1611,1644,1681],{"__ignoreMap":437},[441,1577,1578,1580,1583,1585,1587,1589,1591,1593,1596,1598,1600,1602,1604,1607,1609],{"class":443,"line":444},[441,1579,587],{"class":558},[441,1581,1582],{"class":498}," upload ",[441,1584,540],{"class":455},[441,1586,452],{"class":451},[441,1588,456],{"class":455},[441,1590,1459],{"class":599},[441,1592,936],{"class":455},[441,1594,1595],{"class":599},"relative",[441,1597,936],{"class":455},[441,1599,1554],{"class":599},[441,1601,502],{"class":455},[441,1603,550],{"class":455},[441,1605,1606],{"class":546},"\u002Fsrv\u002Fuploads",[441,1608,550],{"class":455},[441,1610,730],{"class":455},[441,1612,1613,1615,1618,1620,1623,1625,1627,1629,1631,1633,1636,1638,1640,1642],{"class":443,"line":465},[441,1614,587],{"class":558},[441,1616,1617],{"class":498}," p ",[441,1619,540],{"class":455},[441,1621,1622],{"class":498}," upload",[441,1624,694],{"class":455},[441,1626,697],{"class":599},[441,1628,502],{"class":455},[441,1630,702],{"class":546},[441,1632,705],{"class":455},[441,1634,1635],{"class":546},"\"avatars\u002Fada.png\"",[441,1637,711],{"class":455},[441,1639,714],{"class":455},[441,1641,717],{"class":599},[441,1643,778],{"class":455},[441,1645,1646,1648,1650,1652,1654,1656,1658,1660,1662,1665,1667,1670,1672,1674,1677,1679],{"class":443,"line":485},[441,1647,686],{"class":599},[441,1649,502],{"class":455},[441,1651,346],{"class":498},[441,1653,508],{"class":455},[441,1655,470],{"class":451},[441,1657,456],{"class":455},[441,1659,1459],{"class":451},[441,1661,456],{"class":455},[441,1663,1664],{"class":451},"PathBuf",[441,1666,456],{"class":455},[441,1668,1669],{"class":599},"from",[441,1671,502],{"class":455},[441,1673,550],{"class":455},[441,1675,1676],{"class":546},"\u002Fsrv\u002Fuploads\u002Favatars\u002Fada.png",[441,1678,550],{"class":455},[441,1680,1368],{"class":455},[441,1682,1683,1685,1687,1690,1692,1694,1696,1698,1700,1702,1704,1706,1709,1712],{"class":443,"line":492},[441,1684,784],{"class":599},[441,1686,502],{"class":455},[441,1688,1689],{"class":498},"upload",[441,1691,694],{"class":455},[441,1693,697],{"class":599},[441,1695,502],{"class":455},[441,1697,702],{"class":546},[441,1699,705],{"class":455},[441,1701,1563],{"class":546},[441,1703,711],{"class":455},[441,1705,714],{"class":455},[441,1707,1708],{"class":599},"is_err",[441,1710,1711],{"class":455},"());",[441,1713,1714],{"class":1034}," \u002F\u002F path_outside_base\n",[341,1716,1718],{"id":1717},"file","File",[346,1720,1014,1721,1723,1724,1727,1728,1731,1732,1734,1735,1738,1739,390,1742,390,1745,390,1748,390,1751,390,1754,807,1757,694],{},[377,1722,1717],{}," (and ",[377,1725,1726],{},"file-advanced"," for hashes, image size and EXIF). ",[377,1729,1730],{},"vld::file()"," reads a file path (a string, or an object with a string ",[377,1733,1459],{},") and returns a ",[377,1736,1737],{},"ValidatedFile"," with ",[377,1740,1741],{},"path()",[377,1743,1744],{},"size()",[377,1746,1747],{},"media_type()",[377,1749,1750],{},"extension()",[377,1752,1753],{},"bytes()",[377,1755,1756],{},"read_bytes()",[377,1758,1759],{},"open()",[350,1761,1762,1770],{},[353,1763,1764],{},[356,1765,1766,1768],{},[359,1767,842],{},[359,1769,1479],{},[369,1771,1772,1790,1806,1830,1843,1858,1879,1891,1902],{},[356,1773,1774,1784],{},[374,1775,1776,896,1779,896,1782],{},[377,1777,1778],{},"min_size(bytes)",[377,1780,1781],{},"max_size(bytes)",[377,1783,905],{},[374,1785,1786,1787,913],{},"file size; reads stop after ",[377,1788,1789],{},"max_size + 1",[356,1791,1792,1803],{},[374,1793,1794,896,1797,896,1800],{},[377,1795,1796],{},"extension(\"png\")",[377,1798,1799],{},"extensions(&[...])",[377,1801,1802],{},"deny_extension(..)",[374,1804,1805],{},"file extension",[356,1807,1808,1819],{},[374,1809,1810,896,1813,896,1816],{},[377,1811,1812],{},"media_type(\"image\u002F*\")",[377,1814,1815],{},"media_types(&[...])",[377,1817,1818],{},"deny_media_type(..)",[374,1820,1821,1822,1825,1826,1829],{},"MIME type sniffed from the content (",[377,1823,1824],{},"infer","; wildcards like ",[377,1827,1828],{},"image\u002F*"," allowed)",[356,1831,1832,1840],{},[374,1833,1834,896,1837],{},[377,1835,1836],{},"allow_magic_type(\"png\")",[377,1838,1839],{},"deny_magic_type(..)",[374,1841,1842],{},"file kind sniffed from the content, by extension name",[356,1844,1845,1853],{},[374,1846,1847,896,1850],{},[377,1848,1849],{},"sha256(hex)",[377,1851,1852],{},"md5(hex)",[374,1854,1855,1856,1174],{},"checksum (",[377,1857,1726],{},[356,1859,1860,1874],{},[374,1861,1862,896,1865,896,1868,896,1871],{},[377,1863,1864],{},"min_width",[377,1866,1867],{},"max_width",[377,1869,1870],{},"min_height",[377,1872,1873],{},"max_height",[374,1875,1876,1877,1174],{},"image dimensions (",[377,1878,1726],{},[356,1880,1881,1886],{},[374,1882,1883],{},[377,1884,1885],{},"require_exif()",[374,1887,1888,1889,1174],{},"image has EXIF data (",[377,1890,1726],{},[356,1892,1893,1897],{},[374,1894,1895],{},[377,1896,1521],{},[374,1898,1899,1900],{},"confine the path, as for ",[377,1901,1465],{},[356,1903,1904,1913],{},[374,1905,1906,1909,1910],{},[377,1907,1908],{},"store_in_memory()"," (default) \u002F ",[377,1911,1912],{},"store_path_only()",[374,1914,1915],{},"keep the bytes in the output or only the path",[1533,1917,1918],{},[346,1919,1920,1922,1923,1925],{},[377,1921,1730],{}," opens and reads the file named by the input. Always add ",[377,1924,1521],{}," when the path comes from a client.",[341,1927,1929],{"id":1928},"nested-schemas","Nested schemas",[346,1931,1932,1935,1936,1939,1940,1943,1944,1947,1948,1951,1952,694],{},[377,1933,1934],{},"vld::nested(T::parse_value)"," uses another ",[377,1937,1938],{},"schema!"," \u002F derive type as a field schema. ",[377,1941,1942],{},"vld::nested!(T)"," does the same and also registers ",[377,1945,1946],{},"T"," as a named OpenAPI component, so the parent's JSON Schema contains a ",[377,1949,1950],{},"$ref",". See ",[1222,1953,122],{"href":1954},"\u002Fopenapi\u002Fjson-schema#nested-schemas",[1956,1957,1958],"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 .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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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":437,"searchDepth":465,"depth":485,"links":1960},[1961,1962,1963,1964,1965,1966,1967,1968,1969],{"id":343,"depth":465,"text":344},{"id":819,"depth":465,"text":820},{"id":1010,"depth":465,"text":1011},{"id":1146,"depth":465,"text":1147},{"id":1237,"depth":465,"text":1238},{"id":1425,"depth":465,"text":1426},{"id":1459,"depth":465,"text":1460},{"id":1717,"depth":465,"text":1718},{"id":1928,"depth":465,"text":1929},"from_serde, from_str, bytes, decimal, IP networks, socket addresses, paths, files, durations, raw JSON and nested schemas.","md",null,{},{"title":70,"description":1970},"qi1JRCOukcIPOo_DJgzVL3u4ZWbFAISwXdppD8oDXhE",[1977,1979],{"title":66,"path":67,"stem":68,"description":1978,"children":-1},"Unions, intersections, discriminated unions, refinements, transforms, pipes, preprocessing, lazy and custom schemas.",{"title":80,"path":81,"stem":82,"description":1980,"children":-1},"Declare validated structs with vld::schema!, rename fields, nest structs and add validation to existing types.",1794036359442]