[{"data":1,"prerenderedAt":1569},["ShallowReactive",2],{"navigation":3,"\u002Fopenapi\u002Fdiff":335,"\u002Fopenapi\u002Fdiff-surround":1564},[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":132,"body":337,"description":1558,"extension":1559,"links":1560,"meta":1561,"navigation":474,"path":133,"seo":1562,"stem":134,"__hash__":1563},"docs\u002F5.openapi\u002F2.diff.md",{"type":338,"value":339,"toc":1552},"minimark",[340,353,417,1052,1065,1070,1157,1161,1169,1252,1256,1362,1372,1376,1548],[341,342,343,344,348,349,352],"p",{},"The ",[345,346,347],"code",{},"diff"," feature (it enables ",[345,350,351],{},"openapi",") compares two JSON Schemas and classifies every change as breaking or non-breaking. Use it in CI to catch API changes that would break existing clients.",[354,355,361],"pre",{"className":356,"code":357,"filename":358,"language":359,"meta":360,"style":360},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","vld = { version = \"0.5\", features = [\"diff\"] }\n","Cargo.toml","toml","",[345,362,363],{"__ignoreMap":360},[364,365,368,372,376,379,382,384,387,391,394,397,400,402,405,407,409,411,414],"span",{"class":366,"line":367},"line",1,[364,369,371],{"class":370},"sTEyZ","vld ",[364,373,375],{"class":374},"sMK4o","=",[364,377,378],{"class":374}," {",[364,380,381],{"class":370}," version ",[364,383,375],{"class":374},[364,385,386],{"class":374}," \"",[364,388,390],{"class":389},"sfazB","0.5",[364,392,393],{"class":374},"\"",[364,395,396],{"class":374},",",[364,398,399],{"class":370}," features ",[364,401,375],{"class":374},[364,403,404],{"class":374}," [",[364,406,393],{"class":374},[364,408,347],{"class":389},[364,410,393],{"class":374},[364,412,413],{"class":374},"]",[364,415,416],{"class":374}," }\n",[354,418,422],{"className":419,"code":420,"language":421,"meta":360,"style":360},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use serde_json::json;\nuse vld::diff::{diff_schemas, ChangeKind};\n\nlet old = json!({\n    \"type\": \"object\",\n    \"required\": [\"name\", \"email\"],\n    \"properties\": {\n        \"name\": { \"type\": \"string\" },\n        \"email\": { \"type\": \"string\", \"format\": \"email\" }\n    }\n});\n\nlet new = json!({\n    \"type\": \"object\",\n    \"required\": [\"name\", \"email\", \"age\"],\n    \"properties\": {\n        \"name\": { \"type\": \"string\" },\n        \"email\": { \"type\": \"string\" },\n        \"age\": { \"type\": \"integer\" }\n    }\n});\n\nlet diff = diff_schemas(&old, &new);\nassert!(diff.has_breaking()); \u002F\u002F \"age\" is a new required field\n\nfor change in &diff.changes {\n    let tag = if change.kind == ChangeKind::Breaking { \"BREAKING\" } else { \"ok\" };\n    println!(\"[{tag}] {}: {}\", change.path, change.description);\n}\n","rust",[345,423,424,443,469,476,495,519,552,567,599,645,651,657,662,676,695,733,746,775,804,834,839,844,849,879,903,908,933,992,1046],{"__ignoreMap":360},[364,425,426,430,434,437,440],{"class":366,"line":367},[364,427,429],{"class":428},"sbssI","use",[364,431,433],{"class":432},"sBMFI"," serde_json",[364,435,436],{"class":374},"::",[364,438,439],{"class":432},"json",[364,441,442],{"class":374},";\n",[364,444,446,448,451,453,455,458,461,463,466],{"class":366,"line":445},2,[364,447,429],{"class":428},[364,449,450],{"class":432}," vld",[364,452,436],{"class":374},[364,454,347],{"class":432},[364,456,457],{"class":374},"::{",[364,459,460],{"class":432},"diff_schemas",[364,462,396],{"class":374},[364,464,465],{"class":432}," ChangeKind",[364,467,468],{"class":374},"};\n",[364,470,472],{"class":366,"line":471},3,[364,473,475],{"emptyLinePlaceholder":474},true,"\n",[364,477,479,483,486,488,492],{"class":366,"line":478},4,[364,480,482],{"class":481},"spNyl","let",[364,484,485],{"class":370}," old ",[364,487,375],{"class":374},[364,489,491],{"class":490},"s2Zo4"," json!",[364,493,494],{"class":374},"({\n",[364,496,498,501,504,506,509,511,514,516],{"class":366,"line":497},5,[364,499,500],{"class":374},"    \"",[364,502,503],{"class":389},"type",[364,505,393],{"class":374},[364,507,508],{"class":374},":",[364,510,386],{"class":374},[364,512,513],{"class":389},"object",[364,515,393],{"class":374},[364,517,518],{"class":374},",\n",[364,520,522,524,527,529,531,533,535,538,540,542,544,547,549],{"class":366,"line":521},6,[364,523,500],{"class":374},[364,525,526],{"class":389},"required",[364,528,393],{"class":374},[364,530,508],{"class":374},[364,532,404],{"class":374},[364,534,393],{"class":374},[364,536,537],{"class":389},"name",[364,539,393],{"class":374},[364,541,396],{"class":374},[364,543,386],{"class":374},[364,545,546],{"class":389},"email",[364,548,393],{"class":374},[364,550,551],{"class":374},"],\n",[364,553,555,557,560,562,564],{"class":366,"line":554},7,[364,556,500],{"class":374},[364,558,559],{"class":389},"properties",[364,561,393],{"class":374},[364,563,508],{"class":374},[364,565,566],{"class":374}," {\n",[364,568,570,573,575,577,579,581,583,585,587,589,591,594,596],{"class":366,"line":569},8,[364,571,572],{"class":374},"        \"",[364,574,537],{"class":389},[364,576,393],{"class":374},[364,578,508],{"class":374},[364,580,378],{"class":374},[364,582,386],{"class":374},[364,584,503],{"class":389},[364,586,393],{"class":374},[364,588,508],{"class":374},[364,590,386],{"class":374},[364,592,593],{"class":389},"string",[364,595,393],{"class":374},[364,597,598],{"class":374}," },\n",[364,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,633,635,637,639,641,643],{"class":366,"line":601},9,[364,603,572],{"class":374},[364,605,546],{"class":389},[364,607,393],{"class":374},[364,609,508],{"class":374},[364,611,378],{"class":374},[364,613,386],{"class":374},[364,615,503],{"class":389},[364,617,393],{"class":374},[364,619,508],{"class":374},[364,621,386],{"class":374},[364,623,593],{"class":389},[364,625,393],{"class":374},[364,627,396],{"class":374},[364,629,386],{"class":374},[364,631,632],{"class":389},"format",[364,634,393],{"class":374},[364,636,508],{"class":374},[364,638,386],{"class":374},[364,640,546],{"class":389},[364,642,393],{"class":374},[364,644,416],{"class":374},[364,646,648],{"class":366,"line":647},10,[364,649,650],{"class":374},"    }\n",[364,652,654],{"class":366,"line":653},11,[364,655,656],{"class":374},"});\n",[364,658,660],{"class":366,"line":659},12,[364,661,475],{"emptyLinePlaceholder":474},[364,663,665,667,670,672,674],{"class":366,"line":664},13,[364,666,482],{"class":481},[364,668,669],{"class":370}," new ",[364,671,375],{"class":374},[364,673,491],{"class":490},[364,675,494],{"class":374},[364,677,679,681,683,685,687,689,691,693],{"class":366,"line":678},14,[364,680,500],{"class":374},[364,682,503],{"class":389},[364,684,393],{"class":374},[364,686,508],{"class":374},[364,688,386],{"class":374},[364,690,513],{"class":389},[364,692,393],{"class":374},[364,694,518],{"class":374},[364,696,698,700,702,704,706,708,710,712,714,716,718,720,722,724,726,729,731],{"class":366,"line":697},15,[364,699,500],{"class":374},[364,701,526],{"class":389},[364,703,393],{"class":374},[364,705,508],{"class":374},[364,707,404],{"class":374},[364,709,393],{"class":374},[364,711,537],{"class":389},[364,713,393],{"class":374},[364,715,396],{"class":374},[364,717,386],{"class":374},[364,719,546],{"class":389},[364,721,393],{"class":374},[364,723,396],{"class":374},[364,725,386],{"class":374},[364,727,728],{"class":389},"age",[364,730,393],{"class":374},[364,732,551],{"class":374},[364,734,736,738,740,742,744],{"class":366,"line":735},16,[364,737,500],{"class":374},[364,739,559],{"class":389},[364,741,393],{"class":374},[364,743,508],{"class":374},[364,745,566],{"class":374},[364,747,749,751,753,755,757,759,761,763,765,767,769,771,773],{"class":366,"line":748},17,[364,750,572],{"class":374},[364,752,537],{"class":389},[364,754,393],{"class":374},[364,756,508],{"class":374},[364,758,378],{"class":374},[364,760,386],{"class":374},[364,762,503],{"class":389},[364,764,393],{"class":374},[364,766,508],{"class":374},[364,768,386],{"class":374},[364,770,593],{"class":389},[364,772,393],{"class":374},[364,774,598],{"class":374},[364,776,778,780,782,784,786,788,790,792,794,796,798,800,802],{"class":366,"line":777},18,[364,779,572],{"class":374},[364,781,546],{"class":389},[364,783,393],{"class":374},[364,785,508],{"class":374},[364,787,378],{"class":374},[364,789,386],{"class":374},[364,791,503],{"class":389},[364,793,393],{"class":374},[364,795,508],{"class":374},[364,797,386],{"class":374},[364,799,593],{"class":389},[364,801,393],{"class":374},[364,803,598],{"class":374},[364,805,807,809,811,813,815,817,819,821,823,825,827,830,832],{"class":366,"line":806},19,[364,808,572],{"class":374},[364,810,728],{"class":389},[364,812,393],{"class":374},[364,814,508],{"class":374},[364,816,378],{"class":374},[364,818,386],{"class":374},[364,820,503],{"class":389},[364,822,393],{"class":374},[364,824,508],{"class":374},[364,826,386],{"class":374},[364,828,829],{"class":389},"integer",[364,831,393],{"class":374},[364,833,416],{"class":374},[364,835,837],{"class":366,"line":836},20,[364,838,650],{"class":374},[364,840,842],{"class":366,"line":841},21,[364,843,656],{"class":374},[364,845,847],{"class":366,"line":846},22,[364,848,475],{"emptyLinePlaceholder":474},[364,850,852,854,857,859,862,865,868,870,873,876],{"class":366,"line":851},23,[364,853,482],{"class":481},[364,855,856],{"class":370}," diff ",[364,858,375],{"class":374},[364,860,861],{"class":490}," diff_schemas",[364,863,864],{"class":374},"(&",[364,866,867],{"class":370},"old",[364,869,396],{"class":374},[364,871,872],{"class":374}," &",[364,874,875],{"class":370},"new",[364,877,878],{"class":374},");\n",[364,880,882,885,888,890,893,896,899],{"class":366,"line":881},24,[364,883,884],{"class":490},"assert!",[364,886,887],{"class":374},"(",[364,889,347],{"class":370},[364,891,892],{"class":374},".",[364,894,895],{"class":490},"has_breaking",[364,897,898],{"class":374},"());",[364,900,902],{"class":901},"sHwdD"," \u002F\u002F \"age\" is a new required field\n",[364,904,906],{"class":366,"line":905},25,[364,907,475],{"emptyLinePlaceholder":474},[364,909,911,915,918,921,923,925,927,930],{"class":366,"line":910},26,[364,912,914],{"class":913},"s7zQu","for",[364,916,917],{"class":370}," change ",[364,919,920],{"class":428},"in",[364,922,872],{"class":374},[364,924,347],{"class":370},[364,926,892],{"class":374},[364,928,929],{"class":370},"changes ",[364,931,932],{"class":374},"{\n",[364,934,936,939,942,944,947,950,952,955,958,960,962,965,967,969,972,974,977,980,982,984,987,989],{"class":366,"line":935},27,[364,937,938],{"class":481},"    let",[364,940,941],{"class":370}," tag ",[364,943,375],{"class":374},[364,945,946],{"class":913}," if",[364,948,949],{"class":370}," change",[364,951,892],{"class":374},[364,953,954],{"class":370},"kind ",[364,956,957],{"class":374},"==",[364,959,465],{"class":432},[364,961,436],{"class":374},[364,963,964],{"class":432},"Breaking",[364,966,378],{"class":374},[364,968,386],{"class":374},[364,970,971],{"class":389},"BREAKING",[364,973,393],{"class":374},[364,975,976],{"class":374}," }",[364,978,979],{"class":913}," else",[364,981,378],{"class":374},[364,983,386],{"class":374},[364,985,986],{"class":389},"ok",[364,988,393],{"class":374},[364,990,991],{"class":374}," };\n",[364,993,995,998,1000,1002,1005,1008,1011,1014,1017,1020,1023,1026,1028,1030,1032,1035,1037,1039,1041,1044],{"class":366,"line":994},28,[364,996,997],{"class":490},"    println!",[364,999,887],{"class":374},[364,1001,393],{"class":374},[364,1003,1004],{"class":389},"[",[364,1006,1007],{"class":374},"{",[364,1009,1010],{"class":389},"tag",[364,1012,1013],{"class":374},"}",[364,1015,1016],{"class":389},"] ",[364,1018,1019],{"class":374},"{}",[364,1021,1022],{"class":389},": ",[364,1024,1025],{"class":374},"{}\"",[364,1027,396],{"class":374},[364,1029,949],{"class":370},[364,1031,892],{"class":374},[364,1033,1034],{"class":370},"path",[364,1036,396],{"class":374},[364,1038,949],{"class":370},[364,1040,892],{"class":374},[364,1042,1043],{"class":370},"description",[364,1045,878],{"class":374},[364,1047,1049],{"class":366,"line":1048},29,[364,1050,1051],{"class":374},"}\n",[341,1053,1054,1056,1057,1060,1061,1064],{},[345,1055,460],{}," works on plain ",[345,1058,1059],{},"serde_json::Value","s, so the schemas can come from ",[345,1062,1063],{},"json_schema()",", a stored snapshot or another tool.",[1066,1067,1069],"h2",{"id":1068},"api","API",[1071,1072,1073,1086],"table",{},[1074,1075,1076],"thead",{},[1077,1078,1079,1083],"tr",{},[1080,1081,1082],"th",{},"Item",[1080,1084,1085],{},"Purpose",[1087,1088,1089,1100,1110,1127,1144],"tbody",{},[1077,1090,1091,1097],{},[1092,1093,1094],"td",{},[345,1095,1096],{},"diff_schemas(&old, &new) -> SchemaDiff",[1092,1098,1099],{},"compare",[1077,1101,1102,1107],{},[1092,1103,1104],{},[345,1105,1106],{},"SchemaDiff { changes }",[1092,1108,1109],{},"every change",[1077,1111,1112,1124],{},[1092,1113,1114,1117,1118,1117,1121],{},[345,1115,1116],{},"has_breaking()"," \u002F ",[345,1119,1120],{},"breaking_changes()",[345,1122,1123],{},"non_breaking_changes()",[1092,1125,1126],{},"filter",[1077,1128,1129,1134],{},[1092,1130,1131],{},[345,1132,1133],{},"SchemaChange { path, kind, description }",[1092,1135,1136,1137,1139,1140,1143],{},"one change; ",[345,1138,1034],{}," is dot-separated (",[345,1141,1142],{},"properties.email.format",")",[1077,1145,1146,1154],{},[1092,1147,1148,1117,1151],{},[345,1149,1150],{},"ChangeKind::Breaking",[345,1152,1153],{},"ChangeKind::NonBreaking",[1092,1155,1156],{},"severity",[1066,1158,1160],{"id":1159},"direction","Direction",[341,1162,1163,1164,1168],{},"The classification assumes ",[1165,1166,1167],"strong",{},"request"," (input) schemas: a change is breaking when the new schema rejects input the old one accepted, and non-breaking when it only accepts more. For response schemas read it the other way round.",[1071,1170,1171,1180],{},[1074,1172,1173],{},[1077,1174,1175,1177],{},[1080,1176,964],{},[1080,1178,1179],{},"Non-breaking",[1087,1181,1182,1190,1198,1214,1231,1244],{},[1077,1183,1184,1187],{},[1092,1185,1186],{},"new required field",[1092,1188,1189],{},"new optional field",[1077,1191,1192,1195],{},[1092,1193,1194],{},"removed field",[1092,1196,1197],{},"field became optional",[1077,1199,1200,1203],{},[1092,1201,1202],{},"type changed",[1092,1204,1205,1206,1209,1210,1213],{},"constraint relaxed (",[345,1207,1208],{},"maxLength"," raised, ",[345,1211,1212],{},"minimum"," lowered)",[1077,1215,1216,1224],{},[1092,1217,1218,1219,1117,1221],{},"constraint tightened, new ",[345,1220,632],{},[345,1222,1223],{},"pattern",[1092,1225,1226,1117,1228,1230],{},[345,1227,632],{},[345,1229,1223],{}," removed",[1077,1232,1233,1239],{},[1092,1234,1235,1238],{},[345,1236,1237],{},"null"," no longer accepted",[1092,1240,1241,1243],{},[345,1242,1237],{}," now accepted",[1077,1245,1246,1249],{},[1092,1247,1248],{},"enum value removed",[1092,1250,1251],{},"enum value added",[1066,1253,1255],{"id":1254},"what-is-compared","What is compared",[341,1257,1258,1260,1261,1260,1263,1260,1265,1260,1267,1117,1269,1272,1273,1117,1276,1260,1278,1117,1281,1260,1284,1117,1287,1260,1290,1117,1293,1260,1296,1260,1299,1260,1302,1260,1305,1260,1307,1260,1310,1260,1313,1260,1316,1260,1319,1260,1322,1260,1325,1117,1328,1260,1331,1117,1334,1117,1337,1340,1341,1344,1345,1117,1348,1117,1351,1354,1355,1117,1358,1361],{},[345,1259,503],{},", ",[345,1262,526],{},[345,1264,559],{},[345,1266,632],{},[345,1268,1212],{},[345,1270,1271],{},"maximum"," (and exclusive forms), ",[345,1274,1275],{},"minLength",[345,1277,1208],{},[345,1279,1280],{},"minItems",[345,1282,1283],{},"maxItems",[345,1285,1286],{},"minProperties",[345,1288,1289],{},"maxProperties",[345,1291,1292],{},"minContains",[345,1294,1295],{},"maxContains",[345,1297,1298],{},"multipleOf",[345,1300,1301],{},"const",[345,1303,1304],{},"enum",[345,1306,1223],{},[345,1308,1309],{},"uniqueItems",[345,1311,1312],{},"items",[345,1314,1315],{},"prefixItems",[345,1317,1318],{},"contains",[345,1320,1321],{},"propertyNames",[345,1323,1324],{},"additionalProperties",[345,1326,1327],{},"formatMinimum",[345,1329,1330],{},"formatMaximum",[345,1332,1333],{},"anyOf",[345,1335,1336],{},"oneOf",[345,1338,1339],{},"allOf"," (position by position), ",[345,1342,1343],{},"$ref"," (by name), and vld's ",[345,1346,1347],{},"x-min*",[345,1349,1350],{},"x-max*",[345,1352,1353],{},"x-exclusive*"," bounds and ",[345,1356,1357],{},"x-past",[345,1359,1360],{},"x-future"," flags.",[341,1363,1364,1365,1367,1368,1371],{},"Nullable wrappers (",[345,1366,1333],{}," of ",[345,1369,1370],{},"[X, {\"type\": \"null\"}]",") are unwrapped, so changes inside optional fields are found.",[1066,1373,1375],{"id":1374},"snapshot-workflow","Snapshot workflow",[354,1377,1379],{"className":419,"code":1378,"language":421,"meta":360,"style":360},"#[test]\nfn api_has_no_breaking_changes() {\n    let old: serde_json::Value =\n        serde_json::from_str(include_str!(\"snapshots\u002Fcreate_user.json\")).unwrap();\n    let new = CreateUser::json_schema();\n    let diff = vld::diff::diff_schemas(&old, &new);\n    assert!(!diff.has_breaking(), \"{:#?}\", diff.breaking_changes());\n}\n",[345,1380,1381,1392,1405,1424,1457,1475,1505,1544],{"__ignoreMap":360},[364,1382,1383,1386,1389],{"class":366,"line":367},[364,1384,1385],{"class":374},"#[",[364,1387,1388],{"class":370},"test",[364,1390,1391],{"class":374},"]\n",[364,1393,1394,1397,1400,1403],{"class":366,"line":445},[364,1395,1396],{"class":428},"fn",[364,1398,1399],{"class":490}," api_has_no_breaking_changes",[364,1401,1402],{"class":374},"()",[364,1404,566],{"class":374},[364,1406,1407,1409,1412,1414,1416,1418,1421],{"class":366,"line":471},[364,1408,938],{"class":481},[364,1410,1411],{"class":370}," old",[364,1413,508],{"class":374},[364,1415,433],{"class":432},[364,1417,436],{"class":374},[364,1419,1420],{"class":432},"Value",[364,1422,1423],{"class":374}," =\n",[364,1425,1426,1429,1431,1434,1436,1439,1441,1443,1446,1448,1451,1454],{"class":366,"line":478},[364,1427,1428],{"class":432},"        serde_json",[364,1430,436],{"class":374},[364,1432,1433],{"class":490},"from_str",[364,1435,887],{"class":374},[364,1437,1438],{"class":490},"include_str!",[364,1440,887],{"class":374},[364,1442,393],{"class":374},[364,1444,1445],{"class":389},"snapshots\u002Fcreate_user.json",[364,1447,393],{"class":374},[364,1449,1450],{"class":374},")).",[364,1452,1453],{"class":490},"unwrap",[364,1455,1456],{"class":374},"();\n",[364,1458,1459,1461,1463,1465,1468,1470,1473],{"class":366,"line":497},[364,1460,938],{"class":481},[364,1462,669],{"class":370},[364,1464,375],{"class":374},[364,1466,1467],{"class":432}," CreateUser",[364,1469,436],{"class":374},[364,1471,1472],{"class":490},"json_schema",[364,1474,1456],{"class":374},[364,1476,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503],{"class":366,"line":521},[364,1478,938],{"class":481},[364,1480,856],{"class":370},[364,1482,375],{"class":374},[364,1484,450],{"class":432},[364,1486,436],{"class":374},[364,1488,347],{"class":432},[364,1490,436],{"class":374},[364,1492,460],{"class":490},[364,1494,864],{"class":374},[364,1496,867],{"class":370},[364,1498,396],{"class":374},[364,1500,872],{"class":374},[364,1502,875],{"class":370},[364,1504,878],{"class":374},[364,1506,1507,1510,1513,1515,1517,1519,1522,1525,1528,1531,1533,1536,1538,1541],{"class":366,"line":554},[364,1508,1509],{"class":490},"    assert!",[364,1511,1512],{"class":374},"(!",[364,1514,347],{"class":370},[364,1516,892],{"class":374},[364,1518,895],{"class":490},[364,1520,1521],{"class":374},"(),",[364,1523,1524],{"class":374}," \"{",[364,1526,1527],{"class":389},":#?",[364,1529,1530],{"class":374},"}\"",[364,1532,396],{"class":374},[364,1534,1535],{"class":370}," diff",[364,1537,892],{"class":374},[364,1539,1540],{"class":490},"breaking_changes",[364,1542,1543],{"class":374},"());\n",[364,1545,1546],{"class":366,"line":569},[364,1547,1051],{"class":374},[1549,1550,1551],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 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 .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}",{"title":360,"searchDepth":445,"depth":471,"links":1553},[1554,1555,1556,1557],{"id":1068,"depth":445,"text":1069},{"id":1159,"depth":445,"text":1160},{"id":1254,"depth":445,"text":1255},{"id":1374,"depth":445,"text":1375},"Detect breaking changes between two JSON Schemas with vld::diff.","md",null,{},{"title":132,"description":1558},"X8NnEyEl9nOZmAkiQhjl0gq79zafHYEMT2A_OA1E2Oo",[1565,1567],{"title":128,"path":129,"stem":130,"description":1566,"children":-1},"Generate JSON Schema and OpenAPI 3.1 documents from vld schemas, including nested components and vld's x-* extensions.",{"title":148,"path":149,"stem":150,"description":1568,"children":-1},"What every vld web integration has in common — extractors, status codes, the error body, coercion, header and cookie rules, and body limits.",1794036360359]