[{"data":1,"prerenderedAt":1993},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-httperr-validation":442,"-hu-httperr-validation-surround":1988},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":400,"body":444,"description":1981,"extension":1982,"links":1983,"meta":1984,"navigation":1985,"path":401,"seo":1986,"stem":402,"__hash__":1987},"docs_hu\u002Fhu\u002F7.httperr\u002F3.validation.md",{"type":445,"value":446,"toc":1969},"minimark",[447,472,501,506,660,667,706,755,759,796,887,912,927,931,934,1006,1017,1322,1336,1422,1426,1436,1624,1644,1648,1659,1774,1778,1787,1839,1849,1853,1874,1878,1892,1896,1924,1928,1965],[448,449,450,451,455,456,463,464,467,468,471],"p",{},"A kérés-validáció a gpsystemben deklaratív: szabályokat írsz a struct mezőire tagekben, a futtatást és a hibarenderelést pedig a ",[452,453,454],"code",{},"httperr\u002Fvalidate"," végzi. A motor a ",[457,458,462],"a",{"href":459,"rel":460},"https:\u002F\u002Fgithub.com\u002Fgo-playground\u002Fvalidator",[461],"nofollow","go-playground\u002Fvalidator v10"," (a Go de facto standard validátora); a ",[452,465,466],{},"validate"," csomag pedig azt köti be úgy, hogy minden bukás ",[457,469,470],{"href":396},"RFC 9457 problem-válasz"," legyen, mezőnkénti hibalistával, handler-kód nélkül.",[473,474,479],"pre",{"className":475,"code":476,"language":477,"meta":478,"style":478},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fhttperr\u002Fvalidate\"\n","go","",[452,480,481],{"__ignoreMap":478},[482,483,486,490,494,498],"span",{"class":484,"line":485},"line",1,[482,487,489],{"class":488},"s7zQu","import",[482,491,493],{"class":492},"sMK4o"," \"",[482,495,497],{"class":496},"sBMFI","github.com\u002Fgp-system\u002Fhttperr\u002Fvalidate",[482,499,500],{"class":492},"\"\n",[502,503,505],"h2",{"id":504},"a-validator-típus","A Validator típus",[473,507,509],{"className":475,"code":508,"language":477,"meta":478,"style":478},"func New(opts ...Option) *Validator\n\nfunc (v *Validator) Validate(out any) error \u002F\u002F validál, bukást *httperr.Problem-mé (422) csomagol\nfunc (v *Validator) Struct(s any) error     \u002F\u002F ugyanaz, a binding pipeline-on kívüli használatra nevezve\n\nfunc Translate(verrs validator.ValidationErrors) []httperr.FieldError\n",[452,510,511,542,549,589,621,626],{"__ignoreMap":478},[482,512,513,516,520,523,527,530,533,536,539],{"class":484,"line":485},[482,514,515],{"class":492},"func",[482,517,519],{"class":518},"s2Zo4"," New",[482,521,522],{"class":492},"(",[482,524,526],{"class":525},"sHdIc","opts",[482,528,529],{"class":492}," ...",[482,531,532],{"class":496},"Option",[482,534,535],{"class":492},")",[482,537,538],{"class":492}," *",[482,540,541],{"class":496},"Validator\n",[482,543,545],{"class":484,"line":544},2,[482,546,548],{"emptyLinePlaceholder":547},true,"\n",[482,550,552,554,557,560,563,566,568,571,573,576,579,581,585],{"class":484,"line":551},3,[482,553,515],{"class":492},[482,555,556],{"class":492}," (",[482,558,559],{"class":525},"v ",[482,561,562],{"class":492},"*",[482,564,565],{"class":496},"Validator",[482,567,535],{"class":492},[482,569,570],{"class":518}," Validate",[482,572,522],{"class":492},[482,574,575],{"class":525},"out",[482,577,578],{"class":496}," any",[482,580,535],{"class":492},[482,582,584],{"class":583},"spNyl"," error",[482,586,588],{"class":587},"sHwdD"," \u002F\u002F validál, bukást *httperr.Problem-mé (422) csomagol\n",[482,590,592,594,596,598,600,602,604,607,609,612,614,616,618],{"class":484,"line":591},4,[482,593,515],{"class":492},[482,595,556],{"class":492},[482,597,559],{"class":525},[482,599,562],{"class":492},[482,601,565],{"class":496},[482,603,535],{"class":492},[482,605,606],{"class":518}," Struct",[482,608,522],{"class":492},[482,610,611],{"class":525},"s",[482,613,578],{"class":496},[482,615,535],{"class":492},[482,617,584],{"class":583},[482,619,620],{"class":587},"     \u002F\u002F ugyanaz, a binding pipeline-on kívüli használatra nevezve\n",[482,622,624],{"class":484,"line":623},5,[482,625,548],{"emptyLinePlaceholder":547},[482,627,629,631,634,636,639,642,645,648,650,653,655,657],{"class":484,"line":628},6,[482,630,515],{"class":492},[482,632,633],{"class":518}," Translate",[482,635,522],{"class":492},[482,637,638],{"class":525},"verrs",[482,640,641],{"class":496}," validator",[482,643,644],{"class":492},".",[482,646,647],{"class":496},"ValidationErrors",[482,649,535],{"class":492},[482,651,652],{"class":492}," []",[482,654,386],{"class":496},[482,656,644],{"class":492},[482,658,659],{"class":496},"FieldError\n",[448,661,662,663,666],{},"A ",[452,664,665],{},"New"," a validátort két rögzített defaulttal építi:",[668,669,670,684],"ul",{},[671,672,673,679,680,683],"li",{},[674,675,676],"strong",{},[452,677,678],{},"WithRequiredStructEnabled()",": a beágyazott structok ",[452,681,682],{},"required"," szemantikája a validator v11 default szerint működik;",[671,685,686,689,690,693,694,697,698,701,702,705],{},[674,687,688],{},"json-tag mezőnevek",": a hibákban a mező neve a ",[452,691,692],{},"json"," tagből jön (",[452,695,696],{},"customerEmail",", nem ",[452,699,700],{},"CustomerEmail","), beágyazott structoknál pontozott útvonallal (",[452,703,704],{},"address.city",").",[448,707,708,709,712,713,716,717,720,721,724,725,728,729,731,732,734,735,734,738,734,741,734,744,734,747,750,751,754],{},"Bukáskor a ",[452,710,711],{},"Validate","\u002F",[452,714,715],{},"Struct"," nem nyers validator-hibát ad vissza, hanem kész ",[452,718,719],{},"*httperr.Problem","-et (422), a ",[452,722,723],{},"Translate","-tel ",[452,726,727],{},"httperr.FieldError","-okká fordított mezőhibákkal: a hibarenderelőnek így nincs több dolga vele. A ",[452,730,723],{}," a gyakori szabályokhoz (",[452,733,682],{},", ",[452,736,737],{},"email",[452,739,740],{},"min",[452,742,743],{},"max",[452,745,746],{},"oneof",[452,748,749],{},"gt",", ...) ember-olvasható üzenetet ír; ismeretlen szabálynál a ",[452,752,753],{},"failed rule \u003Ctag>=\u003Cparam>"," formára esik vissza.",[502,756,758],{"id":757},"bekötés-strict-middleware-a-handler-előtt","Bekötés: strict middleware a handler előtt",[448,760,662,761,764,765,770,771,773,774,777,778,780,781,787,788,791,792,795],{},[452,762,763],{},"net\u002Fhttp"," standard strict szervere (az ",[457,766,769],{"href":767,"rel":768},"https:\u002F\u002Fgithub.com\u002Foapi-codegen\u002Foapi-codegen",[461],"oapi-codegen"," generálja az OpenAPI specből, lásd ",[457,772,233],{"href":234},") ",[452,775,776],{},"json.Decoder","-rel dekódol, validáció nélkül: a ",[452,779,466],{}," ezt a rést strict middleware-ként zárja be, a teljes bekötött request objektumot (paraméterek + body) validálja a handler előtt. Egy generált gpsystem projektben a kit ",[457,782,784],{"href":783},"\u002Fhu\u002Fkit\u002Fserver#strictvalidator-valid%C3%A1ci%C3%B3-a-handler-el%C5%91tt",[452,785,786],{},"server.StrictValidator","-a az a vékony adapter, ami egy ",[452,789,790],{},"*validate.Validator","-t bedrótoz ebbe a middleware-résbe; a generált ",[452,793,794],{},"register.go"," automatikusan bedrótozza:",[473,797,799],{"className":475,"code":798,"language":477,"meta":478,"style":478},"shopapigen.NewStrictHandlerWithOptions(apiHandler,\n    []shopapigen.StrictMiddlewareFunc{\n        server.StrictValidator[shopapigen.StrictHandlerFunc](nil),\n        \u002F\u002F ...\n    },\n    shopapigen.StrictHTTPServerOptions{ \u002F* httperr hookok *\u002F })\n",[452,800,801,820,835,858,863,868],{"__ignoreMap":478},[482,802,803,807,809,812,814,817],{"class":484,"line":485},[482,804,806],{"class":805},"sTEyZ","shopapigen",[482,808,644],{"class":492},[482,810,811],{"class":518},"NewStrictHandlerWithOptions",[482,813,522],{"class":492},[482,815,816],{"class":805},"apiHandler",[482,818,819],{"class":492},",\n",[482,821,822,825,827,829,832],{"class":484,"line":544},[482,823,824],{"class":492},"    []",[482,826,806],{"class":496},[482,828,644],{"class":492},[482,830,831],{"class":496},"StrictMiddlewareFunc",[482,833,834],{"class":492},"{\n",[482,836,837,840,842,845,848,850,852,855],{"class":484,"line":551},[482,838,839],{"class":805},"        server",[482,841,644],{"class":492},[482,843,844],{"class":518},"StrictValidator",[482,846,847],{"class":492},"[",[482,849,806],{"class":496},[482,851,644],{"class":492},[482,853,854],{"class":496},"StrictHandlerFunc",[482,856,857],{"class":492},"](nil),\n",[482,859,860],{"class":484,"line":591},[482,861,862],{"class":587},"        \u002F\u002F ...\n",[482,864,865],{"class":484,"line":623},[482,866,867],{"class":492},"    },\n",[482,869,870,873,875,878,881,884],{"class":484,"line":628},[482,871,872],{"class":496},"    shopapigen",[482,874,644],{"class":492},[482,876,877],{"class":496},"StrictHTTPServerOptions",[482,879,880],{"class":492},"{",[482,882,883],{"class":587}," \u002F* httperr hookok *\u002F",[482,885,886],{"class":492}," })\n",[448,888,662,889,892,893,896,897,900,901,904,905,908,909,644],{},[452,890,891],{},"nil"," argumentum szándékos: a ",[452,894,895],{},"server.StrictValidator(nil)"," request-időben oldja fel a validátort, előbb a ",[452,898,899],{},"server.WithValidator","-ral beállítottat keresve a contextben, és csak utána esve vissza a ",[452,902,903],{},"validate.New()","-ra. Így egyetlen opció a ",[452,906,907],{},"main.go","-ban az egész alkalmazásra érvényes, a generált kódhoz nem kell nyúlni. Részletek, a policy-enforcementhez viszonyított pontos middleware-sorrenddel együtt: ",[457,910,911],{"href":783},"a szerver mag",[448,913,914,915,917,918,921,922,924,925,644],{},"Generált projekten kívül a ",[452,916,903],{}," bekötése semmi kit-specifikusat nem igényel: hívd a ",[452,919,920],{},"v.Struct(req)","-et bárhol a saját ",[452,923,763],{}," handleredben vagy middleware-láncodban, ahol egyébként egy dekódolt kérést validálnál, és add vissza a kapott hibát változatlanul; az már egy ",[452,926,719],{},[502,928,930],{"id":929},"a-shop-a-placeorder-kérése","A shop: a PlaceOrder kérése",[448,932,933],{},"A rendelésfeladás body-ja három szabályt hordoz:",[473,935,937],{"className":475,"code":936,"language":477,"meta":478,"style":478},"type placeOrderBody struct {\n    ProductID     string `json:\"productId\" validate:\"required,uuid4\"`\n    Quantity      int    `json:\"quantity\" validate:\"required,gt=0\"`\n    CustomerEmail string `json:\"customerEmail\" validate:\"required,email\"`\n}\n",[452,938,939,953,971,987,1001],{"__ignoreMap":478},[482,940,941,944,947,950],{"class":484,"line":485},[482,942,943],{"class":492},"type",[482,945,946],{"class":496}," placeOrderBody",[482,948,949],{"class":492}," struct",[482,951,952],{"class":492}," {\n",[482,954,955,958,961,964,968],{"class":484,"line":544},[482,956,957],{"class":805},"    ProductID     ",[482,959,960],{"class":583},"string",[482,962,963],{"class":492}," `",[482,965,967],{"class":966},"sfazB","json:\"productId\" validate:\"required,uuid4\"",[482,969,970],{"class":492},"`\n",[482,972,973,976,979,982,985],{"class":484,"line":551},[482,974,975],{"class":805},"    Quantity      ",[482,977,978],{"class":583},"int",[482,980,981],{"class":492},"    `",[482,983,984],{"class":966},"json:\"quantity\" validate:\"required,gt=0\"",[482,986,970],{"class":492},[482,988,989,992,994,996,999],{"class":484,"line":591},[482,990,991],{"class":805},"    CustomerEmail ",[482,993,960],{"class":583},[482,995,963],{"class":492},[482,997,998],{"class":966},"json:\"customerEmail\" validate:\"required,email\"",[482,1000,970],{"class":492},[482,1002,1003],{"class":484,"line":623},[482,1004,1005],{"class":492},"}\n",[448,1007,1008,1009,1012,1013,1016],{},"Egy kérés, ami mindhármat megsérti (",[452,1010,1011],{},"quantity: 0",", hibás e-mail, hiányzó ",[452,1014,1015],{},"productId","), ezt a választ kapja:",[473,1018,1021],{"className":1019,"code":1020,"language":692,"meta":478,"style":478},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"type\": \"about:blank\",\n  \"title\": \"Unprocessable Entity\",\n  \"status\": 422,\n  \"detail\": \"One or more fields failed validation.\",\n  \"instance\": \"\u002Fapi\u002Fv1\u002Fshop\u002Forders\",\n  \"errors\": [\n    { \"field\": \"productId\", \"rule\": \"required\", \"message\": \"is required\" },\n    { \"field\": \"quantity\", \"rule\": \"gt\", \"message\": \"must be greater than 0\" },\n    { \"field\": \"customerEmail\", \"rule\": \"email\", \"message\": \"must be a valid email address\" }\n  ]\n}\n",[452,1022,1023,1027,1049,1069,1086,1106,1126,1141,1201,1256,1311,1317],{"__ignoreMap":478},[482,1024,1025],{"class":484,"line":485},[482,1026,834],{"class":492},[482,1028,1029,1032,1034,1037,1040,1042,1045,1047],{"class":484,"line":544},[482,1030,1031],{"class":492},"  \"",[482,1033,943],{"class":583},[482,1035,1036],{"class":492},"\"",[482,1038,1039],{"class":492},":",[482,1041,493],{"class":492},[482,1043,1044],{"class":966},"about:blank",[482,1046,1036],{"class":492},[482,1048,819],{"class":492},[482,1050,1051,1053,1056,1058,1060,1062,1065,1067],{"class":484,"line":551},[482,1052,1031],{"class":492},[482,1054,1055],{"class":583},"title",[482,1057,1036],{"class":492},[482,1059,1039],{"class":492},[482,1061,493],{"class":492},[482,1063,1064],{"class":966},"Unprocessable Entity",[482,1066,1036],{"class":492},[482,1068,819],{"class":492},[482,1070,1071,1073,1076,1078,1080,1084],{"class":484,"line":591},[482,1072,1031],{"class":492},[482,1074,1075],{"class":583},"status",[482,1077,1036],{"class":492},[482,1079,1039],{"class":492},[482,1081,1083],{"class":1082},"sbssI"," 422",[482,1085,819],{"class":492},[482,1087,1088,1090,1093,1095,1097,1099,1102,1104],{"class":484,"line":623},[482,1089,1031],{"class":492},[482,1091,1092],{"class":583},"detail",[482,1094,1036],{"class":492},[482,1096,1039],{"class":492},[482,1098,493],{"class":492},[482,1100,1101],{"class":966},"One or more fields failed validation.",[482,1103,1036],{"class":492},[482,1105,819],{"class":492},[482,1107,1108,1110,1113,1115,1117,1119,1122,1124],{"class":484,"line":628},[482,1109,1031],{"class":492},[482,1111,1112],{"class":583},"instance",[482,1114,1036],{"class":492},[482,1116,1039],{"class":492},[482,1118,493],{"class":492},[482,1120,1121],{"class":966},"\u002Fapi\u002Fv1\u002Fshop\u002Forders",[482,1123,1036],{"class":492},[482,1125,819],{"class":492},[482,1127,1129,1131,1134,1136,1138],{"class":484,"line":1128},7,[482,1130,1031],{"class":492},[482,1132,1133],{"class":583},"errors",[482,1135,1036],{"class":492},[482,1137,1039],{"class":492},[482,1139,1140],{"class":492}," [\n",[482,1142,1144,1147,1149,1152,1154,1156,1158,1160,1162,1165,1167,1170,1172,1174,1176,1178,1180,1182,1184,1187,1189,1191,1193,1196,1198],{"class":484,"line":1143},8,[482,1145,1146],{"class":492},"    {",[482,1148,493],{"class":492},[482,1150,1151],{"class":496},"field",[482,1153,1036],{"class":492},[482,1155,1039],{"class":492},[482,1157,493],{"class":492},[482,1159,1015],{"class":966},[482,1161,1036],{"class":492},[482,1163,1164],{"class":492},",",[482,1166,493],{"class":492},[482,1168,1169],{"class":496},"rule",[482,1171,1036],{"class":492},[482,1173,1039],{"class":492},[482,1175,493],{"class":492},[482,1177,682],{"class":966},[482,1179,1036],{"class":492},[482,1181,1164],{"class":492},[482,1183,493],{"class":492},[482,1185,1186],{"class":496},"message",[482,1188,1036],{"class":492},[482,1190,1039],{"class":492},[482,1192,493],{"class":492},[482,1194,1195],{"class":966},"is required",[482,1197,1036],{"class":492},[482,1199,1200],{"class":492}," },\n",[482,1202,1204,1206,1208,1210,1212,1214,1216,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1252,1254],{"class":484,"line":1203},9,[482,1205,1146],{"class":492},[482,1207,493],{"class":492},[482,1209,1151],{"class":496},[482,1211,1036],{"class":492},[482,1213,1039],{"class":492},[482,1215,493],{"class":492},[482,1217,1218],{"class":966},"quantity",[482,1220,1036],{"class":492},[482,1222,1164],{"class":492},[482,1224,493],{"class":492},[482,1226,1169],{"class":496},[482,1228,1036],{"class":492},[482,1230,1039],{"class":492},[482,1232,493],{"class":492},[482,1234,749],{"class":966},[482,1236,1036],{"class":492},[482,1238,1164],{"class":492},[482,1240,493],{"class":492},[482,1242,1186],{"class":496},[482,1244,1036],{"class":492},[482,1246,1039],{"class":492},[482,1248,493],{"class":492},[482,1250,1251],{"class":966},"must be greater than 0",[482,1253,1036],{"class":492},[482,1255,1200],{"class":492},[482,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1306,1308],{"class":484,"line":1258},10,[482,1260,1146],{"class":492},[482,1262,493],{"class":492},[482,1264,1151],{"class":496},[482,1266,1036],{"class":492},[482,1268,1039],{"class":492},[482,1270,493],{"class":492},[482,1272,696],{"class":966},[482,1274,1036],{"class":492},[482,1276,1164],{"class":492},[482,1278,493],{"class":492},[482,1280,1169],{"class":496},[482,1282,1036],{"class":492},[482,1284,1039],{"class":492},[482,1286,493],{"class":492},[482,1288,737],{"class":966},[482,1290,1036],{"class":492},[482,1292,1164],{"class":492},[482,1294,493],{"class":492},[482,1296,1186],{"class":496},[482,1298,1036],{"class":492},[482,1300,1039],{"class":492},[482,1302,493],{"class":492},[482,1304,1305],{"class":966},"must be a valid email address",[482,1307,1036],{"class":492},[482,1309,1310],{"class":492}," }\n",[482,1312,1314],{"class":484,"line":1313},11,[482,1315,1316],{"class":492},"  ]\n",[482,1318,1320],{"class":484,"line":1319},12,[482,1321,1005],{"class":492},[448,1323,662,1324,1326,1327,1329,1330,1332,1333,1335],{},[452,1325,1169],{}," gépi olvasású (a frontend mezőnként ágazhat el rajta), a ",[452,1328,1186],{}," pedig ember-olvasható default: a végleges, lokalizált szöveget jellemzően a kliens rendeli a ",[452,1331,1151],{}," + ",[452,1334,1169],{}," párhoz.",[1337,1338,1340,1355,1415],"note",{"title":1339},"Honnan kerülnek tagek a generált modellekre?",[448,1341,1342,1343,1346,1347,1350,1351,1354],{},"A kézzel írt structjaidon (service-input, belső DTO-k) a tageket te írod. A ",[457,1344,1345],{"href":234},"spec-first"," generált request-modelleknél a tag forrása az OpenAPI ",[452,1348,1349],{},"x-oapi-codegen-extra-tags"," extensionje, amit TypeSpecből az ",[452,1352,1353],{},"@extension"," decoratorral adsz a mezőre:",[473,1356,1360],{"className":1357,"code":1358,"language":1359,"meta":478,"style":478},"language-tsp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","model PlaceOrderBody {\n  @extension(\"x-oapi-codegen-extra-tags\", #{ validate: \"required,gt=0\" })\n  quantity: int32;\n}\n","tsp",[452,1361,1362,1372,1398,1411],{"__ignoreMap":478},[482,1363,1364,1367,1370],{"class":484,"line":485},[482,1365,1366],{"class":1082},"model",[482,1368,1369],{"class":496}," PlaceOrderBody",[482,1371,952],{"class":492},[482,1373,1374,1378,1380,1383,1385,1388,1391,1393,1396],{"class":484,"line":544},[482,1375,1377],{"class":1376},"swJcz","  @extension",[482,1379,522],{"class":492},[482,1381,1382],{"class":966},"\"x-oapi-codegen-extra-tags\"",[482,1384,1164],{"class":492},[482,1386,1387],{"class":492}," #{",[482,1389,1390],{"class":805}," validate",[482,1392,1039],{"class":492},[482,1394,1395],{"class":966}," \"required,gt=0\"",[482,1397,886],{"class":492},[482,1399,1400,1403,1405,1408],{"class":484,"line":551},[482,1401,1402],{"class":805},"  quantity",[482,1404,1039],{"class":492},[482,1406,1407],{"class":496}," int32",[482,1409,1410],{"class":492},";\n",[482,1412,1413],{"class":484,"line":591},[482,1414,1005],{"class":492},[448,1416,1417,1418,1421],{},"Az oapi-codegen ebből ",[452,1419,1420],{},"validate:\"required,gt=0\""," taget emittál a generált mezőre; a fenti pipeline onnantól ugyanúgy fut rajta.",[502,1423,1425],{"id":1424},"saját-tagek","Saját tagek",[448,1427,1428,1429,1432,1433,1435],{},"A beépített szabálykészleten túl sajátot a ",[452,1430,1431],{},"WithRegister","-rel regisztrálsz, és a ",[452,1434,899],{},"-ral teszed alkalmazás-szintűvé:",[473,1437,1439],{"className":475,"code":1438,"language":477,"meta":478,"style":478},"v := validate.New(validate.WithRegister(func(v *validator.Validate) {\n    _ = v.RegisterValidation(\"slug\", func(fl validator.FieldLevel) bool {\n        return slugRe.MatchString(fl.Field().String())\n    })\n}))\n\nerr := server.Run(ctx, cfg.Server, register, server.WithValidator(v))\n",[452,1440,1441,1481,1528,1559,1564,1569,1573],{"__ignoreMap":478},[482,1442,1443,1445,1448,1450,1452,1454,1456,1458,1460,1462,1465,1468,1470,1473,1475,1477,1479],{"class":484,"line":485},[482,1444,559],{"class":805},[482,1446,1447],{"class":492},":=",[482,1449,1390],{"class":805},[482,1451,644],{"class":492},[482,1453,665],{"class":518},[482,1455,522],{"class":492},[482,1457,466],{"class":805},[482,1459,644],{"class":492},[482,1461,1431],{"class":518},[482,1463,1464],{"class":492},"(func(",[482,1466,1467],{"class":525},"v",[482,1469,538],{"class":492},[482,1471,1472],{"class":496},"validator",[482,1474,644],{"class":492},[482,1476,711],{"class":496},[482,1478,535],{"class":492},[482,1480,952],{"class":492},[482,1482,1483,1486,1489,1492,1494,1497,1499,1501,1504,1506,1508,1511,1514,1516,1518,1521,1523,1526],{"class":484,"line":544},[482,1484,1485],{"class":805},"    _ ",[482,1487,1488],{"class":492},"=",[482,1490,1491],{"class":805}," v",[482,1493,644],{"class":492},[482,1495,1496],{"class":518},"RegisterValidation",[482,1498,522],{"class":492},[482,1500,1036],{"class":492},[482,1502,1503],{"class":966},"slug",[482,1505,1036],{"class":492},[482,1507,1164],{"class":492},[482,1509,1510],{"class":492}," func(",[482,1512,1513],{"class":525},"fl",[482,1515,641],{"class":496},[482,1517,644],{"class":492},[482,1519,1520],{"class":496},"FieldLevel",[482,1522,535],{"class":492},[482,1524,1525],{"class":583}," bool",[482,1527,952],{"class":492},[482,1529,1530,1533,1536,1538,1541,1543,1545,1547,1550,1553,1556],{"class":484,"line":551},[482,1531,1532],{"class":488},"        return",[482,1534,1535],{"class":805}," slugRe",[482,1537,644],{"class":492},[482,1539,1540],{"class":518},"MatchString",[482,1542,522],{"class":492},[482,1544,1513],{"class":805},[482,1546,644],{"class":492},[482,1548,1549],{"class":518},"Field",[482,1551,1552],{"class":492},"().",[482,1554,1555],{"class":518},"String",[482,1557,1558],{"class":492},"())\n",[482,1560,1561],{"class":484,"line":591},[482,1562,1563],{"class":492},"    })\n",[482,1565,1566],{"class":484,"line":623},[482,1567,1568],{"class":492},"}))\n",[482,1570,1571],{"class":484,"line":628},[482,1572,548],{"emptyLinePlaceholder":547},[482,1574,1575,1578,1580,1583,1585,1588,1590,1593,1595,1598,1600,1603,1605,1608,1610,1612,1614,1617,1619,1621],{"class":484,"line":1128},[482,1576,1577],{"class":805},"err ",[482,1579,1447],{"class":492},[482,1581,1582],{"class":805}," server",[482,1584,644],{"class":492},[482,1586,1587],{"class":518},"Run",[482,1589,522],{"class":492},[482,1591,1592],{"class":805},"ctx",[482,1594,1164],{"class":492},[482,1596,1597],{"class":805}," cfg",[482,1599,644],{"class":492},[482,1601,1602],{"class":805},"Server",[482,1604,1164],{"class":492},[482,1606,1607],{"class":805}," register",[482,1609,1164],{"class":492},[482,1611,1582],{"class":805},[482,1613,644],{"class":492},[482,1615,1616],{"class":518},"WithValidator",[482,1618,522],{"class":492},[482,1620,1467],{"class":805},[482,1622,1623],{"class":492},"))\n",[448,1625,1626,1627,1630,1631,1633,1634,1636,1637,1639,1640,1643],{},"Ezután a ",[452,1628,1629],{},"validate:\"slug\""," tag mindenhol működik: a ",[452,1632,844],{}," middleware-ben és a kézi ",[452,1635,715],{}," hívásokban is. Saját tag üzenete a ",[452,1638,723],{}," fallback-formáját kapja (",[452,1641,1642],{},"failed rule slug","); ha szebb kell, a kliens oldalon rendeld hozzá.",[502,1645,1647],{"id":1646},"mezőnevek-testreszabása","Mezőnevek testreszabása",[448,1649,1650,1651,1654,1655,1658],{},"A default json-tag-alapú nevezés a ",[452,1652,1653],{},"WithTagNameFunc","-kal cserélhető, például ha a hibákban a ",[452,1656,1657],{},"form"," taget akarod látni:",[473,1660,1662],{"className":475,"code":1661,"language":477,"meta":478,"style":478},"v := validate.New(validate.WithTagNameFunc(func(field reflect.StructField) string {\n    name, _, _ := strings.Cut(field.Tag.Get(\"form\"), \",\")\n    return name\n}))\n",[452,1663,1664,1703,1762,1770],{"__ignoreMap":478},[482,1665,1666,1668,1670,1672,1674,1676,1678,1680,1682,1684,1686,1688,1691,1693,1696,1698,1701],{"class":484,"line":485},[482,1667,559],{"class":805},[482,1669,1447],{"class":492},[482,1671,1390],{"class":805},[482,1673,644],{"class":492},[482,1675,665],{"class":518},[482,1677,522],{"class":492},[482,1679,466],{"class":805},[482,1681,644],{"class":492},[482,1683,1653],{"class":518},[482,1685,1464],{"class":492},[482,1687,1151],{"class":525},[482,1689,1690],{"class":496}," reflect",[482,1692,644],{"class":492},[482,1694,1695],{"class":496},"StructField",[482,1697,535],{"class":492},[482,1699,1700],{"class":583}," string",[482,1702,952],{"class":492},[482,1704,1705,1708,1710,1713,1715,1718,1720,1723,1725,1728,1730,1732,1734,1737,1739,1742,1744,1746,1748,1750,1753,1755,1757,1759],{"class":484,"line":544},[482,1706,1707],{"class":805},"    name",[482,1709,1164],{"class":492},[482,1711,1712],{"class":805}," _",[482,1714,1164],{"class":492},[482,1716,1717],{"class":805}," _ ",[482,1719,1447],{"class":492},[482,1721,1722],{"class":805}," strings",[482,1724,644],{"class":492},[482,1726,1727],{"class":518},"Cut",[482,1729,522],{"class":492},[482,1731,1151],{"class":805},[482,1733,644],{"class":492},[482,1735,1736],{"class":805},"Tag",[482,1738,644],{"class":492},[482,1740,1741],{"class":518},"Get",[482,1743,522],{"class":492},[482,1745,1036],{"class":492},[482,1747,1657],{"class":966},[482,1749,1036],{"class":492},[482,1751,1752],{"class":492},"),",[482,1754,493],{"class":492},[482,1756,1164],{"class":966},[482,1758,1036],{"class":492},[482,1760,1761],{"class":492},")\n",[482,1763,1764,1767],{"class":484,"line":551},[482,1765,1766],{"class":488},"    return",[482,1768,1769],{"class":805}," name\n",[482,1771,1772],{"class":484,"line":591},[482,1773,1568],{"class":492},[502,1775,1777],{"id":1776},"a-binding-pipeline-on-kívül","A binding pipeline-on kívül",[448,1779,662,1780,1782,1783,1786],{},[452,1781,715],{}," ugyanazt a hibaformát adja bárhol, service-input, ",[457,1784,1785],{"href":229},"konfiguráció"," vagy worker-payload ellenőrzésére:",[473,1788,1790],{"className":475,"code":1789,"language":477,"meta":478,"style":478},"if err := v.Struct(input); err != nil {\n    return err \u002F\u002F már *httperr.Problem (422), a handler-lánc kész renderelni\n}\n",[452,1791,1792,1826,1835],{"__ignoreMap":478},[482,1793,1794,1797,1800,1802,1804,1806,1808,1810,1813,1816,1818,1821,1824],{"class":484,"line":485},[482,1795,1796],{"class":488},"if",[482,1798,1799],{"class":805}," err ",[482,1801,1447],{"class":492},[482,1803,1491],{"class":805},[482,1805,644],{"class":492},[482,1807,715],{"class":518},[482,1809,522],{"class":492},[482,1811,1812],{"class":805},"input",[482,1814,1815],{"class":492},");",[482,1817,1799],{"class":805},[482,1819,1820],{"class":492},"!=",[482,1822,1823],{"class":492}," nil",[482,1825,952],{"class":492},[482,1827,1828,1830,1832],{"class":484,"line":544},[482,1829,1766],{"class":488},[482,1831,1799],{"class":805},[482,1833,1834],{"class":587},"\u002F\u002F már *httperr.Problem (422), a handler-lánc kész renderelni\n",[482,1836,1837],{"class":484,"line":551},[482,1838,1005],{"class":492},[448,1840,1841,1842,1845,1846,1848],{},"Nyers ",[452,1843,1844],{},"validator.ValidationErrors","-t (pl. egy közvetlenül használt validator-instance-ból) a ",[452,1847,723],{},"-tel fordítasz ugyanerre a mezőhiba-formára.",[502,1850,1852],{"id":1851},"amit-a-struct-tagek-nem-fednek-le","Amit a struct-tagek nem fednek le",[448,1854,662,1855,1857,1858,1860,1861,1864,1865,1869,1870,1873],{},[452,1856,466],{}," struct-tagek (",[452,1859,1420],{},") a szintaktikai\u002Fformai szabályokat fedik le. Az adatbázist érintő ellenőrzések (például egyediség) ",[674,1862,1863],{},"nem"," tagként élnek: azok a service rétegbe mennek, ",[457,1866,1867],{"href":225},[452,1868,358],{}," hibaként jelentkeznek. Az authorizáció külön kérdés, azt a ",[457,1871,1872],{"href":99},"policy réteg"," kezeli, nem egy validációs tag.",[502,1875,1877],{"id":1876},"a-kittel","A kittel",[448,1879,662,1880,1882,1883,1885,1886,1888,1889,1891],{},[452,1881,786],{}," (lásd ",[457,1884,911],{"href":783},") pontosan a fent leírt ",[452,1887,790],{},"-t csomagolja: magán a validátoron semmi nem változik attól, hogy egy generált projektben fut-e vagy egy kézzel írt ",[452,1890,763],{}," handlerben, csak a hívás helye.",[502,1893,1895],{"id":1894},"használt-patternek","Használt patternek",[668,1897,1898,1910],{},[671,1899,1900,556,1903,1906,1907,644],{},[674,1901,1902],{},"Functional options közvetlenül a becsomagolt típuson",[452,1904,1905],{},"Option func(*validator.Validate)","): ",[457,1908,238],{"href":1909},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#functional-options",[671,1911,1912,556,1915,1917,1918,1920,1921,1923],{},[674,1913,1914],{},"Adapter + fordítási réteg",[452,1916,723],{},": ",[452,1919,1844],{}," → ",[452,1922,727],{},") a validációs library és a drót-formátum közt.",[502,1925,1927],{"id":1926},"kapcsolódó-oldalak","Kapcsolódó oldalak",[668,1929,1930,1943,1951,1960],{},[671,1931,1932,1935,1936,712,1939,1942],{},[457,1933,1934],{"href":392},"httperr: Áttekintés",": a ",[452,1937,1938],{},"Problem",[452,1940,1941],{},"FieldError"," forma, amit ez az oldal termel.",[671,1944,1945,1947,1948,1950],{},[457,1946,395],{"href":396},": a mapping-sor, ami egy validációs ",[452,1949,1938],{},"-et olvas.",[671,1952,1953,1917,1955,734,1957,1959],{},[457,1954,258],{"href":259},[452,1956,844],{},[452,1958,1616],{},", és hogy a validáció hol ül a middleware-láncban.",[671,1961,1962,1964],{},[457,1963,98],{"href":99},": az authorizáció, a réteg, amit a validáció szándékosan nem fed le.",[1966,1967,1968],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":478,"searchDepth":544,"depth":544,"links":1970},[1971,1972,1973,1974,1975,1976,1977,1978,1979,1980],{"id":504,"depth":544,"text":505},{"id":757,"depth":544,"text":758},{"id":929,"depth":544,"text":930},{"id":1424,"depth":544,"text":1425},{"id":1646,"depth":544,"text":1647},{"id":1776,"depth":544,"text":1777},{"id":1851,"depth":544,"text":1852},{"id":1876,"depth":544,"text":1877},{"id":1894,"depth":544,"text":1895},{"id":1926,"depth":544,"text":1927},"Struct-tag-alapú kérés-validáció go-playground\u002Fvalidatorral, strict middleware-ként futtatva, 422 problem-válaszokkal.","md",null,{},{"icon":403},{"title":400,"description":1981},"GmHfkh1bBp7Q77rs-2S1ba-wShA2zYNPbF5MqpeF3-M",[1989,1991],{"title":395,"path":396,"stem":397,"description":1990,"icon":398,"children":-1},"A httperr csomag, RFC 9457 problem+json minden hibára, egyetlen központi mappinggel.",{"title":52,"path":411,"stem":412,"description":1992,"icon":406,"children":-1},"A dbx modul, az adatbázis-agnosztikus kontrakt, amitől a kódod függ, és a két implementáció, amit importtal választasz.",1785445885050]