[{"data":1,"prerenderedAt":1821},["ShallowReactive",2],{"navigation":3,"\u002Fschemas\u002Frules":335,"\u002Fschemas\u002Frules-surround":1816},[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":38,"body":337,"description":1810,"extension":1811,"links":1812,"meta":1813,"navigation":407,"path":39,"seo":1814,"stem":40,"__hash__":1815},"docs\u002F2.schemas\u002F10.rules.md",{"type":338,"value":339,"toc":1803},"minimark",[340,344,349,819,836,906,910,920,1245,1262,1275,1279,1282,1314,1332,1509,1513,1522,1636,1645,1649,1662,1774,1799],[341,342,343],"p",{},"A rule is a named check written once and attached wherever it is needed, like a Laravel rule object. It reports its own issue code, so its message can be set per schema or translated by key.",[345,346,348],"h2",{"id":347},"a-rule-type","A rule type",[350,351,356],"pre",{"className":352,"code":353,"language":354,"meta":355,"style":355},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use vld::prelude::*;\nuse vld::rules::Rule;\n\n\u002F\u002F\u002F `+7` and ten digits.\nstruct RuPhone;\n\nimpl Rule\u003Cstr> for RuPhone {\n    fn key(&self) -> &str {\n        \"ru_phone\"\n    }\n    fn check(&self, s: &str) -> bool {\n        s.strip_prefix(\"+7\")\n            .is_some_and(|d| d.len() == 10 && d.bytes().all(|b| b.is_ascii_digit()))\n    }\n}\n\nlet phone = vld::string().trim().rule(RuPhone);\nassert!(phone.parse(r#\"\"+79991234567\"\"#).is_ok());\n\nlet err = phone.parse(r#\"\"8999\"\"#).unwrap_err();\nassert_eq!(err.issues[0].code.key(), \"ru_phone\"); \u002F\u002F IssueCode::Custom { code: \"ru_phone\" }\n","rust","",[357,358,359,382,402,409,416,428,433,460,490,503,509,543,569,638,643,649,654,691,730,735,771],"code",{"__ignoreMap":355},[360,361,364,368,372,376,379],"span",{"class":362,"line":363},"line",1,[360,365,367],{"class":366},"sbssI","use",[360,369,371],{"class":370},"sBMFI"," vld",[360,373,375],{"class":374},"sMK4o","::",[360,377,378],{"class":370},"prelude",[360,380,381],{"class":374},"::*;\n",[360,383,385,387,389,391,394,396,399],{"class":362,"line":384},2,[360,386,367],{"class":366},[360,388,371],{"class":370},[360,390,375],{"class":374},[360,392,393],{"class":370},"rules",[360,395,375],{"class":374},[360,397,398],{"class":370},"Rule",[360,400,401],{"class":374},";\n",[360,403,405],{"class":362,"line":404},3,[360,406,408],{"emptyLinePlaceholder":407},true,"\n",[360,410,412],{"class":362,"line":411},4,[360,413,415],{"class":414},"sHwdD","\u002F\u002F\u002F `+7` and ten digits.\n",[360,417,419,423,426],{"class":362,"line":418},5,[360,420,422],{"class":421},"spNyl","struct",[360,424,425],{"class":370}," RuPhone",[360,427,401],{"class":374},[360,429,431],{"class":362,"line":430},6,[360,432,408],{"emptyLinePlaceholder":407},[360,434,436,439,442,445,448,451,455,457],{"class":362,"line":435},7,[360,437,438],{"class":366},"impl",[360,440,441],{"class":370}," Rule",[360,443,444],{"class":374},"\u003C",[360,446,447],{"class":370},"str",[360,449,450],{"class":374},">",[360,452,454],{"class":453},"s7zQu"," for",[360,456,425],{"class":370},[360,458,459],{"class":374}," {\n",[360,461,463,466,470,473,477,480,483,486,488],{"class":362,"line":462},8,[360,464,465],{"class":366},"    fn",[360,467,469],{"class":468},"s2Zo4"," key",[360,471,472],{"class":374},"(&",[360,474,476],{"class":475},"sTEyZ","self",[360,478,479],{"class":374},")",[360,481,482],{"class":374}," ->",[360,484,485],{"class":374}," &",[360,487,447],{"class":370},[360,489,459],{"class":374},[360,491,493,496,500],{"class":362,"line":492},9,[360,494,495],{"class":374},"        \"",[360,497,499],{"class":498},"sfazB","ru_phone",[360,501,502],{"class":374},"\"\n",[360,504,506],{"class":362,"line":505},10,[360,507,508],{"class":374},"    }\n",[360,510,512,514,517,519,521,524,527,530,532,534,536,538,541],{"class":362,"line":511},11,[360,513,465],{"class":366},[360,515,516],{"class":468}," check",[360,518,472],{"class":374},[360,520,476],{"class":475},[360,522,523],{"class":374},",",[360,525,526],{"class":475}," s",[360,528,529],{"class":374},":",[360,531,485],{"class":374},[360,533,447],{"class":370},[360,535,479],{"class":374},[360,537,482],{"class":374},[360,539,540],{"class":370}," bool",[360,542,459],{"class":374},[360,544,546,549,552,555,558,561,564,566],{"class":362,"line":545},12,[360,547,548],{"class":475},"        s",[360,550,551],{"class":374},".",[360,553,554],{"class":468},"strip_prefix",[360,556,557],{"class":374},"(",[360,559,560],{"class":374},"\"",[360,562,563],{"class":498},"+7",[360,565,560],{"class":374},[360,567,568],{"class":374},")\n",[360,570,572,575,578,581,584,587,590,592,595,598,601,604,607,609,611,614,617,620,622,625,627,630,632,635],{"class":362,"line":571},13,[360,573,574],{"class":374},"            .",[360,576,577],{"class":468},"is_some_and",[360,579,580],{"class":374},"(|",[360,582,583],{"class":475},"d",[360,585,586],{"class":374},"|",[360,588,589],{"class":475}," d",[360,591,551],{"class":374},[360,593,594],{"class":468},"len",[360,596,597],{"class":374},"()",[360,599,600],{"class":374}," ==",[360,602,603],{"class":366}," 10",[360,605,606],{"class":374}," &&",[360,608,589],{"class":475},[360,610,551],{"class":374},[360,612,613],{"class":468},"bytes",[360,615,616],{"class":374},"().",[360,618,619],{"class":468},"all",[360,621,580],{"class":374},[360,623,624],{"class":475},"b",[360,626,586],{"class":374},[360,628,629],{"class":475}," b",[360,631,551],{"class":374},[360,633,634],{"class":468},"is_ascii_digit",[360,636,637],{"class":374},"()))\n",[360,639,641],{"class":362,"line":640},14,[360,642,508],{"class":374},[360,644,646],{"class":362,"line":645},15,[360,647,648],{"class":374},"}\n",[360,650,652],{"class":362,"line":651},16,[360,653,408],{"emptyLinePlaceholder":407},[360,655,657,660,663,666,668,670,673,675,678,680,683,685,688],{"class":362,"line":656},17,[360,658,659],{"class":421},"let",[360,661,662],{"class":475}," phone ",[360,664,665],{"class":374},"=",[360,667,371],{"class":370},[360,669,375],{"class":374},[360,671,672],{"class":468},"string",[360,674,616],{"class":374},[360,676,677],{"class":468},"trim",[360,679,616],{"class":374},[360,681,682],{"class":468},"rule",[360,684,557],{"class":374},[360,686,687],{"class":370},"RuPhone",[360,689,690],{"class":374},");\n",[360,692,694,697,699,702,704,707,709,712,715,718,721,724,727],{"class":362,"line":693},18,[360,695,696],{"class":468},"assert!",[360,698,557],{"class":374},[360,700,701],{"class":475},"phone",[360,703,551],{"class":374},[360,705,706],{"class":468},"parse",[360,708,557],{"class":374},[360,710,711],{"class":498},"r",[360,713,714],{"class":374},"#\"",[360,716,717],{"class":498},"\"+79991234567\"",[360,719,720],{"class":374},"\"#",[360,722,723],{"class":374},").",[360,725,726],{"class":468},"is_ok",[360,728,729],{"class":374},"());\n",[360,731,733],{"class":362,"line":732},19,[360,734,408],{"emptyLinePlaceholder":407},[360,736,738,740,743,745,748,750,752,754,756,758,761,763,765,768],{"class":362,"line":737},20,[360,739,659],{"class":421},[360,741,742],{"class":475}," err ",[360,744,665],{"class":374},[360,746,747],{"class":475}," phone",[360,749,551],{"class":374},[360,751,706],{"class":468},[360,753,557],{"class":374},[360,755,711],{"class":498},[360,757,714],{"class":374},[360,759,760],{"class":498},"\"8999\"",[360,762,720],{"class":374},[360,764,723],{"class":374},[360,766,767],{"class":468},"unwrap_err",[360,769,770],{"class":374},"();\n",[360,772,774,777,779,782,784,787,790,793,796,798,800,803,806,809,811,813,816],{"class":362,"line":773},21,[360,775,776],{"class":468},"assert_eq!",[360,778,557],{"class":374},[360,780,781],{"class":475},"err",[360,783,551],{"class":374},[360,785,786],{"class":475},"issues",[360,788,789],{"class":374},"[",[360,791,792],{"class":366},"0",[360,794,795],{"class":374},"].",[360,797,357],{"class":475},[360,799,551],{"class":374},[360,801,802],{"class":468},"key",[360,804,805],{"class":374},"(),",[360,807,808],{"class":374}," \"",[360,810,499],{"class":498},[360,812,560],{"class":374},[360,814,815],{"class":374},");",[360,817,818],{"class":414}," \u002F\u002F IssueCode::Custom { code: \"ru_phone\" }\n",[341,820,821,824,825,828,829,832,833,551],{},[357,822,823],{},"ZString::rule"," keeps the string builder, so ",[357,826,827],{},".min()",", ",[357,830,831],{},".email()"," and other rules can follow; all checks run and all failures are reported, in order. Rules are stored in schemas that are built once and shared, so a rule must be ",[357,834,835],{},"Send + Sync + 'static",[837,838,839,852],"table",{},[840,841,842],"thead",{},[843,844,845,849],"tr",{},[846,847,848],"th",{},"Method",[846,850,851],{},"Purpose",[853,854,855,870,883,893],"tbody",{},[843,856,857,863],{},[858,859,860],"td",{},[357,861,862],{},"key()",[858,864,865,866,869],{},"issue code, ",[357,867,868],{},"with_messages"," key, translation key",[843,871,872,877],{},[858,873,874],{},[357,875,876],{},"check(&value)",[858,878,879,882],{},[357,880,881],{},"true"," when the value passes",[843,884,885,890],{},[858,886,887],{},[357,888,889],{},"message()",[858,891,892],{},"optional default message (see below)",[843,894,895,900],{},[858,896,897],{},[357,898,899],{},"json_schema()",[858,901,902,903,479],{},"optional JSON Schema keywords (feature ",[357,904,905],{},"openapi",[345,907,909],{"id":908},"on-any-schema","On any schema",[341,911,912,915,916,919],{},[357,913,914],{},"VldSchema::rule"," runs a ",[357,917,918],{},"Rule\u003COutput>"," on the parsed value of any schema: numbers, arrays, objects, derived structs. The inner schema runs first; the rule only sees valid values.",[350,921,923],{"className":352,"code":922,"language":354,"meta":355,"style":355},"use vld::rules::from_fn;\n\nlet even = vld::number().int().rule(from_fn(\"even\", |n: &i64| n % 2 == 0).message(\"Must be even\"));\nassert!(even.parse(\"4\").is_ok());\n\nlet distinct = from_fn(\"distinct\", |v: &Vec\u003Ci64>| {\n    let mut s = v.clone();\n    s.sort_unstable();\n    s.windows(2).all(|w| w[0] != w[1])\n});\nlet ids = vld::array(vld::number().int()).rule_msg(distinct, \"Ids must be unique\");\n",[357,924,925,942,946,1032,1059,1063,1107,1130,1142,1190,1195],{"__ignoreMap":355},[360,926,927,929,931,933,935,937,940],{"class":362,"line":363},[360,928,367],{"class":366},[360,930,371],{"class":370},[360,932,375],{"class":374},[360,934,393],{"class":370},[360,936,375],{"class":374},[360,938,939],{"class":370},"from_fn",[360,941,401],{"class":374},[360,943,944],{"class":362,"line":384},[360,945,408],{"emptyLinePlaceholder":407},[360,947,948,950,953,955,957,959,962,964,967,969,971,973,975,977,979,982,984,986,989,992,994,996,999,1001,1004,1007,1010,1012,1015,1017,1020,1022,1024,1027,1029],{"class":362,"line":404},[360,949,659],{"class":421},[360,951,952],{"class":475}," even ",[360,954,665],{"class":374},[360,956,371],{"class":370},[360,958,375],{"class":374},[360,960,961],{"class":468},"number",[360,963,616],{"class":374},[360,965,966],{"class":468},"int",[360,968,616],{"class":374},[360,970,682],{"class":468},[360,972,557],{"class":374},[360,974,939],{"class":468},[360,976,557],{"class":374},[360,978,560],{"class":374},[360,980,981],{"class":498},"even",[360,983,560],{"class":374},[360,985,523],{"class":374},[360,987,988],{"class":374}," |",[360,990,991],{"class":475},"n",[360,993,529],{"class":374},[360,995,485],{"class":374},[360,997,998],{"class":370},"i64",[360,1000,586],{"class":374},[360,1002,1003],{"class":475}," n ",[360,1005,1006],{"class":374},"%",[360,1008,1009],{"class":366}," 2",[360,1011,600],{"class":374},[360,1013,1014],{"class":366}," 0",[360,1016,723],{"class":374},[360,1018,1019],{"class":468},"message",[360,1021,557],{"class":374},[360,1023,560],{"class":374},[360,1025,1026],{"class":498},"Must be even",[360,1028,560],{"class":374},[360,1030,1031],{"class":374},"));\n",[360,1033,1034,1036,1038,1040,1042,1044,1046,1048,1051,1053,1055,1057],{"class":362,"line":411},[360,1035,696],{"class":468},[360,1037,557],{"class":374},[360,1039,981],{"class":475},[360,1041,551],{"class":374},[360,1043,706],{"class":468},[360,1045,557],{"class":374},[360,1047,560],{"class":374},[360,1049,1050],{"class":498},"4",[360,1052,560],{"class":374},[360,1054,723],{"class":374},[360,1056,726],{"class":468},[360,1058,729],{"class":374},[360,1060,1061],{"class":362,"line":418},[360,1062,408],{"emptyLinePlaceholder":407},[360,1064,1065,1067,1070,1072,1075,1077,1079,1082,1084,1086,1088,1091,1093,1095,1098,1100,1102,1105],{"class":362,"line":430},[360,1066,659],{"class":421},[360,1068,1069],{"class":475}," distinct ",[360,1071,665],{"class":374},[360,1073,1074],{"class":468}," from_fn",[360,1076,557],{"class":374},[360,1078,560],{"class":374},[360,1080,1081],{"class":498},"distinct",[360,1083,560],{"class":374},[360,1085,523],{"class":374},[360,1087,988],{"class":374},[360,1089,1090],{"class":475},"v",[360,1092,529],{"class":374},[360,1094,485],{"class":374},[360,1096,1097],{"class":370},"Vec",[360,1099,444],{"class":374},[360,1101,998],{"class":370},[360,1103,1104],{"class":374},">|",[360,1106,459],{"class":374},[360,1108,1109,1112,1115,1118,1120,1123,1125,1128],{"class":362,"line":435},[360,1110,1111],{"class":421},"    let",[360,1113,1114],{"class":421}," mut",[360,1116,1117],{"class":475}," s ",[360,1119,665],{"class":374},[360,1121,1122],{"class":475}," v",[360,1124,551],{"class":374},[360,1126,1127],{"class":468},"clone",[360,1129,770],{"class":374},[360,1131,1132,1135,1137,1140],{"class":362,"line":462},[360,1133,1134],{"class":475},"    s",[360,1136,551],{"class":374},[360,1138,1139],{"class":468},"sort_unstable",[360,1141,770],{"class":374},[360,1143,1144,1146,1148,1151,1153,1156,1158,1160,1162,1165,1167,1170,1172,1174,1177,1180,1182,1184,1187],{"class":362,"line":492},[360,1145,1134],{"class":475},[360,1147,551],{"class":374},[360,1149,1150],{"class":468},"windows",[360,1152,557],{"class":374},[360,1154,1155],{"class":366},"2",[360,1157,723],{"class":374},[360,1159,619],{"class":468},[360,1161,580],{"class":374},[360,1163,1164],{"class":475},"w",[360,1166,586],{"class":374},[360,1168,1169],{"class":475}," w",[360,1171,789],{"class":374},[360,1173,792],{"class":366},[360,1175,1176],{"class":374},"]",[360,1178,1179],{"class":374}," !=",[360,1181,1169],{"class":475},[360,1183,789],{"class":374},[360,1185,1186],{"class":366},"1",[360,1188,1189],{"class":374},"])\n",[360,1191,1192],{"class":362,"line":505},[360,1193,1194],{"class":374},"});\n",[360,1196,1197,1199,1202,1204,1206,1208,1211,1213,1216,1218,1220,1222,1224,1227,1230,1232,1234,1236,1238,1241,1243],{"class":362,"line":511},[360,1198,659],{"class":421},[360,1200,1201],{"class":475}," ids ",[360,1203,665],{"class":374},[360,1205,371],{"class":370},[360,1207,375],{"class":374},[360,1209,1210],{"class":468},"array",[360,1212,557],{"class":374},[360,1214,1215],{"class":370},"vld",[360,1217,375],{"class":374},[360,1219,961],{"class":468},[360,1221,616],{"class":374},[360,1223,966],{"class":468},[360,1225,1226],{"class":374},"()).",[360,1228,1229],{"class":468},"rule_msg",[360,1231,557],{"class":374},[360,1233,1081],{"class":475},[360,1235,523],{"class":374},[360,1237,808],{"class":374},[360,1239,1240],{"class":498},"Ids must be unique",[360,1242,560],{"class":374},[360,1244,690],{"class":374},[341,1246,1247,1250,1251,1254,1255,1258,1259,551],{},[357,1248,1249],{},"from_fn(key, closure)"," builds a rule without a type; ",[357,1252,1253],{},".message(...)"," and ",[357,1256,1257],{},".json_schema(...)"," add the optional parts. A rule shared between schemas can be an ",[357,1260,1261],{},"Arc\u003Cdyn Rule\u003Cstr>>",[341,1263,1264,1265,1268,1269,828,1271,1274],{},"Rules work wherever a schema expression does: ",[357,1266,1267],{},"#[vld(vld::string().rule(RuPhone))]"," in ",[357,1270,84],{},[357,1272,1273],{},"schema!"," fields, integration crates.",[345,1276,1278],{"id":1277},"messages","Messages",[341,1280,1281],{},"The message of a failing rule is, in order of priority:",[1283,1284,1285,1292,1299,1304],"ol",{},[1286,1287,1288,1291],"li",{},[357,1289,1290],{},"rule_msg(rule, \"...\")",";",[1286,1293,1294,1295,1298],{},"the schema's ",[357,1296,1297],{},"with_messages(|key| ...)"," for the rule's key (strings);",[1286,1300,1301,1302,1291],{},"the rule's own ",[357,1303,889],{},[1286,1305,1306,1307,1310,1311,723],{},"the generic ",[357,1308,1309],{},"custom"," template (",[357,1312,1313],{},"Validation error: ru_phone",[341,1315,1316,1317,1321,1322,1324,1325,1327,1328,1331],{},"Translation (",[1318,1319,1320],"a",{"href":119},"i18n",") looks the rule up by its key, then by ",[357,1323,1309],{},". Only 4 is translated: 1–3 are custom messages and are kept. So a rule meant to be translated leaves ",[357,1326,889],{}," as ",[357,1329,1330],{},"None"," and the translation table gets an entry for its key:",[350,1333,1335],{"className":352,"code":1334,"language":354,"meta":355,"style":355},"use std::collections::HashMap;\n\nlet ru = vld::i18n::MapResolver::new(HashMap::from([\n    (\"ru_phone\".to_string(), \"Нужен номер в формате +7XXXXXXXXXX\".to_string()),\n]));\nlet err = vld::string().rule(RuPhone).parse(r#\"\"8\"\"#).unwrap_err();\nlet err = vld::i18n::translate_error(&err, &ru);\n",[357,1336,1337,1356,1360,1397,1429,1434,1477],{"__ignoreMap":355},[360,1338,1339,1341,1344,1346,1349,1351,1354],{"class":362,"line":363},[360,1340,367],{"class":366},[360,1342,1343],{"class":370}," std",[360,1345,375],{"class":374},[360,1347,1348],{"class":370},"collections",[360,1350,375],{"class":374},[360,1352,1353],{"class":370},"HashMap",[360,1355,401],{"class":374},[360,1357,1358],{"class":362,"line":384},[360,1359,408],{"emptyLinePlaceholder":407},[360,1361,1362,1364,1367,1369,1371,1373,1375,1377,1380,1382,1385,1387,1389,1391,1394],{"class":362,"line":404},[360,1363,659],{"class":421},[360,1365,1366],{"class":475}," ru ",[360,1368,665],{"class":374},[360,1370,371],{"class":370},[360,1372,375],{"class":374},[360,1374,1320],{"class":370},[360,1376,375],{"class":374},[360,1378,1379],{"class":370},"MapResolver",[360,1381,375],{"class":374},[360,1383,1384],{"class":468},"new",[360,1386,557],{"class":374},[360,1388,1353],{"class":370},[360,1390,375],{"class":374},[360,1392,1393],{"class":468},"from",[360,1395,1396],{"class":374},"([\n",[360,1398,1399,1402,1404,1406,1408,1410,1413,1415,1417,1420,1422,1424,1426],{"class":362,"line":411},[360,1400,1401],{"class":374},"    (",[360,1403,560],{"class":374},[360,1405,499],{"class":498},[360,1407,560],{"class":374},[360,1409,551],{"class":374},[360,1411,1412],{"class":468},"to_string",[360,1414,805],{"class":374},[360,1416,808],{"class":374},[360,1418,1419],{"class":498},"Нужен номер в формате +7XXXXXXXXXX",[360,1421,560],{"class":374},[360,1423,551],{"class":374},[360,1425,1412],{"class":468},[360,1427,1428],{"class":374},"()),\n",[360,1430,1431],{"class":362,"line":418},[360,1432,1433],{"class":374},"]));\n",[360,1435,1436,1438,1440,1442,1444,1446,1448,1450,1452,1454,1456,1458,1460,1462,1464,1466,1469,1471,1473,1475],{"class":362,"line":430},[360,1437,659],{"class":421},[360,1439,742],{"class":475},[360,1441,665],{"class":374},[360,1443,371],{"class":370},[360,1445,375],{"class":374},[360,1447,672],{"class":468},[360,1449,616],{"class":374},[360,1451,682],{"class":468},[360,1453,557],{"class":374},[360,1455,687],{"class":370},[360,1457,723],{"class":374},[360,1459,706],{"class":468},[360,1461,557],{"class":374},[360,1463,711],{"class":498},[360,1465,714],{"class":374},[360,1467,1468],{"class":498},"\"8\"",[360,1470,720],{"class":374},[360,1472,723],{"class":374},[360,1474,767],{"class":468},[360,1476,770],{"class":374},[360,1478,1479,1481,1483,1485,1487,1489,1491,1493,1496,1498,1500,1502,1504,1507],{"class":362,"line":435},[360,1480,659],{"class":421},[360,1482,742],{"class":475},[360,1484,665],{"class":374},[360,1486,371],{"class":370},[360,1488,375],{"class":374},[360,1490,1320],{"class":370},[360,1492,375],{"class":374},[360,1494,1495],{"class":468},"translate_error",[360,1497,472],{"class":374},[360,1499,781],{"class":475},[360,1501,523],{"class":374},[360,1503,485],{"class":374},[360,1505,1506],{"class":475},"ru",[360,1508,690],{"class":374},[345,1510,1512],{"id":1511},"json-schema","JSON Schema",[341,1514,1515,1517,1518,1521],{},[357,1516,899],{}," returns keywords merged into the schema the rule is attached to. A keyword the schema already has goes into ",[357,1519,1520],{},"allOf",", so nothing is overwritten:",[350,1523,1525],{"className":352,"code":1524,"language":354,"meta":355,"style":355},"impl Rule\u003Cstr> for RuPhone {\n    \u002F\u002F ...\n    fn json_schema(&self) -> Option\u003Cserde_json::Value> {\n        Some(serde_json::json!({ \"format\": \"ru-phone\" }))\n    }\n}\n\u002F\u002F vld::string().rule(RuPhone)          → {\"type\": \"string\", \"format\": \"ru-phone\"}\n\u002F\u002F vld::string().email().rule(RuPhone)  → {\"type\": \"string\", \"format\": \"email\", \"allOf\": [{\"format\": \"ru-phone\"}]}\n",[357,1526,1527,1545,1550,1582,1618,1622,1626,1631],{"__ignoreMap":355},[360,1528,1529,1531,1533,1535,1537,1539,1541,1543],{"class":362,"line":363},[360,1530,438],{"class":366},[360,1532,441],{"class":370},[360,1534,444],{"class":374},[360,1536,447],{"class":370},[360,1538,450],{"class":374},[360,1540,454],{"class":453},[360,1542,425],{"class":370},[360,1544,459],{"class":374},[360,1546,1547],{"class":362,"line":384},[360,1548,1549],{"class":414},"    \u002F\u002F ...\n",[360,1551,1552,1554,1557,1559,1561,1563,1565,1568,1570,1573,1575,1578,1580],{"class":362,"line":404},[360,1553,465],{"class":366},[360,1555,1556],{"class":468}," json_schema",[360,1558,472],{"class":374},[360,1560,476],{"class":475},[360,1562,479],{"class":374},[360,1564,482],{"class":374},[360,1566,1567],{"class":370}," Option",[360,1569,444],{"class":374},[360,1571,1572],{"class":475},"serde_json",[360,1574,375],{"class":374},[360,1576,1577],{"class":370},"Value",[360,1579,450],{"class":374},[360,1581,459],{"class":374},[360,1583,1584,1587,1589,1591,1593,1596,1599,1601,1604,1606,1608,1610,1613,1615],{"class":362,"line":411},[360,1585,1586],{"class":370},"        Some",[360,1588,557],{"class":374},[360,1590,1572],{"class":370},[360,1592,375],{"class":374},[360,1594,1595],{"class":468},"json!",[360,1597,1598],{"class":374},"({",[360,1600,808],{"class":374},[360,1602,1603],{"class":498},"format",[360,1605,560],{"class":374},[360,1607,529],{"class":374},[360,1609,808],{"class":374},[360,1611,1612],{"class":498},"ru-phone",[360,1614,560],{"class":374},[360,1616,1617],{"class":374}," }))\n",[360,1619,1620],{"class":362,"line":418},[360,1621,508],{"class":374},[360,1623,1624],{"class":362,"line":430},[360,1625,648],{"class":374},[360,1627,1628],{"class":362,"line":435},[360,1629,1630],{"class":414},"\u002F\u002F vld::string().rule(RuPhone)          → {\"type\": \"string\", \"format\": \"ru-phone\"}\n",[360,1632,1633],{"class":362,"line":462},[360,1634,1635],{"class":414},"\u002F\u002F vld::string().email().rule(RuPhone)  → {\"type\": \"string\", \"format\": \"email\", \"allOf\": [{\"format\": \"ru-phone\"}]}\n",[341,1637,1638,1639,1641,1642,1644],{},"A rule without keywords is invisible in the schema; generated TypeScript (",[357,1640,216],{},") and fake data (",[357,1643,220],{},") only know what the schema says.",[345,1646,1648],{"id":1647},"patterns","Patterns",[341,1650,1651,1652,1655,1656,1659,1660,529],{},"With the ",[357,1653,1654],{},"regex"," feature, ",[357,1657,1658],{},"pattern"," checks a regular expression and emits it as the JSON Schema ",[357,1661,1658],{},[350,1663,1665],{"className":352,"code":1664,"language":354,"meta":355,"style":355},"let sku = vld::string().pattern(r\"^[A-Z]{3}-\\d{4}$\");\n\n\u002F\u002F Handle an invalid pattern instead of panicking:\nlet p = vld::rules::Pattern::new(user_input)?;\nlet s = vld::string().pattern_msg(p, \"Wrong SKU\");\n",[357,1666,1667,1699,1703,1708,1740],{"__ignoreMap":355},[360,1668,1669,1671,1674,1676,1678,1680,1682,1684,1686,1688,1690,1692,1695,1697],{"class":362,"line":363},[360,1670,659],{"class":421},[360,1672,1673],{"class":475}," sku ",[360,1675,665],{"class":374},[360,1677,371],{"class":370},[360,1679,375],{"class":374},[360,1681,672],{"class":468},[360,1683,616],{"class":374},[360,1685,1658],{"class":468},[360,1687,557],{"class":374},[360,1689,711],{"class":498},[360,1691,560],{"class":374},[360,1693,1694],{"class":498},"^[A-Z]{3}-\\d{4}$",[360,1696,560],{"class":374},[360,1698,690],{"class":374},[360,1700,1701],{"class":362,"line":384},[360,1702,408],{"emptyLinePlaceholder":407},[360,1704,1705],{"class":362,"line":404},[360,1706,1707],{"class":414},"\u002F\u002F Handle an invalid pattern instead of panicking:\n",[360,1709,1710,1712,1715,1717,1719,1721,1723,1725,1728,1730,1732,1734,1737],{"class":362,"line":411},[360,1711,659],{"class":421},[360,1713,1714],{"class":475}," p ",[360,1716,665],{"class":374},[360,1718,371],{"class":370},[360,1720,375],{"class":374},[360,1722,393],{"class":370},[360,1724,375],{"class":374},[360,1726,1727],{"class":370},"Pattern",[360,1729,375],{"class":374},[360,1731,1384],{"class":468},[360,1733,557],{"class":374},[360,1735,1736],{"class":475},"user_input",[360,1738,1739],{"class":374},")?;\n",[360,1741,1742,1744,1746,1748,1750,1752,1754,1756,1759,1761,1763,1765,1767,1770,1772],{"class":362,"line":418},[360,1743,659],{"class":421},[360,1745,1117],{"class":475},[360,1747,665],{"class":374},[360,1749,371],{"class":370},[360,1751,375],{"class":374},[360,1753,672],{"class":468},[360,1755,616],{"class":374},[360,1757,1758],{"class":468},"pattern_msg",[360,1760,557],{"class":374},[360,1762,341],{"class":475},[360,1764,523],{"class":374},[360,1766,808],{"class":374},[360,1768,1769],{"class":498},"Wrong SKU",[360,1771,560],{"class":374},[360,1773,690],{"class":374},[341,1775,1776,1777,1780,1781,828,1784,1786,1787,1790,1791,1794,1795,1798],{},"A pattern failure is ",[357,1778,1779],{},"invalid_string"," (",[357,1782,1783],{},"StringValidation::Regex",[357,1785,868],{}," key ",[357,1788,1789],{},"invalid_regex","). Matching uses ",[357,1792,1793],{},"regex-lite",": linear time, Rust syntax (no look-around, no backreferences), no Unicode classes such as ",[357,1796,1797],{},"\\p{L}","; when that is too limited, write a rule.",[1800,1801,1802],"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 .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}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 .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 .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":355,"searchDepth":384,"depth":404,"links":1804},[1805,1806,1807,1808,1809],{"id":347,"depth":384,"text":348},{"id":908,"depth":384,"text":909},{"id":1277,"depth":384,"text":1278},{"id":1511,"depth":384,"text":1512},{"id":1647,"depth":384,"text":1648},"Reusable named checks (the Rule trait), closure rules, messages and translations by key, JSON Schema keywords, and patterns.","md",null,{},{"title":38,"description":1810},"d3pcRL_dbGDEA_X-QR15i3C1P4S5eOa86Wo37YzhKg8",[1817,1819],{"title":34,"path":35,"stem":36,"description":1818,"children":-1},"vld::string() — length, patterns, transforms, coercion and more than 40 built-in formats.",{"title":42,"path":43,"stem":44,"description":1820,"children":-1},"f64 numbers, exact sized integers, f32, bounds, multiple_of and coercion from strings.",1794036358602]