[{"data":1,"prerenderedAt":712},["ShallowReactive",2],{"content-home":3},{"id":4,"title":5,"author":6,"body":7,"date":6,"description":704,"extension":705,"meta":706,"navigation":707,"order":6,"path":708,"seo":709,"stem":710,"version":6,"__hash__":711},"content\u002Findex.md","Finitio",null,{"type":8,"value":9,"toc":700},"minimark",[10,15,23,329,335,427,431,442,639,654,664,696],[11,12,14],"h2",{"id":13},"validating","Validating",[16,17,18,19,22],"p",{},"Suppose we want to capture information about a medical diagnosis for some\npatient. At left, a typical digital document in JSON. At right, the\ncorresponding ",[20,21,5],"em",{}," schema.",[24,25,28,152],"demo-panels",{"left-title":26,"right-title":27},"diagnosis.json","diagnosis.fio",[29,30,32],"template",{"v-slot:left":31},"",[33,34,38],"pre",{"className":35,"code":36,"language":37,"meta":31,"style":31},"language-json shiki shiki-themes github-light github-dark","{\n  \"patient\": {\n    \"id\": \"27b3ceb0-7e10-0131-c9f1-3c07545ed162\",\n    \"name\": \"Marcia Delgados\",\n    \"dob\": \"1975-11-03\"\n  },\n  \"symptoms\": [\n    \"Nausea\",\n    \"Fever\"\n  ],\n  \"temperature\": 39.5\n}\n","json",[39,40,41,50,60,76,89,100,106,115,123,129,135,146],"code",{"__ignoreMap":31},[42,43,46],"span",{"class":44,"line":45},"line",1,[42,47,49],{"class":48},"sVt8B","{\n",[42,51,53,57],{"class":44,"line":52},2,[42,54,56],{"class":55},"sj4cs","  \"patient\"",[42,58,59],{"class":48},": {\n",[42,61,63,66,69,73],{"class":44,"line":62},3,[42,64,65],{"class":55},"    \"id\"",[42,67,68],{"class":48},": ",[42,70,72],{"class":71},"sZZnC","\"27b3ceb0-7e10-0131-c9f1-3c07545ed162\"",[42,74,75],{"class":48},",\n",[42,77,79,82,84,87],{"class":44,"line":78},4,[42,80,81],{"class":55},"    \"name\"",[42,83,68],{"class":48},[42,85,86],{"class":71},"\"Marcia Delgados\"",[42,88,75],{"class":48},[42,90,92,95,97],{"class":44,"line":91},5,[42,93,94],{"class":55},"    \"dob\"",[42,96,68],{"class":48},[42,98,99],{"class":71},"\"1975-11-03\"\n",[42,101,103],{"class":44,"line":102},6,[42,104,105],{"class":48},"  },\n",[42,107,109,112],{"class":44,"line":108},7,[42,110,111],{"class":55},"  \"symptoms\"",[42,113,114],{"class":48},": [\n",[42,116,118,121],{"class":44,"line":117},8,[42,119,120],{"class":71},"    \"Nausea\"",[42,122,75],{"class":48},[42,124,126],{"class":44,"line":125},9,[42,127,128],{"class":71},"    \"Fever\"\n",[42,130,132],{"class":44,"line":131},10,[42,133,134],{"class":48},"  ],\n",[42,136,138,141,143],{"class":44,"line":137},11,[42,139,140],{"class":55},"  \"temperature\"",[42,142,68],{"class":48},[42,144,145],{"class":55},"39.5\n",[42,147,149],{"class":44,"line":148},12,[42,150,151],{"class":48},"}\n",[29,153,154],{"v-slot:right":31},[33,155,159],{"className":156,"code":157,"language":158,"meta":31,"style":31},"language-finitio shiki shiki-themes github-light github-dark","Temp = \u003Ccelsius> Real( f | f >= 33.0 and f \u003C= 45.0 )\n{\n  patient : {\n    id   : Uuid,\n    name : String( s | s.size > 0 ),\n    dob  : Date( d | alive: d.year > 1890 ),\n  },\n  symptoms : [ String( s | s.size > 0 ) ],\n  temperature : Temp\n}\n","finitio",[39,160,161,217,221,226,236,263,291,295,317,325],{"__ignoreMap":31},[42,162,163,167,171,174,178,181,184,187,191,194,197,200,203,206,208,211,214],{"class":44,"line":45},[42,164,166],{"class":165},"sScJk","Temp",[42,168,170],{"class":169},"szBVR"," =",[42,172,173],{"class":48}," \u003C",[42,175,177],{"class":176},"s9eBZ","celsius",[42,179,180],{"class":48},"> ",[42,182,183],{"class":55},"Real",[42,185,186],{"class":48},"( ",[42,188,190],{"class":189},"s4XuR","f",[42,192,193],{"class":169}," |",[42,195,196],{"class":48}," f ",[42,198,199],{"class":169},">=",[42,201,202],{"class":55}," 33.0",[42,204,205],{"class":169}," and",[42,207,196],{"class":48},[42,209,210],{"class":169},"\u003C=",[42,212,213],{"class":55}," 45.0",[42,215,216],{"class":48}," )\n",[42,218,219],{"class":44,"line":52},[42,220,49],{"class":48},[42,222,223],{"class":44,"line":62},[42,224,225],{"class":48},"  patient : {\n",[42,227,228,231,234],{"class":44,"line":78},[42,229,230],{"class":48},"    id   : ",[42,232,233],{"class":55},"Uuid",[42,235,75],{"class":48},[42,237,238,241,244,246,249,251,254,257,260],{"class":44,"line":91},[42,239,240],{"class":48},"    name : ",[42,242,243],{"class":55},"String",[42,245,186],{"class":48},[42,247,248],{"class":189},"s",[42,250,193],{"class":169},[42,252,253],{"class":48}," s.size ",[42,255,256],{"class":169},">",[42,258,259],{"class":55}," 0",[42,261,262],{"class":48}," ),\n",[42,264,265,268,271,273,276,278,281,284,286,289],{"class":44,"line":102},[42,266,267],{"class":48},"    dob  : ",[42,269,270],{"class":55},"Date",[42,272,186],{"class":48},[42,274,275],{"class":189},"d",[42,277,193],{"class":169},[42,279,280],{"class":165}," alive",[42,282,283],{"class":48},": d.year ",[42,285,256],{"class":169},[42,287,288],{"class":55}," 1890",[42,290,262],{"class":48},[42,292,293],{"class":44,"line":108},[42,294,105],{"class":48},[42,296,297,300,302,304,306,308,310,312,314],{"class":44,"line":117},[42,298,299],{"class":48},"  symptoms : [ ",[42,301,243],{"class":55},[42,303,186],{"class":48},[42,305,248],{"class":189},[42,307,193],{"class":169},[42,309,253],{"class":48},[42,311,256],{"class":169},[42,313,259],{"class":55},[42,315,316],{"class":48}," ) ],\n",[42,318,319,322],{"class":44,"line":125},[42,320,321],{"class":48},"  temperature : ",[42,323,324],{"class":55},"Temp\n",[42,326,327],{"class":44,"line":131},[42,328,151],{"class":48},[16,330,331,332,334],{},"Suppose an invalid document comes in. With ",[20,333,5],{},", you properly validate\ninput data and get error messages that say exactly what went wrong, and where.",[24,336,342,417],{"left-title":337,"right-title":338,"left-badge":339,"left-tone":340,"right-badge":341,"right-tone":340},"invalid.json","errors","rejected","invalid","4 problems",[29,343,344],{"v-slot:left":31},[33,345,347],{"className":35,"code":346,"language":37,"meta":31,"style":31},"{\n  \"patient\": {\n    \"id\": \"27b3ceb0\",\n    \"dob\": \"1875-11-03\"\n  },\n  \"symptoms\": [\n    \"Nausea\",\n    \"\"\n  ],\n  \"temperature\": 12.5\n}\n",[39,348,349,353,359,370,379,383,389,395,400,404,413],{"__ignoreMap":31},[42,350,351],{"class":44,"line":45},[42,352,49],{"class":48},[42,354,355,357],{"class":44,"line":52},[42,356,56],{"class":55},[42,358,59],{"class":48},[42,360,361,363,365,368],{"class":44,"line":62},[42,362,65],{"class":55},[42,364,68],{"class":48},[42,366,367],{"class":71},"\"27b3ceb0\"",[42,369,75],{"class":48},[42,371,372,374,376],{"class":44,"line":78},[42,373,94],{"class":55},[42,375,68],{"class":48},[42,377,378],{"class":71},"\"1875-11-03\"\n",[42,380,381],{"class":44,"line":91},[42,382,105],{"class":48},[42,384,385,387],{"class":44,"line":102},[42,386,111],{"class":55},[42,388,114],{"class":48},[42,390,391,393],{"class":44,"line":108},[42,392,120],{"class":71},[42,394,75],{"class":48},[42,396,397],{"class":44,"line":117},[42,398,399],{"class":71},"    \"\"\n",[42,401,402],{"class":44,"line":125},[42,403,134],{"class":48},[42,405,406,408,410],{"class":44,"line":131},[42,407,140],{"class":55},[42,409,68],{"class":48},[42,411,412],{"class":55},"12.5\n",[42,414,415],{"class":44,"line":137},[42,416,151],{"class":48},[29,418,419],{"v-slot:right":31},[33,420,425],{"className":421,"code":423,"language":424},[422],"language-text","[patient\u002Fid] Invalid value `27b3ceb0` for Uuid\n[patient\u002Fdob] Invalid value `1875-11-03` for Date (not alive)\n[symptoms\u002F1] Invalid value \"\" for String( s | s.size > 0 )\n[temperature] Invalid value 12.5 for Temperature (celsius)\n","text",[39,426,423],{"__ignoreMap":31},[11,428,430],{"id":429},"coercing","Coercing",[16,432,433,434,436,437,441],{},"Data exchange languages such as JSON impose a very low abstraction level:\nbooleans, strings and numbers. ",[20,435,5],{}," helps raise the level of discourse,\nletting you navigate up and down abstraction levels through ",[438,439,440],"strong",{},"information\ncontracts",".",[24,443,446,546],{"left-title":444,"right-title":445},"measures.json","measures.fio",[29,447,448],{"v-slot:left":31},[33,449,451],{"className":35,"code":450,"language":37,"meta":31,"style":31},"[\n  {\n    \"where\": \"Brussels\",\n    \"at\": \"2014-03-01\",\n    \"temperature\": 13.5\n  },\n  {\n    \"where\": \"Paris\",\n    \"at\": \"2014-02-27\",\n    \"temperature\": 12.0\n  }\n]\n",[39,452,453,458,463,475,487,497,501,505,516,527,536,541],{"__ignoreMap":31},[42,454,455],{"class":44,"line":45},[42,456,457],{"class":48},"[\n",[42,459,460],{"class":44,"line":52},[42,461,462],{"class":48},"  {\n",[42,464,465,468,470,473],{"class":44,"line":62},[42,466,467],{"class":55},"    \"where\"",[42,469,68],{"class":48},[42,471,472],{"class":71},"\"Brussels\"",[42,474,75],{"class":48},[42,476,477,480,482,485],{"class":44,"line":78},[42,478,479],{"class":55},"    \"at\"",[42,481,68],{"class":48},[42,483,484],{"class":71},"\"2014-03-01\"",[42,486,75],{"class":48},[42,488,489,492,494],{"class":44,"line":91},[42,490,491],{"class":55},"    \"temperature\"",[42,493,68],{"class":48},[42,495,496],{"class":55},"13.5\n",[42,498,499],{"class":44,"line":102},[42,500,105],{"class":48},[42,502,503],{"class":44,"line":108},[42,504,462],{"class":48},[42,506,507,509,511,514],{"class":44,"line":117},[42,508,467],{"class":55},[42,510,68],{"class":48},[42,512,513],{"class":71},"\"Paris\"",[42,515,75],{"class":48},[42,517,518,520,522,525],{"class":44,"line":125},[42,519,479],{"class":55},[42,521,68],{"class":48},[42,523,524],{"class":71},"\"2014-02-27\"",[42,526,75],{"class":48},[42,528,529,531,533],{"class":44,"line":131},[42,530,491],{"class":55},[42,532,68],{"class":48},[42,534,535],{"class":55},"12.0\n",[42,537,538],{"class":44,"line":137},[42,539,540],{"class":48},"  }\n",[42,542,543],{"class":44,"line":148},[42,544,545],{"class":48},"]\n",[29,547,548],{"v-slot:right":31},[33,549,551],{"className":156,"code":550,"language":158,"meta":31,"style":31},"Measure = .Measure \u003Cinfo> {\n  where: String,\n  at: Date,\n  temperature: Float( f | f >= -40.0 and f \u003C= 50.0 )\n}\n[Measure]\n",[39,552,553,573,582,591,626,630],{"__ignoreMap":31},[42,554,555,558,560,563,565,567,570],{"class":44,"line":45},[42,556,557],{"class":165},"Measure",[42,559,170],{"class":169},[42,561,562],{"class":48}," .",[42,564,557],{"class":55},[42,566,173],{"class":48},[42,568,569],{"class":176},"info",[42,571,572],{"class":48},"> {\n",[42,574,575,578,580],{"class":44,"line":52},[42,576,577],{"class":48},"  where: ",[42,579,243],{"class":55},[42,581,75],{"class":48},[42,583,584,587,589],{"class":44,"line":62},[42,585,586],{"class":48},"  at: ",[42,588,270],{"class":55},[42,590,75],{"class":48},[42,592,593,596,599,601,603,605,607,609,612,615,617,619,621,624],{"class":44,"line":78},[42,594,595],{"class":48},"  temperature: ",[42,597,598],{"class":55},"Float",[42,600,186],{"class":48},[42,602,190],{"class":189},[42,604,193],{"class":169},[42,606,196],{"class":48},[42,608,199],{"class":169},[42,610,611],{"class":169}," -",[42,613,614],{"class":55},"40.0",[42,616,205],{"class":169},[42,618,196],{"class":48},[42,620,210],{"class":169},[42,622,623],{"class":55}," 50.0",[42,625,216],{"class":48},[42,627,628],{"class":44,"line":91},[42,629,151],{"class":48},[42,631,632,635,637],{"class":44,"line":102},[42,633,634],{"class":48},"[",[42,636,557],{"class":55},[42,638,545],{"class":48},[16,640,641,642,644,645,647,648,650,651,653],{},"There are two information contracts at work here. An implicit one, ",[39,643,270],{},",\nprovided by ",[20,646,5],{}," itself, and another one, ",[39,649,557],{},", connecting a tuple\ntype to a ",[39,652,557],{}," class.",[16,655,656,657,660,661,663],{},"In ",[20,658,659],{},"Finitio-rb",", the Ruby binding, loading and dressing the JSON above returns\nan array of ",[39,662,557],{}," instances. Dates are coerced along the way:",[665,666,670],"demo-panel",{"badge":667,"title":668,"tone":669},"dressed","irb","valid",[33,671,675],{"className":672,"code":673,"language":674,"meta":31,"style":31},"language-ruby shiki shiki-themes github-light github-dark","[\n   #\u003CMeasure:0x007fb5d3a1ba40 @where=\"Brussels\", @at=#\u003CDate: 2014-03-01>, @temperature=13.5>,\n   #\u003CMeasure:0x007fb5d3a16450 @where=\"Paris\", @at=#\u003CDate: 2014-02-27>, @temperature=12.0>\n]\n","ruby",[39,676,677,681,687,692],{"__ignoreMap":31},[42,678,679],{"class":44,"line":45},[42,680,457],{"class":48},[42,682,683],{"class":44,"line":52},[42,684,686],{"class":685},"sJ8bj","   #\u003CMeasure:0x007fb5d3a1ba40 @where=\"Brussels\", @at=#\u003CDate: 2014-03-01>, @temperature=13.5>,\n",[42,688,689],{"class":44,"line":62},[42,690,691],{"class":685},"   #\u003CMeasure:0x007fb5d3a16450 @where=\"Paris\", @at=#\u003CDate: 2014-02-27>, @temperature=12.0>\n",[42,693,694],{"class":44,"line":78},[42,695,545],{"class":48},[697,698,699],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":31,"searchDepth":62,"depth":62,"links":701},[702,703],{"id":13,"depth":52,"text":14},{"id":429,"depth":52,"text":430},"A data definition language. Think \"JSON\u002FXML schema\", but the right way.","md",{},true,"\u002F",{"title":5,"description":704},"index","s8Qqj_v_pkK3Lx8Kx-qMCTkC3RnYZNedfEorKOMg3D8",1786026251324]