{"id":86374,"date":"2024-12-01T21:47:43","date_gmt":"2024-12-01T18:17:43","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/"},"modified":"2024-12-01T21:47:43","modified_gmt":"2024-12-01T18:17:43","slug":"powerful-form-validation-with-ocamls-dream-framework-4ggj","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/","title":{"rendered":"\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 \u0631\u0648\u06cc\u0627\u06cc OCaml"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n              \u062a\u0648\u062c\u0647: Dream_html.form \u0648 query \u062a\u0648\u0627\u0628\u0639 \u06a9\u0645\u06a9\u06cc \u0645\u0646\u062a\u0634\u0631 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a. \u0622\u0646\u0647\u0627 \u062f\u0631 \u0646\u0633\u062e\u0647 \u0628\u0639\u062f\u06cc \u0628\u0631\u0627\u06cc opam \u0645\u0646\u062a\u0634\u0631 \u062e\u0648\u0627\u0647\u0646\u062f \u0634\u062f. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u062f\u06cc\u06af\u0631 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a!<\/p>\n<p>\u0645\u0646 \u0645\u062f\u062a\u200c\u0647\u0627 \u0637\u0631\u0641\u062f\u0627\u0631 \u0642\u062f\u0631\u062a \u0641\u0631\u0645\u200c\u0647\u0627\u06cc HTML \u0648 \u0637\u0628\u06cc\u0639\u06cc \u0628\u0648\u062f\u0646 \u0622\u0646\u0647\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0635\u0641\u062d\u0627\u062a \u0648\u0628 \u0628\u0648\u062f\u0647\u200c\u0627\u0645 \u06a9\u0647 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u0646\u062f. \u0627\u062e\u06cc\u0631\u0627\u064b\u060c \u0645\u0646 \u0627\u06cc\u0646 \u0641\u0631\u0635\u062a \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0627\u062e\u0644\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0645\u062d\u0644 \u06a9\u0627\u0631 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 htmx \u0648 Scala&#39;s Play Framework \u0628\u0627\u0632\u0633\u0627\u0632\u06cc \u06a9\u0646\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u0627\u063a\u0644\u0628 \u0627\u0632 \u0641\u0631\u0645 \u0647\u0627\u06cc HTML \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644:<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>Play \u0627\u0632 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0641\u0631\u0645 HTML \u0627\u0631\u0633\u0627\u0644\u06cc \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0627\u0646\u0648\u0627\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0648 \u06af\u0632\u0627\u0631\u0634 \u0647\u0645\u0647 \u062e\u0637\u0627\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0631\u062e \u062f\u0627\u062f\u0647 \u0628\u0627\u0634\u062f \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062e\u0648\u0628\u06cc \u062f\u0627\u0631\u062f\u060c \u06a9\u0647 \u0628\u0647 \u0645\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062e\u0637\u0627\u0647\u0627 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062f\u0631 \u06a9\u0646\u0627\u0631 \u062e\u0648\u062f \u0641\u0631\u0645\u200c\u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Constraint Validation API \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u0645. \u062f\u0631 \u067e\u0633\u062a \u0642\u0628\u0644\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646 \u0646\u0648\u0634\u062a\u0645.<\/p>\n<p>\u0627\u0645\u0627 \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc OCaml\u060c \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0642\u062f\u0631\u0647\u0627 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0646\u0628\u0648\u062f. \u0645\u0627 \u0686\u0646\u062f \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u0627\u0633\u06cc \u0628\u0631\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0641\u0631\u0645 \u062f\u0631 \u0644\u06cc\u0633\u062a \u062c\u0641\u062a \u06a9\u0644\u06cc\u062f-\u0645\u0642\u062f\u0627\u0631 \u062f\u0627\u0634\u062a\u06cc\u0645:<\/p>\n<p>\u0627\u0645\u0627 \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u06cc\u0646 \u0641\u0647\u0631\u0633\u062a \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u0647 \u0686\u06cc\u0632\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647\u200c\u062a\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645\u060c \u0645\u0627\u0646\u0646\u062f \u0634\u0627\u06cc\u062f \u0633\u0627\u0632\u06af\u0627\u0631. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c Conformist \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0631\u0627 \u062f\u0627\u0631\u062f \u06a9\u0647 \u0647\u0631 \u0628\u0627\u0631 \u0641\u0642\u0637 \u06cc\u06a9 \u062e\u0637\u0627 \u0631\u0627 \u06af\u0632\u0627\u0631\u0634 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0628\u0627\u06cc\u062f \u0641\u0631\u0645 \u0627\u0631\u0633\u0627\u0644\u06cc \u0631\u0627 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<p>accept-terms: true<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06cc\u06a9 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u0645 \u0641\u0647\u0631\u0633\u062a \u062e\u0637\u0627\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc\u060c \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646:<\/p>\n<p>name: required<br \/>\nemail: required<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 dream-html<\/p>\n<p>\u062e\u0644\u0627\u0635\u0647\u060c \u0645\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0633\u06cc\u062f\u0645 \u06a9\u0647 \u0628\u0647 \u062a\u062c\u0631\u0628\u0647 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0627\u0631\u06af\u0648\u0646\u0648\u0645\u06cc\u06a9 \u062a\u0631\u06cc \u062f\u0631 OCaml \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645. \u0648 \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0646 \u0642\u0628\u0644\u0627\u064b \u0628\u0633\u062a\u0647\u200c\u0627\u06cc \u0631\u0627 \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u0645 \u06a9\u0647 \u06a9\u0645\u06a9\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0631\u0627 \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 Dream \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0631\u062f\u0645 \u06a9\u0647 \u0627\u0641\u0632\u0648\u062f\u0647 \u062e\u0648\u0628\u06cc \u0628\u0627\u0634\u062f. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0686\u0631\u062e\u0634 \u062f\u0631 REPL \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u06cc\u0645:<\/p>\n<p>$ utop -require dream-html<br \/>\n# type add_user = {<br \/>\n    name : string;<br \/>\n    email : string;<br \/>\n    accept_terms : bool;<br \/>\n  };;<\/p>\n<p># let add_user =<br \/>\n    let open Dream_html.Form in<br \/>\n    let+ name = required string &#8220;name&#8221;<br \/>\n    and+ email = required string &#8220;email&#8221;<br \/>\n    and+ accept_terms = optional bool &#8220;accept-terms&#8221; in<br \/>\n    {<br \/>\n      name;<br \/>\n      email;<br \/>\n      accept_terms = Option.value accept_terms ~default:false;<br \/>\n    };;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0645\u0627 \u06cc\u06a9 \u0627\u0631\u0632\u0634 \u062f\u0627\u0631\u06cc\u0645 add_user : add_user Dream_html.Form.t\u060c \u06a9\u0647 \u06cc\u06a9 \u0631\u0645\u0632\u06af\u0634\u0627 \u0628\u0647 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0645\u0627 \u0627\u0633\u062a. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u0645:<\/p>\n<p># Dream_html.Form.validate add_user [];;<br \/>\n&#8211; : (add_user, (string * string) list) result =<br \/>\nError [(&#8220;email&#8221;, &#8220;error.required&#8221;); (&#8220;name&#8221;, &#8220;error.required&#8221;)]\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0627 \u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 \u062e\u0637\u0627\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0631\u0627 \u0628\u0627 \u0646\u0627\u0645 \u0641\u06cc\u0644\u062f\u0647\u0627 \u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645 (\u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0628\u0648\u0645\u06cc \u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f).<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u0648\u0641\u0642 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u0645:<\/p>\n<p># Dream_html.Form.validate add_user [&#8220;name&#8221;, &#8220;Bob&#8221;; &#8220;email&#8221;, &#8220;bob@example.com&#8221;];;<br \/>\n&#8211; : (add_user, (string * string) list) result =<br \/>\nOk {name = &#8220;Bob&#8221;; email = &#8220;bob@example.com&#8221;; accept_terms = false}<\/p>\n<p># Dream_html.Form.validate add_user [&#8220;name&#8221;, &#8220;Bob&#8221;; &#8220;email&#8221;, &#8220;bob@example.com&#8221;; &#8220;accept-terms&#8221;, &#8220;true&#8221;];;<br \/>\n&#8211; : (add_user, (string * string) list) result =<br \/>\nOk {name = &#8220;Bob&#8221;; email = &#8220;bob@example.com&#8221;; accept_terms = true}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u062e\u0637\u0627\u06cc \u0646\u0648\u0639 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<p># Dream_html.Form.validate add_user [&#8220;name&#8221;, &#8220;Bob&#8221;; &#8220;email&#8221;, &#8220;bob@example.com&#8221;; &#8220;accept-terms&#8221;, &#8220;1&#8221;];;<br \/>\n&#8211; : (add_user, (string * string) list) result =<br \/>\nError [(&#8220;accept-terms&#8221;, &#8220;error.expected.bool&#8221;)]\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0644\u0641 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f bool\u060c \u06cc\u0639\u0646\u06cc \u0641\u0642\u0637 true \u06cc\u0627 false \u0627\u0631\u0632\u0634 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0686\u06a9 \u0628\u0627\u06a9\u0633 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0647\u0645\u06cc\u0634\u0647 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u0634\u0648\u0646\u062f true \u062f\u0631 \u0627\u0631\u0633\u0627\u0644 \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 value=true.<\/p>\n<p>  \u0631\u0645\u0632\u06af\u0634\u0627\u0647\u0627\u06cc \u0627\u0631\u0632\u0634 \u0633\u0641\u0627\u0631\u0634\u06cc<\/p>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0627 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0641\u0631\u0645 \u0634\u0645\u0627 \u062f\u0627\u0631\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0627\u0639\u062f\u0627\u062f \u0627\u0639\u0634\u0627\u0631\u06cc \u0628\u0627\u0634\u0646\u062f:<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc \u062f\u0627\u062f\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0639\u062f\u062f \u0627\u0639\u0634\u0627\u0631\u06cc \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u062f:<\/p>\n<p># #require &#8220;decimal&#8221;;;<br \/>\n# let decimal s =<br \/>\n    try Ok (Decimal.of_string s)<br \/>\n    with Invalid_argument _ -&gt; Error &#8220;error.expected.decimal&#8221;;;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<p>let+ height_m = required decimal &#8220;height-m&#8221;<br \/>\n&#8230;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0642\u06cc\u0648\u062f \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631\u06cc \u06a9\u0647 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u062f\u0631 \u0627\u06a9\u062b\u0631 \u0641\u0631\u0645 \u0647\u0627\u06cc \u0627\u0631\u0633\u0627\u0644\u06cc \u062e\u0627\u0644\u06cc \u0628\u0648\u062f\u0646 \u0631\u0634\u062a\u0647 \u0647\u0627 \u0645\u0646\u0637\u0642\u06cc \u0646\u06cc\u0633\u062a. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u06a9\u0645\u06a9 \u06a9\u0646\u0646\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0631\u0634\u062a\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0647 \u063a\u06cc\u0631 \u062e\u0627\u0644\u06cc \u0628\u0648\u062f\u0646 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<p>let nonempty =<br \/>\n  ensure &#8220;expected.nonempty&#8221; (( &lt;&gt; ) &#8220;&#8221;) required string<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0639\u0631\u06cc\u0641 \u0641\u0631\u0645 \u0642\u0628\u0644\u06cc \u0631\u0627 \u0628\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc \u0642\u0648\u06cc\u200c\u062a\u0631 \u0628\u0631\u0627\u06cc \u0631\u0634\u062a\u0647\u200c\u0647\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645:<\/p>\n<p>let add_user =<br \/>\n  let open Dream_html.Form in<br \/>\n  let+ name = nonempty &#8220;name&#8221;<br \/>\n  and+ email = nonempty &#8220;email&#8221;<br \/>\n  and+ accept_terms = optional bool &#8220;accept-terms&#8221; in<br \/>\n  {<br \/>\n    name;<br \/>\n    email;<br \/>\n    accept_terms = Option.value accept_terms ~default:false;<br \/>\n  }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0647\u0627 \u062f\u0631 Dream handlers<\/p>\n<p>\u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Dream\u060c \u0645\u062f\u06cc\u0631\u06cc\u062a \u0641\u0631\u0645 \u062f\u0627\u062e\u0644\u06cc \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<p>(* POST \/users *)<br \/>\nlet post_users request =<br \/>\n  match%lwt Dream.form request with<br \/>\n  | `Ok [&#8220;accept-terms&#8221;, accept_terms; &#8220;email&#8221;, email; &#8220;name&#8221;, name] -&gt;<br \/>\n    (* &#8230;success&#8230; *)<br \/>\n  | _ -&gt; Dream.empty `Bad_Request<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0645\u0627 \u0628\u0627 \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc\u200c\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0641\u0631\u0645\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645:<\/p>\n<p>(* POST \/users *)<br \/>\nlet post_users request =<br \/>\n  match%lwt Dream_html.form add_user request with<br \/>\n  | `Ok { name; email; accept_terms } -&gt;<br \/>\n    (* &#8230;success&#8230; *)<br \/>\n  | `Invalid errors -&gt;<br \/>\n    Dream.json ~code:422 ( (* &#8230;turn the error list into a JSON object&#8230; *) )<br \/>\n  | _ -&gt; Dream.empty `Bad_Request<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631 \u0646\u0648\u0639 \u0645\u062a\u063a\u06cc\u0631<\/p>\n<p>\u0627\u0644\u0628\u062a\u0647\u060c \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u0628\u062e\u0634 \u0628\u0632\u0631\u06af\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u062f\u0631 OCaml \u0647\u0633\u062a\u0646\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0641\u0631\u0645 \u0627\u0631\u0633\u0627\u0644\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0642\u062f\u0627\u0631\u06cc \u0627\u0632 \u0646\u0648\u0639 \u0646\u0648\u0639 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c<\/p>\n<p>type user =<br \/>\n| Logged_out<br \/>\n| Logged_in of { admin : bool }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0641\u0631\u0645 \u0627\u0631\u0633\u0627\u0644\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0628\u0627\u0634\u062f:<\/p>\n<p>type: logged-out<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06cc\u0627:<\/p>\n<p>type: logged-in<br \/>\nadmin: true<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u063a\u06cc\u0631\u0647<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0627\u06cc\u0646 \u0646\u0648\u0639 \u0627\u0631\u0633\u0627\u0644\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u0645\u0632\u06af\u0634\u0627 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0645\u0648\u0631\u062f \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0646\u06cc\u062f\u060c \u0633\u067e\u0633 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0627 Dream_html.Form.( or )\u060c \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644:<\/p>\n<p>let logged_out =<br \/>\n  let+ _ = ensure &#8220;expected.type&#8221; (( = ) &#8220;logged-out&#8221;) required string &#8220;type&#8221; in<br \/>\n  Logged_out<\/p>\n<p>let logged_in =<br \/>\n  let+ _ = ensure &#8220;expected.type&#8221; (( = ) &#8220;logged-in&#8221;) required string &#8220;type&#8221;<br \/>\n  and+ admin = required bool &#8220;admin&#8221; in<br \/>\n  Logged_in { admin }<\/p>\n<p>let user = logged_out or logged_in<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u0645:<\/p>\n<p># validate user [];;<br \/>\n&#8211; : (user, (string * string) list) result =<br \/>\nError [(&#8220;admin&#8221;, &#8220;error.required&#8221;); (&#8220;type&#8221;, &#8220;error.required&#8221;)]\n<p># validate user [&#8220;type&#8221;, &#8220;logged-out&#8221;];;<br \/>\n&#8211; : (user, (string * string) list) result = Ok Logged_out<\/p>\n<p># validate user [&#8220;type&#8221;, &#8220;logged-in&#8221;];;<br \/>\n&#8211; : (user, (string * string) list) result = Error [(&#8220;admin&#8221;, &#8220;error.required&#8221;)]\n<p># validate user [&#8220;type&#8221;, &#8220;logged-in&#8221;; &#8220;admin&#8221;, &#8220;&#8221;];;<br \/>\n&#8211; : (user, (string * string) list) result =<br \/>\nError [(&#8220;admin&#8221;, &#8220;error.expected.bool&#8221;)]\n<p># validate user [&#8220;type&#8221;, &#8220;logged-in&#8221;; &#8220;admin&#8221;, &#8220;true&#8221;];;<br \/>\n&#8211; : (user, (string * string) list) result = Ok (Logged_in { admin = true })<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u062f\u060c \u0631\u0645\u0632\u06af\u0634\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0647\u0631 \u062f\u0648 \u0645\u0648\u0631\u062f \u0648 \u062a\u0645\u0627\u0645 \u0627\u0644\u0632\u0627\u0645\u0627\u062a \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u0622\u0646 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u062f.<\/p>\n<p>  \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627 \u0628\u0647 \u0627\u0646\u0648\u0627\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc<\/p>\n<p>\u0639\u0645\u0644\u06a9\u0631\u062f \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0646\u0647 \u062a\u0646\u0647\u0627 \u0628\u0627 \u00ab\u0641\u0631\u0645\u200c\u0647\u0627\u00bb \u0628\u0644\u06a9\u0647 \u0628\u0627 \u067e\u0631\u0633\u200c\u0648\u200c\u062c\u0648\u0647\u0627 \u0646\u06cc\u0632 \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f \/foo?a=1&amp;b=2. \u0627\u0644\u0628\u062a\u0647\u060c \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u0627\u0632 \u00ab\u0641\u0631\u0645\u200c\u0647\u0627\u00bb \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u062e\u0644\u0627\u0635\u0647\u200c\u0646\u0648\u06cc\u0633\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 application\/x-www-form-urlencoded \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u0627\u0645\u0627 \u062f\u0631 \u0648\u0627\u0642\u0639 \u06cc\u06a9 \u0641\u0631\u0645 HTML \u0627\u0633\u062a action=get \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a a \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f \u067e\u0631\u0633 \u0648 \u062c\u0648\u060c \u0628\u062e\u0634\u06cc \u0627\u0632 URL\u060c \u0646\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0641\u0631\u0645. \u06a9\u0645\u06cc \u06af\u06cc\u062c \u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0646\u06a9\u062a\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u0647 \u062e\u0627\u0637\u0631 \u0628\u0633\u067e\u0627\u0631\u06cc\u062f \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 Dream \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0647\u0631 \u062f\u0648 \u06a9\u0627\u0631 \u06a9\u0646\u062f\u060c \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 dream-html.<\/p>\n<p>\u062f\u0631 Dream\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0648\u0627\u0628\u0639\u06cc \u0645\u0627\u0646\u0646\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f let a = Dream.query request &#8220;a&#8221;. \u0627\u0645\u0627 \u0627\u06af\u0631 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631\u06cc \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0641\u0631\u0645 \u0628\u0627\u0644\u0627\u060c \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc UTM \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p>type utm = {<br \/>\n  source : string option;<br \/>\n  medium : string option;<br \/>\n  campaign : string option;<br \/>\n  term : string option;<br \/>\n  content : string option;<br \/>\n}<\/p>\n<p>let utm =<br \/>\n  let+ source = optional string &#8220;utm_source&#8221;<br \/>\n  and+ medium = optional string &#8220;utm_medium&#8221;<br \/>\n  and+ campaign = optional string &#8220;utm_campaign&#8221;<br \/>\n  and+ term = optional string &#8220;utm_term&#8221;<br \/>\n  and+ content = optional string &#8220;utm_content&#8221; in<br \/>\n  { source; medium; campaign; term; content }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u0631\u0633\u0627\u0644 \u0641\u0631\u0645 POST \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>let some_page request =<br \/>\n  match Dream_html.query utm request with<br \/>\n  | `Ok { source; medium; campaign; term; content } -&gt;<br \/>\n    (* &#8230;success&#8230; *)<br \/>\n  | `Invalid errors -&gt; (* &#8230;handle errors&#8230; *)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u0646\u06a9\u062a\u0647 \u062c\u0627\u0644\u0628 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0622\u0646\u0647\u0627 \u0628\u0647 \u0645\u0639\u0646\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u06a9\u0644\u0645\u0647 \u0647\u0645\u0627\u0646 \u062a\u0639\u0631\u06cc\u0641 \u0641\u0631\u0645 \u0647\u0633\u062a\u0646\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0628\u0633\u06cc\u0627\u0631 \u0627\u0646\u062f\u06a9\u060c \u0628\u06cc\u0646 \u0627\u0646\u062c\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062e\u0648\u062f \u0628\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0641\u0631\u0645 POST \u06cc\u0627 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648 GET \u0633\u0648\u0626\u06cc\u0686 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u067e\u0633&#8230;<\/p>\n<p>\u0648\u0627\u06cc \u0627\u06cc\u0646 \u062e\u06cc\u0644\u06cc \u0628\u0648\u062f. \u0648 \u0645\u0646 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647\u200c\u062a\u0631 \u0647\u0645 \u0646\u067e\u0631\u062f\u0627\u062e\u062a\u0647\u200c\u0627\u0645. \u0627\u0645\u0627 \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06cc\u0645 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0634\u0645\u0627 \u0645\u062a\u0642\u0627\u0639\u062f \u0634\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0641\u0631\u0645 \u0647\u0627 \u0648 \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631 Dream \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0642\u0627\u0628\u0644 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0647\u0633\u062a\u0646\u062f. \u0627\u0644\u0628\u062a\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0627\u06cc\u0646 \u0647\u0645\u0647 \u0642\u062f\u0631\u062a \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0633\u0627\u062f\u0647\u060c \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u062f\u0627\u062e\u0644\u06cc Dream \u062e\u0644\u0627\u0635 \u0634\u0648\u06cc\u062f. \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af\u200c\u062a\u0631 \u06a9\u0647 \u0634\u0627\u06cc\u062f \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0641\u0631\u0645\u200c\u0647\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f\u060c \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0645 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f.<\/p>\n<div data-article-id=\"2128505\" id=\"article-body\">\n<p>\u062a\u0648\u062c\u0647: <code>Dream_html.form<\/code> \u0648 <code>query<\/code> \u062a\u0648\u0627\u0628\u0639 \u06a9\u0645\u06a9\u06cc \u0645\u0646\u062a\u0634\u0631 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a. \u0622\u0646\u0647\u0627 \u062f\u0631 \u0646\u0633\u062e\u0647 \u0628\u0639\u062f\u06cc \u0628\u0631\u0627\u06cc opam \u0645\u0646\u062a\u0634\u0631 \u062e\u0648\u0627\u0647\u0646\u062f \u0634\u062f. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u062f\u06cc\u06af\u0631 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a!<\/p>\n<p>\u0645\u0646 \u0645\u062f\u062a\u200c\u0647\u0627 \u0637\u0631\u0641\u062f\u0627\u0631 \u0642\u062f\u0631\u062a \u0641\u0631\u0645\u200c\u0647\u0627\u06cc HTML \u0648 \u0637\u0628\u06cc\u0639\u06cc \u0628\u0648\u062f\u0646 \u0622\u0646\u0647\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0635\u0641\u062d\u0627\u062a \u0648\u0628 \u0628\u0648\u062f\u0647\u200c\u0627\u0645 \u06a9\u0647 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u0646\u062f. \u0627\u062e\u06cc\u0631\u0627\u064b\u060c \u0645\u0646 \u0627\u06cc\u0646 \u0641\u0631\u0635\u062a \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0645 \u06a9\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0627\u062e\u0644\u06cc \u0642\u062f\u06cc\u0645\u06cc \u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0645\u062d\u0644 \u06a9\u0627\u0631 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 htmx \u0648 Scala&#39;s Play Framework \u0628\u0627\u0632\u0633\u0627\u0632\u06cc \u06a9\u0646\u0645. \u062f\u0631 \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u0627\u063a\u0644\u0628 \u0627\u0632 \u0641\u0631\u0645 \u0647\u0627\u06cc HTML \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"nt\"\/>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Play \u0627\u0632 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0641\u0631\u0645 HTML \u0627\u0631\u0633\u0627\u0644\u06cc \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0627\u0646\u0648\u0627\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0648 \u06af\u0632\u0627\u0631\u0634 \u0647\u0645\u0647 \u062e\u0637\u0627\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0631\u062e \u062f\u0627\u062f\u0647 \u0628\u0627\u0634\u062f \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0628\u0633\u06cc\u0627\u0631 \u062e\u0648\u0628\u06cc \u062f\u0627\u0631\u062f\u060c \u06a9\u0647 \u0628\u0647 \u0645\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062e\u0637\u0627\u0647\u0627 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062f\u0631 \u06a9\u0646\u0627\u0631 \u062e\u0648\u062f \u0641\u0631\u0645\u200c\u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Constraint Validation API \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u0645. \u062f\u0631 \u067e\u0633\u062a \u0642\u0628\u0644\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646 \u0646\u0648\u0634\u062a\u0645.<\/p>\n<p>\u0627\u0645\u0627 \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc OCaml\u060c \u0648\u0636\u0639\u06cc\u062a \u0622\u0646\u0642\u062f\u0631\u0647\u0627 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0646\u0628\u0648\u062f. \u0645\u0627 \u0686\u0646\u062f \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u0627\u0633\u06cc \u0628\u0631\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0641\u0631\u0645 \u062f\u0631 \u0644\u06cc\u0633\u062a \u062c\u0641\u062a \u06a9\u0644\u06cc\u062f-\u0645\u0642\u062f\u0627\u0631 \u062f\u0627\u0634\u062a\u06cc\u0645:<\/p>\n<p>\u0627\u0645\u0627 \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u06cc\u0646 \u0641\u0647\u0631\u0633\u062a \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u0647 \u0686\u06cc\u0632\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647\u200c\u062a\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645\u060c \u0645\u0627\u0646\u0646\u062f \u0634\u0627\u06cc\u062f \u0633\u0627\u0632\u06af\u0627\u0631. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c Conformist \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0631\u0627 \u062f\u0627\u0631\u062f \u06a9\u0647 \u0647\u0631 \u0628\u0627\u0631 \u0641\u0642\u0637 \u06cc\u06a9 \u062e\u0637\u0627 \u0631\u0627 \u06af\u0632\u0627\u0631\u0634 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0628\u0627\u06cc\u062f \u0641\u0631\u0645 \u0627\u0631\u0633\u0627\u0644\u06cc \u0631\u0627 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>accept-terms: true\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06cc\u06a9 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u0645 <em>\u0641\u0647\u0631\u0633\u062a<\/em> \u062e\u0637\u0627\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc\u060c \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>name: required\nemail: required\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/#%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1_%D8%B3%D9%86%D8%AC%DB%8C_%D9%81%D8%B1%D9%85_dream-html\" >\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 dream-html<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/#%D8%B1%D9%85%D8%B2%DA%AF%D8%B4%D8%A7%D9%87%D8%A7%DB%8C_%D8%A7%D8%B1%D8%B2%D8%B4_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C\" >\u0631\u0645\u0632\u06af\u0634\u0627\u0647\u0627\u06cc \u0627\u0631\u0632\u0634 \u0633\u0641\u0627\u0631\u0634\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/#%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D8%B1%D8%AF%D9%86_%D9%82%DB%8C%D9%88%D8%AF_%D8%A8%D9%87_%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1\" >\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0642\u06cc\u0648\u062f \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/#%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1_%D8%B3%D9%86%D8%AC%DB%8C_%D9%81%D8%B1%D9%85_%D9%87%D8%A7_%D8%AF%D8%B1_Dream_handlers\" >\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0647\u0627 \u062f\u0631 Dream handlers<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/#%D8%B1%D9%85%D8%B2%DA%AF%D8%B4%D8%A7%DB%8C%DB%8C_%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1_%D9%86%D9%88%D8%B9_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1\" >\u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631 \u0646\u0648\u0639 \u0645\u062a\u063a\u06cc\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/#%D8%B1%D9%85%D8%B2%DA%AF%D8%B4%D8%A7%DB%8C%DB%8C_%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88%D9%87%D8%A7_%D8%A8%D9%87_%D8%A7%D9%86%D9%88%D8%A7%D8%B9_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C\" >\u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627 \u0628\u0647 \u0627\u0646\u0648\u0627\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/powerful-form-validation-with-ocamls-dream-framework-4ggj\/#%D9%BE%D8%B3%E2%80%A6\" >\u067e\u0633&#8230;<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1_%D8%B3%D9%86%D8%AC%DB%8C_%D9%81%D8%B1%D9%85_dream-html\"><\/span>\n<p>  \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 dream-html<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062e\u0644\u0627\u0635\u0647\u060c \u0645\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0633\u06cc\u062f\u0645 \u06a9\u0647 \u0628\u0647 \u062a\u062c\u0631\u0628\u0647 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0627\u0631\u06af\u0648\u0646\u0648\u0645\u06cc\u06a9 \u062a\u0631\u06cc \u062f\u0631 OCaml \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645. \u0648 \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0646 \u0642\u0628\u0644\u0627\u064b \u0628\u0633\u062a\u0647\u200c\u0627\u06cc \u0631\u0627 \u0646\u06af\u0647 \u0645\u06cc\u200c\u062f\u0627\u0631\u0645 \u06a9\u0647 \u06a9\u0645\u06a9\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc \u0627\u06cc\u0645\u0646 \u0631\u0627 \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 Dream \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0631\u062f\u0645 \u06a9\u0647 \u0627\u0641\u0632\u0648\u062f\u0647 \u062e\u0648\u0628\u06cc \u0628\u0627\u0634\u062f. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0686\u0631\u062e\u0634 \u062f\u0631 REPL \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>$ utop -require dream-html\n# type add_user = {\n    name : string;\n    email : string;\n    accept_terms : bool;\n  };;\n\n# let add_user =\n    let open Dream_html.Form in\n    let+ name = required string \"name\"\n    and+ email = required string \"email\"\n    and+ accept_terms = optional bool \"accept-terms\" in\n    {\n      name;\n      email;\n      accept_terms = Option.value accept_terms ~default:false;\n    };;\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0645\u0627 \u06cc\u06a9 \u0627\u0631\u0632\u0634 \u062f\u0627\u0631\u06cc\u0645 <code>add_user : add_user Dream_html.Form.t<\/code>\u060c \u06a9\u0647 \u06cc\u06a9 \u0631\u0645\u0632\u06af\u0634\u0627 \u0628\u0647 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0645\u0627 \u0627\u0633\u062a. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code># Dream_html.Form.validate add_user [];;\n- : (add_user, (string * string) list) result =\nError [(\"email\", \"error.required\"); (\"name\", \"error.required\")]\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 \u062e\u0637\u0627\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0631\u0627 \u0628\u0627 \u0646\u0627\u0645 \u0641\u06cc\u0644\u062f\u0647\u0627 \u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645 (\u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0628\u0648\u0645\u06cc \u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f).<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u0648\u0641\u0642 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code># Dream_html.Form.validate add_user [\"name\", \"Bob\"; \"email\", \"bob@example.com\"];;\n- : (add_user, (string * string) list) result =\nOk {name = \"Bob\"; email = \"bob@example.com\"; accept_terms = false}\n\n# Dream_html.Form.validate add_user [\"name\", \"Bob\"; \"email\", \"bob@example.com\"; \"accept-terms\", \"true\"];;\n- : (add_user, (string * string) list) result =\nOk {name = \"Bob\"; email = \"bob@example.com\"; accept_terms = true}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u062e\u0637\u0627\u06cc \u0646\u0648\u0639 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code># Dream_html.Form.validate add_user [\"name\", \"Bob\"; \"email\", \"bob@example.com\"; \"accept-terms\", \"1\"];;\n- : (add_user, (string * string) list) result =\nError [(\"accept-terms\", \"error.expected.bool\")]\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0644\u0641 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f <code>bool<\/code>\u060c \u06cc\u0639\u0646\u06cc \u0641\u0642\u0637 <code>true<\/code> \u06cc\u0627 <code>false<\/code> \u0627\u0631\u0632\u0634 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0686\u06a9 \u0628\u0627\u06a9\u0633 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0647\u0645\u06cc\u0634\u0647 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u0634\u0648\u0646\u062f <code>true<\/code> \u062f\u0631 \u0627\u0631\u0633\u0627\u0644 \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 <code>value=true<\/code>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D9%85%D8%B2%DA%AF%D8%B4%D8%A7%D9%87%D8%A7%DB%8C_%D8%A7%D8%B1%D8%B2%D8%B4_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C\"><\/span>\n<p>  \u0631\u0645\u0632\u06af\u0634\u0627\u0647\u0627\u06cc \u0627\u0631\u0632\u0634 \u0633\u0641\u0627\u0631\u0634\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0627 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0641\u0631\u0645 \u0634\u0645\u0627 \u062f\u0627\u0631\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0627\u0639\u062f\u0627\u062f \u0627\u0639\u0634\u0627\u0631\u06cc \u0628\u0627\u0634\u0646\u062f:<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc \u062f\u0627\u062f\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0639\u062f\u062f \u0627\u0639\u0634\u0627\u0631\u06cc \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"o\">#<\/span> <span class=\"o\">#<\/span><span class=\"n\">require<\/span> <span class=\"s2\">\"decimal\"<\/span><span class=\"p\">;;<\/span>\n<span class=\"o\">#<\/span> <span class=\"k\">let<\/span> <span class=\"n\">decimal<\/span> <span class=\"n\">s<\/span> <span class=\"o\">=<\/span>\n    <span class=\"k\">try<\/span> <span class=\"nc\">Ok<\/span> <span class=\"p\">(<\/span><span class=\"nn\">Decimal<\/span><span class=\"p\">.<\/span><span class=\"n\">of_string<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">with<\/span> <span class=\"nc\">Invalid_argument<\/span> <span class=\"n\">_<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nc\">Error<\/span> <span class=\"s2\">\"error.expected.decimal\"<\/span><span class=\"p\">;;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"k\">let<\/span><span class=\"o\">+<\/span> <span class=\"n\">height_m<\/span> <span class=\"o\">=<\/span> <span class=\"n\">required<\/span> <span class=\"n\">decimal<\/span> <span class=\"s2\">\"height-m\"<\/span>\n<span class=\"o\">...<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D8%B1%D8%AF%D9%86_%D9%82%DB%8C%D9%88%D8%AF_%D8%A8%D9%87_%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1\"><\/span>\n<p>  \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0642\u06cc\u0648\u062f \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0642\u0627\u062f\u06cc\u0631\u06cc \u06a9\u0647 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u062f\u0631 \u0627\u06a9\u062b\u0631 \u0641\u0631\u0645 \u0647\u0627\u06cc \u0627\u0631\u0633\u0627\u0644\u06cc \u062e\u0627\u0644\u06cc \u0628\u0648\u062f\u0646 \u0631\u0634\u062a\u0647 \u0647\u0627 \u0645\u0646\u0637\u0642\u06cc \u0646\u06cc\u0633\u062a. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u06a9\u0645\u06a9 \u06a9\u0646\u0646\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0631\u0634\u062a\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0647 \u063a\u06cc\u0631 \u062e\u0627\u0644\u06cc \u0628\u0648\u062f\u0646 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"k\">let<\/span> <span class=\"n\">nonempty<\/span> <span class=\"o\">=<\/span>\n  <span class=\"n\">ensure<\/span> <span class=\"s2\">\"expected.nonempty\"<\/span> <span class=\"p\">((<\/span> <span class=\"o\">&lt;&gt;<\/span> <span class=\"p\">)<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">)<\/span> <span class=\"n\">required<\/span> <span class=\"kt\">string<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0639\u0631\u06cc\u0641 \u0641\u0631\u0645 \u0642\u0628\u0644\u06cc \u0631\u0627 \u0628\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc \u0642\u0648\u06cc\u200c\u062a\u0631 \u0628\u0631\u0627\u06cc \u0631\u0634\u062a\u0647\u200c\u0647\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"k\">let<\/span> <span class=\"n\">add_user<\/span> <span class=\"o\">=<\/span>\n  <span class=\"k\">let<\/span> <span class=\"k\">open<\/span> <span class=\"nn\">Dream_html<\/span><span class=\"p\">.<\/span><span class=\"nc\">Form<\/span> <span class=\"k\">in<\/span>\n  <span class=\"k\">let<\/span><span class=\"o\">+<\/span> <span class=\"n\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">nonempty<\/span> <span class=\"s2\">\"name\"<\/span>\n  <span class=\"ow\">and<\/span><span class=\"o\">+<\/span> <span class=\"n\">email<\/span> <span class=\"o\">=<\/span> <span class=\"n\">nonempty<\/span> <span class=\"s2\">\"email\"<\/span>\n  <span class=\"ow\">and<\/span><span class=\"o\">+<\/span> <span class=\"n\">accept_terms<\/span> <span class=\"o\">=<\/span> <span class=\"n\">optional<\/span> <span class=\"kt\">bool<\/span> <span class=\"s2\">\"accept-terms\"<\/span> <span class=\"k\">in<\/span>\n  <span class=\"p\">{<\/span>\n    <span class=\"n\">name<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">email<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">accept_terms<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Option<\/span><span class=\"p\">.<\/span><span class=\"n\">value<\/span> <span class=\"n\">accept_terms<\/span> <span class=\"o\">~<\/span><span class=\"n\">default<\/span><span class=\"o\">:<\/span><span class=\"bp\">false<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1_%D8%B3%D9%86%D8%AC%DB%8C_%D9%81%D8%B1%D9%85_%D9%87%D8%A7_%D8%AF%D8%B1_Dream_handlers\"><\/span>\n<p>  \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0641\u0631\u0645 \u0647\u0627 \u062f\u0631 Dream handlers<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Dream\u060c \u0645\u062f\u06cc\u0631\u06cc\u062a \u0641\u0631\u0645 \u062f\u0627\u062e\u0644\u06cc \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"c\">(* POST \/users *)<\/span>\n<span class=\"k\">let<\/span> <span class=\"n\">post_users<\/span> <span class=\"n\">request<\/span> <span class=\"o\">=<\/span>\n  <span class=\"k\">match<\/span><span class=\"o\">%<\/span><span class=\"n\">lwt<\/span> <span class=\"nn\">Dream<\/span><span class=\"p\">.<\/span><span class=\"n\">form<\/span> <span class=\"n\">request<\/span> <span class=\"k\">with<\/span>\n  <span class=\"o\">|<\/span> <span class=\"nt\">`Ok<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"accept-terms\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">accept_terms<\/span><span class=\"p\">;<\/span> <span class=\"s2\">\"email\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">email<\/span><span class=\"p\">;<\/span> <span class=\"s2\">\"name\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">]<\/span> <span class=\"o\">-&gt;<\/span>\n    <span class=\"c\">(* ...success... *)<\/span>\n  <span class=\"o\">|<\/span> <span class=\"n\">_<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nn\">Dream<\/span><span class=\"p\">.<\/span><span class=\"n\">empty<\/span> <span class=\"nt\">`Bad_Request<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0645\u0627 \u0628\u0627 \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc\u200c\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0641\u0631\u0645\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"c\">(* POST \/users *)<\/span>\n<span class=\"k\">let<\/span> <span class=\"n\">post_users<\/span> <span class=\"n\">request<\/span> <span class=\"o\">=<\/span>\n  <span class=\"k\">match<\/span><span class=\"o\">%<\/span><span class=\"n\">lwt<\/span> <span class=\"nn\">Dream_html<\/span><span class=\"p\">.<\/span><span class=\"n\">form<\/span> <span class=\"n\">add_user<\/span> <span class=\"n\">request<\/span> <span class=\"k\">with<\/span>\n  <span class=\"o\">|<\/span> <span class=\"nt\">`Ok<\/span> <span class=\"p\">{<\/span> <span class=\"n\">name<\/span><span class=\"p\">;<\/span> <span class=\"n\">email<\/span><span class=\"p\">;<\/span> <span class=\"n\">accept_terms<\/span> <span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\n    <span class=\"c\">(* ...success... *)<\/span>\n  <span class=\"o\">|<\/span> <span class=\"nt\">`Invalid<\/span> <span class=\"n\">errors<\/span> <span class=\"o\">-&gt;<\/span>\n    <span class=\"nn\">Dream<\/span><span class=\"p\">.<\/span><span class=\"n\">json<\/span> <span class=\"o\">~<\/span><span class=\"n\">code<\/span><span class=\"o\">:<\/span><span class=\"mi\">422<\/span> <span class=\"p\">(<\/span> <span class=\"c\">(* ...turn the error list into a JSON object... *)<\/span> <span class=\"p\">)<\/span>\n  <span class=\"o\">|<\/span> <span class=\"n\">_<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nn\">Dream<\/span><span class=\"p\">.<\/span><span class=\"n\">empty<\/span> <span class=\"nt\">`Bad_Request<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D9%85%D8%B2%DA%AF%D8%B4%D8%A7%DB%8C%DB%8C_%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1_%D9%86%D9%88%D8%B9_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1\"><\/span>\n<p>  \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631 \u0646\u0648\u0639 \u0645\u062a\u063a\u06cc\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0644\u0628\u062a\u0647\u060c \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u0628\u062e\u0634 \u0628\u0632\u0631\u06af\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u062f\u0631 OCaml \u0647\u0633\u062a\u0646\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0641\u0631\u0645 \u0627\u0631\u0633\u0627\u0644\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0642\u062f\u0627\u0631\u06cc \u0627\u0632 \u0646\u0648\u0639 \u0646\u0648\u0639 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"k\">type<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span>\n<span class=\"o\">|<\/span> <span class=\"nc\">Logged_out<\/span>\n<span class=\"o\">|<\/span> <span class=\"nc\">Logged_in<\/span> <span class=\"k\">of<\/span> <span class=\"p\">{<\/span> <span class=\"n\">admin<\/span> <span class=\"o\">:<\/span> <span class=\"kt\">bool<\/span> <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0641\u0631\u0645 \u0627\u0631\u0633\u0627\u0644\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>type: logged-out\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06cc\u0627:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>type: logged-in\nadmin: true\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u063a\u06cc\u0631\u0647<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0627\u06cc\u0646 \u0646\u0648\u0639 \u0627\u0631\u0633\u0627\u0644\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u0645\u0632\u06af\u0634\u0627 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0645\u0648\u0631\u062f \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0646\u06cc\u062f\u060c \u0633\u067e\u0633 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0627 <code>Dream_html.Form.( or )<\/code>\u060c \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"k\">let<\/span> <span class=\"n\">logged_out<\/span> <span class=\"o\">=<\/span>\n  <span class=\"k\">let<\/span><span class=\"o\">+<\/span> <span class=\"n\">_<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ensure<\/span> <span class=\"s2\">\"expected.type\"<\/span> <span class=\"p\">((<\/span> <span class=\"o\">=<\/span> <span class=\"p\">)<\/span> <span class=\"s2\">\"logged-out\"<\/span><span class=\"p\">)<\/span> <span class=\"n\">required<\/span> <span class=\"kt\">string<\/span> <span class=\"s2\">\"type\"<\/span> <span class=\"k\">in<\/span>\n  <span class=\"nc\">Logged_out<\/span>\n\n<span class=\"k\">let<\/span> <span class=\"n\">logged_in<\/span> <span class=\"o\">=<\/span>\n  <span class=\"k\">let<\/span><span class=\"o\">+<\/span> <span class=\"n\">_<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ensure<\/span> <span class=\"s2\">\"expected.type\"<\/span> <span class=\"p\">((<\/span> <span class=\"o\">=<\/span> <span class=\"p\">)<\/span> <span class=\"s2\">\"logged-in\"<\/span><span class=\"p\">)<\/span> <span class=\"n\">required<\/span> <span class=\"kt\">string<\/span> <span class=\"s2\">\"type\"<\/span>\n  <span class=\"ow\">and<\/span><span class=\"o\">+<\/span> <span class=\"n\">admin<\/span> <span class=\"o\">=<\/span> <span class=\"n\">required<\/span> <span class=\"kt\">bool<\/span> <span class=\"s2\">\"admin\"<\/span> <span class=\"k\">in<\/span>\n  <span class=\"nc\">Logged_in<\/span> <span class=\"p\">{<\/span> <span class=\"n\">admin<\/span> <span class=\"p\">}<\/span>\n\n<span class=\"k\">let<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">logged_out<\/span> <span class=\"ow\">or<\/span> <span class=\"n\">logged_in<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code># validate user [];;\n- : (user, (string * string) list) result =\nError [(\"admin\", \"error.required\"); (\"type\", \"error.required\")]\n\n# validate user [\"type\", \"logged-out\"];;\n- : (user, (string * string) list) result = Ok Logged_out\n\n# validate user [\"type\", \"logged-in\"];;\n- : (user, (string * string) list) result = Error [(\"admin\", \"error.required\")]\n\n# validate user [\"type\", \"logged-in\"; \"admin\", \"\"];;\n- : (user, (string * string) list) result =\nError [(\"admin\", \"error.expected.bool\")]\n\n# validate user [\"type\", \"logged-in\"; \"admin\", \"true\"];;\n- : (user, (string * string) list) result = Ok (Logged_in { admin = true })\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u062f\u060c \u0631\u0645\u0632\u06af\u0634\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0647\u0631 \u062f\u0648 \u0645\u0648\u0631\u062f \u0648 \u062a\u0645\u0627\u0645 \u0627\u0644\u0632\u0627\u0645\u0627\u062a \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u0622\u0646 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D9%85%D8%B2%DA%AF%D8%B4%D8%A7%DB%8C%DB%8C_%D9%BE%D8%B1%D8%B3_%D9%88_%D8%AC%D9%88%D9%87%D8%A7_%D8%A8%D9%87_%D8%A7%D9%86%D9%88%D8%A7%D8%B9_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C\"><\/span>\n<p>  \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627 \u0628\u0647 \u0627\u0646\u0648\u0627\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0639\u0645\u0644\u06a9\u0631\u062f \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0646\u0647 \u062a\u0646\u0647\u0627 \u0628\u0627 \u00ab\u0641\u0631\u0645\u200c\u0647\u0627\u00bb \u0628\u0644\u06a9\u0647 \u0628\u0627 \u067e\u0631\u0633\u200c\u0648\u200c\u062c\u0648\u0647\u0627 \u0646\u06cc\u0632 \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f <code>\/foo?a=1&amp;b=2<\/code>. \u0627\u0644\u0628\u062a\u0647\u060c \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u0627\u0632 \u00ab\u0641\u0631\u0645\u200c\u0647\u0627\u00bb \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u062e\u0644\u0627\u0635\u0647\u200c\u0646\u0648\u06cc\u0633\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 <code>application\/x-www-form-urlencoded<\/code> \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u0627\u0645\u0627 \u062f\u0631 \u0648\u0627\u0642\u0639 \u06cc\u06a9 \u0641\u0631\u0645 HTML \u0627\u0633\u062a <code>action=get<\/code> \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a a \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f <em>\u067e\u0631\u0633 \u0648 \u062c\u0648\u060c<\/em> \u0628\u062e\u0634\u06cc \u0627\u0632 URL\u060c \u0646\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0641\u0631\u0645. \u06a9\u0645\u06cc \u06af\u06cc\u062c \u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0646\u06a9\u062a\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u0647 \u062e\u0627\u0637\u0631 \u0628\u0633\u067e\u0627\u0631\u06cc\u062f \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 Dream \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0647\u0631 \u062f\u0648 \u06a9\u0627\u0631 \u06a9\u0646\u062f\u060c \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 dream-html.<\/p>\n<p>\u062f\u0631 Dream\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0648\u0627\u0628\u0639\u06cc \u0645\u0627\u0646\u0646\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f <code>let a = Dream.query request \"a\"<\/code>. \u0627\u0645\u0627 \u0627\u06af\u0631 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631\u06cc \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0641\u0631\u0645 \u0628\u0627\u0644\u0627\u060c \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc UTM \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0646\u0648\u0639 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"k\">type<\/span> <span class=\"n\">utm<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">source<\/span> <span class=\"o\">:<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">option<\/span><span class=\"p\">;<\/span>\n  <span class=\"n\">medium<\/span> <span class=\"o\">:<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">option<\/span><span class=\"p\">;<\/span>\n  <span class=\"n\">campaign<\/span> <span class=\"o\">:<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">option<\/span><span class=\"p\">;<\/span>\n  <span class=\"n\">term<\/span> <span class=\"o\">:<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">option<\/span><span class=\"p\">;<\/span>\n  <span class=\"n\">content<\/span> <span class=\"o\">:<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">option<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">let<\/span> <span class=\"n\">utm<\/span> <span class=\"o\">=<\/span>\n  <span class=\"k\">let<\/span><span class=\"o\">+<\/span> <span class=\"n\">source<\/span> <span class=\"o\">=<\/span> <span class=\"n\">optional<\/span> <span class=\"kt\">string<\/span> <span class=\"s2\">\"utm_source\"<\/span>\n  <span class=\"ow\">and<\/span><span class=\"o\">+<\/span> <span class=\"n\">medium<\/span> <span class=\"o\">=<\/span> <span class=\"n\">optional<\/span> <span class=\"kt\">string<\/span> <span class=\"s2\">\"utm_medium\"<\/span>\n  <span class=\"ow\">and<\/span><span class=\"o\">+<\/span> <span class=\"n\">campaign<\/span> <span class=\"o\">=<\/span> <span class=\"n\">optional<\/span> <span class=\"kt\">string<\/span> <span class=\"s2\">\"utm_campaign\"<\/span>\n  <span class=\"ow\">and<\/span><span class=\"o\">+<\/span> <span class=\"n\">term<\/span> <span class=\"o\">=<\/span> <span class=\"n\">optional<\/span> <span class=\"kt\">string<\/span> <span class=\"s2\">\"utm_term\"<\/span>\n  <span class=\"ow\">and<\/span><span class=\"o\">+<\/span> <span class=\"n\">content<\/span> <span class=\"o\">=<\/span> <span class=\"n\">optional<\/span> <span class=\"kt\">string<\/span> <span class=\"s2\">\"utm_content\"<\/span> <span class=\"k\">in<\/span>\n  <span class=\"p\">{<\/span> <span class=\"n\">source<\/span><span class=\"p\">;<\/span> <span class=\"n\">medium<\/span><span class=\"p\">;<\/span> <span class=\"n\">campaign<\/span><span class=\"p\">;<\/span> <span class=\"n\">term<\/span><span class=\"p\">;<\/span> <span class=\"n\">content<\/span> <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u0631\u0633\u0627\u0644 \u0641\u0631\u0645 POST \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight ocaml\"><code><span class=\"k\">let<\/span> <span class=\"n\">some_page<\/span> <span class=\"n\">request<\/span> <span class=\"o\">=<\/span>\n  <span class=\"k\">match<\/span> <span class=\"nn\">Dream_html<\/span><span class=\"p\">.<\/span><span class=\"n\">query<\/span> <span class=\"n\">utm<\/span> <span class=\"n\">request<\/span> <span class=\"k\">with<\/span>\n  <span class=\"o\">|<\/span> <span class=\"nt\">`Ok<\/span> <span class=\"p\">{<\/span> <span class=\"n\">source<\/span><span class=\"p\">;<\/span> <span class=\"n\">medium<\/span><span class=\"p\">;<\/span> <span class=\"n\">campaign<\/span><span class=\"p\">;<\/span> <span class=\"n\">term<\/span><span class=\"p\">;<\/span> <span class=\"n\">content<\/span> <span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\n    <span class=\"c\">(* ...success... *)<\/span>\n  <span class=\"o\">|<\/span> <span class=\"nt\">`Invalid<\/span> <span class=\"n\">errors<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"c\">(* ...handle errors... *)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0646\u06a9\u062a\u0647 \u062c\u0627\u0644\u0628 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0622\u0646\u0647\u0627 \u0628\u0647 \u0645\u0639\u0646\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u06a9\u0644\u0645\u0647 \u0647\u0645\u0627\u0646 \u062a\u0639\u0631\u06cc\u0641 \u0641\u0631\u0645 \u0647\u0633\u062a\u0646\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0628\u0633\u06cc\u0627\u0631 \u0627\u0646\u062f\u06a9\u060c \u0628\u06cc\u0646 \u0627\u0646\u062c\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062e\u0648\u062f \u0628\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0641\u0631\u0645 POST \u06cc\u0627 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648 GET \u0633\u0648\u0626\u06cc\u0686 \u06a9\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%B3%E2%80%A6\"><\/span>\n<p>  \u067e\u0633&#8230;<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0648\u0627\u06cc \u0627\u06cc\u0646 \u062e\u06cc\u0644\u06cc \u0628\u0648\u062f. \u0648 \u0645\u0646 \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u067e\u06cc\u0634\u0631\u0641\u062a\u0647\u200c\u062a\u0631 \u0647\u0645 \u0646\u067e\u0631\u062f\u0627\u062e\u062a\u0647\u200c\u0627\u0645. \u0627\u0645\u0627 \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06cc\u0645 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0634\u0645\u0627 \u0645\u062a\u0642\u0627\u0639\u062f \u0634\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0641\u0631\u0645 \u0647\u0627 \u0648 \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627 \u0627\u06a9\u0646\u0648\u0646 \u062f\u0631 Dream \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0642\u0627\u0628\u0644 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0647\u0633\u062a\u0646\u062f. \u0627\u0644\u0628\u062a\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0648\u0627\u0642\u0639\u0627\u064b \u0628\u0647 \u0627\u06cc\u0646 \u0647\u0645\u0647 \u0642\u062f\u0631\u062a \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0633\u0627\u062f\u0647\u060c \u0627\u062d\u062a\u0645\u0627\u0644\u0627\u064b \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u062f\u0627\u062e\u0644\u06cc Dream \u062e\u0644\u0627\u0635 \u0634\u0648\u06cc\u062f. \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af\u200c\u062a\u0631 \u06a9\u0647 \u0634\u0627\u06cc\u062f \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0641\u0631\u0645\u200c\u0647\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f\u060c \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0646\u0645 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u062a\u0648\u062c\u0647: Dream_html.form \u0648 query \u062a\u0648\u0627\u0628\u0639 \u06a9\u0645\u06a9\u06cc \u0645\u0646\u062a\u0634\u0631 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a. \u0622\u0646\u0647\u0627 \u062f\u0631 \u0646\u0633\u062e\u0647 \u0628\u0639\u062f\u06cc \u0628\u0631\u0627\u06cc opam \u0645\u0646\u062a\u0634\u0631 \u062e\u0648\u0627\u0647\u0646\u062f \u0634\u062f. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u062f\u06cc\u06af\u0631 \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a! \u0645\u0646 \u0645\u062f\u062a\u200c\u0647\u0627 \u0637\u0631\u0641\u062f\u0627\u0631 \u0642\u062f\u0631\u062a \u0641\u0631\u0645\u200c\u0647\u0627\u06cc HTML \u0648 \u0637\u0628\u06cc\u0639\u06cc \u0628\u0648\u062f\u0646 \u0622\u0646\u0647\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0635\u0641\u062d\u0627\u062a \u0648\u0628 \u0628\u0648\u062f\u0647\u200c\u0627\u0645 \u06a9\u0647 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u062c\u0627\u0632\u0647 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":86375,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-86374","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=86374"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86374\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/86375"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=86374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=86374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=86374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}