[{"data":1,"prerenderedAt":1223},["ShallowReactive",2],{"navigation_docs_en":3,"-en-httperr-overview":441,"-en-httperr-overview-surround":1218},[4,45,60,81,112,129,146,173,197,213,242,279,356,372,384,403,429],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\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","\u002Fen\u002Fqueue","en\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Overview","\u002Fen\u002Fqueue\u002Foverview","en\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Tasks","\u002Fen\u002Fqueue\u002Ftasks","en\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fen\u002Fevents","en\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Events","\u002Fen\u002Fevents\u002Foverview","en\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fen\u002Fevents\u002Foutbox","en\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Scheduling","\u002Fen\u002Fevents\u002Fscheduler","en\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","\u002Fen\u002Fauth","en\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Authentication","\u002Fen\u002Fauth\u002Foverview","en\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fen\u002Fauth\u002Frbac","en\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policies","\u002Fen\u002Fauth\u002Fpolicy","en\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Using auth standalone","\u002Fen\u002Fauth\u002Fstandalone","en\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login with goth, standalone","\u002Fen\u002Fauth\u002Fsocial-standalone","en\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","\u002Fen\u002Fmail","en\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fen\u002Fmail\u002Foverview","en\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fen\u002Fmail\u002Fsmtp","en\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fen\u002Fmail\u002Fmjml","en\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fen\u002Fnotify","en\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fen\u002Fnotify\u002Foverview","en\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database channel","\u002Fen\u002Fnotify\u002Fdatabase","en\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast channel","\u002Fen\u002Fnotify\u002Fbroadcast","en\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fen\u002Fstorage","en\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fen\u002Fstorage\u002Foverview","en\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fen\u002Fstorage\u002Fdisk-api","en\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memory and local disk","\u002Fen\u002Fstorage\u002Flocal","en\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fen\u002Fstorage\u002Fs3","en\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Testing","\u002Fen\u002Fstorage\u002Ftesting","en\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fen\u002Ftelemetry","en\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fen\u002Ftelemetry\u002Foverview","en\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logging","\u002Fen\u002Ftelemetry\u002Flogging","en\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fen\u002Ftelemetry\u002Fopentelemetry","en\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fen\u002Ftelemetry\u002Fsentry","en\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"Kit","i-lucide-box","\u002Fen\u002Fkit","en\u002F3.kit",[248,251,256,261,266,270,275],{"title":52,"path":249,"stem":250,"icon":244},"\u002Fen\u002Fkit\u002Foverview","en\u002F3.kit\u002F1.overview",{"title":252,"path":253,"stem":254,"icon":255},"Application lifecycle","\u002Fen\u002Fkit\u002Fapp","en\u002F3.kit\u002F2.app","i-lucide-power",{"title":257,"path":258,"stem":259,"icon":260},"Server","\u002Fen\u002Fkit\u002Fserver","en\u002F3.kit\u002F3.server","i-lucide-server",{"title":262,"path":263,"stem":264,"icon":265},"Worker","\u002Fen\u002Fkit\u002Fworker","en\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":267,"path":268,"stem":269,"icon":70},"Realtime","\u002Fen\u002Fkit\u002Frealtime","en\u002F3.kit\u002F5.realtime",{"title":271,"path":272,"stem":273,"icon":274},"Migrations","\u002Fen\u002Fkit\u002Fmigrations","en\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":276,"path":277,"stem":278,"icon":111},"Social login","\u002Fen\u002Fkit\u002Fsocial-login","en\u002F3.kit\u002F7.social-login",{"title":280,"icon":281,"path":282,"stem":283,"children":284,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F4.cli",[285,288,293,298,303,308,313,318,323,328,333,337,342,347,351],{"title":52,"path":286,"stem":287,"icon":281},"\u002Fen\u002Fcli\u002Foverview","en\u002F4.cli\u002F1.overview",{"title":289,"path":290,"stem":291,"icon":292},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":294,"path":295,"stem":296,"icon":297},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":299,"path":300,"stem":301,"icon":302},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":304,"path":305,"stem":306,"icon":307},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":309,"path":310,"stem":311,"icon":312},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":314,"path":315,"stem":316,"icon":317},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":319,"path":320,"stem":321,"icon":322},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":324,"path":325,"stem":326,"icon":327},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":329,"path":330,"stem":331,"icon":332},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":334,"path":335,"stem":336,"icon":244},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F4.cli\u002F5.add-core",{"title":338,"path":339,"stem":340,"icon":341},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":343,"path":344,"stem":345,"icon":346},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":348,"path":349,"stem":350,"icon":265},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F4.cli\u002F8.worker-generators",{"title":352,"path":353,"stem":354,"icon":355},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":357,"icon":227,"path":358,"stem":359,"children":360,"page":44},"errs","\u002Fen\u002Ferrs","en\u002F5.errs",[361,364,368],{"title":52,"path":362,"stem":363,"icon":227},"\u002Fen\u002Ferrs\u002Foverview","en\u002F5.errs\u002F1.overview",{"title":365,"path":366,"stem":367},"API","\u002Fen\u002Ferrs\u002Fapi","en\u002F5.errs\u002F2.api",{"title":369,"path":370,"stem":371,"icon":227},"Integration","\u002Fen\u002Ferrs\u002Fintegration","en\u002F5.errs\u002F3.integration",{"title":373,"icon":231,"path":374,"stem":375,"children":376,"page":44},"envconf","\u002Fen\u002Fenvconf","en\u002F6.envconf",[377,380],{"title":52,"path":378,"stem":379,"icon":231},"\u002Fen\u002Fenvconf\u002Foverview","en\u002F6.envconf\u002F1.overview",{"title":381,"path":382,"stem":383},"Recipes","\u002Fen\u002Fenvconf\u002Frecipes","en\u002F6.envconf\u002F2.recipes",{"title":385,"icon":386,"path":387,"stem":388,"children":389,"page":44},"httperr","i-lucide-globe","\u002Fen\u002Fhttperr","en\u002F7.httperr",[390,393,398],{"title":52,"path":391,"stem":392,"icon":386},"\u002Fen\u002Fhttperr\u002Foverview","en\u002F7.httperr\u002F1.overview",{"title":394,"path":395,"stem":396,"icon":397},"Error responses","\u002Fen\u002Fhttperr\u002Ferror-responses","en\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":399,"path":400,"stem":401,"icon":402},"Validation","\u002Fen\u002Fhttperr\u002Fvalidation","en\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":404,"icon":405,"path":406,"stem":407,"children":408,"page":44},"dbx","i-lucide-database","\u002Fen\u002Fdbx","en\u002F8.dbx",[409,412,416,420,425],{"title":52,"path":410,"stem":411,"icon":405},"\u002Fen\u002Fdbx\u002Foverview","en\u002F8.dbx\u002F1.overview",{"title":413,"path":414,"stem":415,"icon":106},"pgx","\u002Fen\u002Fdbx\u002Fpg","en\u002F8.dbx\u002F2.pg",{"title":417,"path":418,"stem":419,"icon":47},"bun","\u002Fen\u002Fdbx\u002Fbunx","en\u002F8.dbx\u002F3.bunx",{"title":421,"path":422,"stem":423,"icon":424},"Transactions","\u002Fen\u002Fdbx\u002Ftransactions","en\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":426,"path":427,"stem":428,"icon":317},"Seeders","\u002Fen\u002Fdbx\u002Fseed","en\u002F8.dbx\u002F5.seed",{"title":430,"icon":55,"path":431,"stem":432,"children":433,"page":44},"paginate","\u002Fen\u002Fpaginate","en\u002F9.paginate",[434,437],{"title":52,"path":435,"stem":436,"icon":55},"\u002Fen\u002Fpaginate\u002Foverview","en\u002F9.paginate\u002F1.overview",{"title":438,"path":439,"stem":440,"icon":19},"Cursor pagination","\u002Fen\u002Fpaginate\u002Fcursor","en\u002F9.paginate\u002F2.cursor",{"id":442,"title":52,"body":443,"description":1211,"extension":1212,"links":1213,"meta":1214,"navigation":1215,"path":391,"seo":1216,"stem":392,"__hash__":1217},"docs_en\u002Fen\u002F7.httperr\u002F1.overview.md",{"type":444,"value":445,"toc":1205},"minimark",[446,495,500,539,559,563,795,813,867,959,963,1124,1150,1154,1201],[447,448,449,452,453,456,457,464,465,468,469,474,475,480,481,484,485,488,489,491,492,494],"p",{},[450,451,385],"code",{}," is a standalone Go module (",[450,454,455],{},"github.com\u002Fgp-system\u002Fhttperr","): the wire-facing side of the gpsystem error model, turning a Go error into an ",[458,459,463],"a",{"href":460,"rel":461},"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9457",[462],"nofollow","RFC 9457"," ",[450,466,467],{},"problem+json"," HTTP response. It depends on ",[458,470,471],{"href":362},[450,472,473],{},"gp-system\u002Ferrs"," (for reading a built error's code, public message and status) and ",[458,476,479],{"href":477,"rel":478},"https:\u002F\u002Fgithub.com\u002Fgo-playground\u002Fvalidator",[462],"go-playground\u002Fvalidator"," (via the ",[450,482,483],{},"httperr\u002Fvalidate"," subpackage, for turning struct-tag validation failures into the same shape). It works with plain ",[450,486,487],{},"net\u002Fhttp",": no framework required. Building the errors it renders is ",[450,490,357],{},"'s job, covered on the ",[458,493,224],{"href":225}," page; this page and the two after it cover rendering.",[496,497,499],"h2",{"id":498},"install","Install",[501,502,507],"pre",{"className":503,"code":504,"language":505,"meta":506,"style":506},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com\u002Fgp-system\u002Fhttperr@v0.1.0 # the kit itself uses this tag\ngo get github.com\u002Fgp-system\u002Fhttperr@latest\n","sh","",[450,508,509,529],{"__ignoreMap":506},[510,511,514,518,522,525],"span",{"class":512,"line":513},"line",1,[510,515,517],{"class":516},"sBMFI","go",[510,519,521],{"class":520},"sfazB"," get",[510,523,524],{"class":520}," github.com\u002Fgp-system\u002Fhttperr@v0.1.0",[510,526,528],{"class":527},"sHwdD"," # the kit itself uses this tag\n",[510,530,532,534,536],{"class":512,"line":531},2,[510,533,517],{"class":516},[510,535,521],{"class":520},[510,537,538],{"class":520}," github.com\u002Fgp-system\u002Fhttperr@latest\n",[447,540,541,542,545,546,549,550,552,553,555,556,558],{},"Go 1.25+. Dependencies: ",[450,543,544],{},"github.com\u002Fgp-system\u002Ferrs"," and ",[450,547,548],{},"github.com\u002Fgo-playground\u002Fvalidator\u002Fv10"," (only pulled in transitively if you import ",[450,551,483],{},"; the base ",[450,554,385],{}," package needs just ",[450,557,357],{},").",[496,560,562],{"id":561},"the-problem-type","The Problem type",[501,564,567],{"className":565,"code":566,"language":517,"meta":506,"style":506},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fhttperr\"\n\ntype Problem struct {\n    Type     string       `json:\"type\"`\n    Title    string       `json:\"title\"`\n    Status   int          `json:\"status\"`\n    Detail   string       `json:\"detail,omitempty\"`\n    Instance string       `json:\"instance,omitempty\"`\n    Code     string       `json:\"code,omitempty\"`\n    Errors   []FieldError `json:\"errors,omitempty\"`\n}\n\ntype FieldError struct {\n    Field   string `json:\"field\"`\n    Rule    string `json:\"rule,omitempty\"`\n    Message string `json:\"message\"`\n}\n",[450,568,569,584,590,605,625,640,657,672,687,702,722,728,733,745,760,775,790],{"__ignoreMap":506},[510,570,571,575,579,581],{"class":512,"line":513},[510,572,574],{"class":573},"s7zQu","import",[510,576,578],{"class":577},"sMK4o"," \"",[510,580,455],{"class":516},[510,582,583],{"class":577},"\"\n",[510,585,586],{"class":512,"line":531},[510,587,589],{"emptyLinePlaceholder":588},true,"\n",[510,591,593,596,599,602],{"class":512,"line":592},3,[510,594,595],{"class":577},"type",[510,597,598],{"class":516}," Problem",[510,600,601],{"class":577}," struct",[510,603,604],{"class":577}," {\n",[510,606,608,612,616,619,622],{"class":512,"line":607},4,[510,609,611],{"class":610},"sTEyZ","    Type     ",[510,613,615],{"class":614},"spNyl","string",[510,617,618],{"class":577},"       `",[510,620,621],{"class":520},"json:\"type\"",[510,623,624],{"class":577},"`\n",[510,626,628,631,633,635,638],{"class":512,"line":627},5,[510,629,630],{"class":610},"    Title    ",[510,632,615],{"class":614},[510,634,618],{"class":577},[510,636,637],{"class":520},"json:\"title\"",[510,639,624],{"class":577},[510,641,643,646,649,652,655],{"class":512,"line":642},6,[510,644,645],{"class":610},"    Status   ",[510,647,648],{"class":614},"int",[510,650,651],{"class":577},"          `",[510,653,654],{"class":520},"json:\"status\"",[510,656,624],{"class":577},[510,658,660,663,665,667,670],{"class":512,"line":659},7,[510,661,662],{"class":610},"    Detail   ",[510,664,615],{"class":614},[510,666,618],{"class":577},[510,668,669],{"class":520},"json:\"detail,omitempty\"",[510,671,624],{"class":577},[510,673,675,678,680,682,685],{"class":512,"line":674},8,[510,676,677],{"class":610},"    Instance ",[510,679,615],{"class":614},[510,681,618],{"class":577},[510,683,684],{"class":520},"json:\"instance,omitempty\"",[510,686,624],{"class":577},[510,688,690,693,695,697,700],{"class":512,"line":689},9,[510,691,692],{"class":610},"    Code     ",[510,694,615],{"class":614},[510,696,618],{"class":577},[510,698,699],{"class":520},"json:\"code,omitempty\"",[510,701,624],{"class":577},[510,703,705,708,711,714,717,720],{"class":512,"line":704},10,[510,706,707],{"class":610},"    Errors   ",[510,709,710],{"class":577},"[]",[510,712,713],{"class":516},"FieldError",[510,715,716],{"class":577}," `",[510,718,719],{"class":520},"json:\"errors,omitempty\"",[510,721,624],{"class":577},[510,723,725],{"class":512,"line":724},11,[510,726,727],{"class":577},"}\n",[510,729,731],{"class":512,"line":730},12,[510,732,589],{"emptyLinePlaceholder":588},[510,734,736,738,741,743],{"class":512,"line":735},13,[510,737,595],{"class":577},[510,739,740],{"class":516}," FieldError",[510,742,601],{"class":577},[510,744,604],{"class":577},[510,746,748,751,753,755,758],{"class":512,"line":747},14,[510,749,750],{"class":610},"    Field   ",[510,752,615],{"class":614},[510,754,716],{"class":577},[510,756,757],{"class":520},"json:\"field\"",[510,759,624],{"class":577},[510,761,763,766,768,770,773],{"class":512,"line":762},15,[510,764,765],{"class":610},"    Rule    ",[510,767,615],{"class":614},[510,769,716],{"class":577},[510,771,772],{"class":520},"json:\"rule,omitempty\"",[510,774,624],{"class":577},[510,776,778,781,783,785,788],{"class":512,"line":777},16,[510,779,780],{"class":610},"    Message ",[510,782,615],{"class":614},[510,784,716],{"class":577},[510,786,787],{"class":520},"json:\"message\"",[510,789,624],{"class":577},[510,791,793],{"class":512,"line":792},17,[510,794,727],{"class":577},[447,796,797,800,801,804,805,808,809,812],{},[450,798,799],{},"Problem"," implements ",[450,802,803],{},"error",", so you can build one and ",[450,806,807],{},"return"," it directly from a handler like any other error; the ",[458,810,811],{"href":395},"next page"," covers how it (and every other error) actually reaches the HTTP response. A worked example, in full:",[501,814,816],{"className":565,"code":815,"language":517,"meta":506,"style":506},"if productID == \"\" {\n    return httperr.BadRequest(\"productId is required\")\n}\n",[450,817,818,834,863],{"__ignoreMap":506},[510,819,820,823,826,829,832],{"class":512,"line":513},[510,821,822],{"class":573},"if",[510,824,825],{"class":610}," productID ",[510,827,828],{"class":577},"==",[510,830,831],{"class":577}," \"\"",[510,833,604],{"class":577},[510,835,836,839,842,845,849,852,855,858,860],{"class":512,"line":531},[510,837,838],{"class":573},"    return",[510,840,841],{"class":610}," httperr",[510,843,844],{"class":577},".",[510,846,848],{"class":847},"s2Zo4","BadRequest",[510,850,851],{"class":577},"(",[510,853,854],{"class":577},"\"",[510,856,857],{"class":520},"productId is required",[510,859,854],{"class":577},[510,861,862],{"class":577},")\n",[510,864,865],{"class":512,"line":592},[510,866,727],{"class":577},[501,868,872],{"className":869,"code":870,"language":871,"meta":506,"style":506},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"type\": \"about:blank\",\n  \"title\": \"Bad Request\",\n  \"status\": 400,\n  \"detail\": \"productId is required\"\n}\n","json",[450,873,874,879,901,921,938,955],{"__ignoreMap":506},[510,875,876],{"class":512,"line":513},[510,877,878],{"class":577},"{\n",[510,880,881,884,886,888,891,893,896,898],{"class":512,"line":531},[510,882,883],{"class":577},"  \"",[510,885,595],{"class":614},[510,887,854],{"class":577},[510,889,890],{"class":577},":",[510,892,578],{"class":577},[510,894,895],{"class":520},"about:blank",[510,897,854],{"class":577},[510,899,900],{"class":577},",\n",[510,902,903,905,908,910,912,914,917,919],{"class":512,"line":592},[510,904,883],{"class":577},[510,906,907],{"class":614},"title",[510,909,854],{"class":577},[510,911,890],{"class":577},[510,913,578],{"class":577},[510,915,916],{"class":520},"Bad Request",[510,918,854],{"class":577},[510,920,900],{"class":577},[510,922,923,925,928,930,932,936],{"class":512,"line":607},[510,924,883],{"class":577},[510,926,927],{"class":614},"status",[510,929,854],{"class":577},[510,931,890],{"class":577},[510,933,935],{"class":934},"sbssI"," 400",[510,937,900],{"class":577},[510,939,940,942,945,947,949,951,953],{"class":512,"line":627},[510,941,883],{"class":577},[510,943,944],{"class":614},"detail",[510,946,854],{"class":577},[510,948,890],{"class":577},[510,950,578],{"class":577},[510,952,857],{"class":520},[510,954,583],{"class":577},[510,956,957],{"class":512,"line":642},[510,958,727],{"class":577},[496,960,962],{"id":961},"constructors","Constructors",[501,964,966],{"className":565,"code":965,"language":517,"meta":506,"style":506},"httperr.New(status, title, detail) \u002F\u002F title defaults to the HTTP status text\nhttperr.BadRequest(detail)         \u002F\u002F 400\nhttperr.Unauthorized(detail)       \u002F\u002F 401\nhttperr.Forbidden(detail)          \u002F\u002F 403\nhttperr.NotFound(detail)           \u002F\u002F 404\nhttperr.Conflict(detail)           \u002F\u002F 409\nhttperr.Internal(detail)           \u002F\u002F 500\nhttperr.Validation(fieldErrs...)   \u002F\u002F 422, with errors[]\n",[450,967,968,998,1015,1033,1051,1069,1087,1105],{"__ignoreMap":506},[510,969,970,972,974,977,979,981,984,987,989,992,995],{"class":512,"line":513},[510,971,385],{"class":610},[510,973,844],{"class":577},[510,975,976],{"class":847},"New",[510,978,851],{"class":577},[510,980,927],{"class":610},[510,982,983],{"class":577},",",[510,985,986],{"class":610}," title",[510,988,983],{"class":577},[510,990,991],{"class":610}," detail",[510,993,994],{"class":577},")",[510,996,997],{"class":527}," \u002F\u002F title defaults to the HTTP status text\n",[510,999,1000,1002,1004,1006,1008,1010,1012],{"class":512,"line":531},[510,1001,385],{"class":610},[510,1003,844],{"class":577},[510,1005,848],{"class":847},[510,1007,851],{"class":577},[510,1009,944],{"class":610},[510,1011,994],{"class":577},[510,1013,1014],{"class":527},"         \u002F\u002F 400\n",[510,1016,1017,1019,1021,1024,1026,1028,1030],{"class":512,"line":592},[510,1018,385],{"class":610},[510,1020,844],{"class":577},[510,1022,1023],{"class":847},"Unauthorized",[510,1025,851],{"class":577},[510,1027,944],{"class":610},[510,1029,994],{"class":577},[510,1031,1032],{"class":527},"       \u002F\u002F 401\n",[510,1034,1035,1037,1039,1042,1044,1046,1048],{"class":512,"line":607},[510,1036,385],{"class":610},[510,1038,844],{"class":577},[510,1040,1041],{"class":847},"Forbidden",[510,1043,851],{"class":577},[510,1045,944],{"class":610},[510,1047,994],{"class":577},[510,1049,1050],{"class":527},"          \u002F\u002F 403\n",[510,1052,1053,1055,1057,1060,1062,1064,1066],{"class":512,"line":627},[510,1054,385],{"class":610},[510,1056,844],{"class":577},[510,1058,1059],{"class":847},"NotFound",[510,1061,851],{"class":577},[510,1063,944],{"class":610},[510,1065,994],{"class":577},[510,1067,1068],{"class":527},"           \u002F\u002F 404\n",[510,1070,1071,1073,1075,1078,1080,1082,1084],{"class":512,"line":642},[510,1072,385],{"class":610},[510,1074,844],{"class":577},[510,1076,1077],{"class":847},"Conflict",[510,1079,851],{"class":577},[510,1081,944],{"class":610},[510,1083,994],{"class":577},[510,1085,1086],{"class":527},"           \u002F\u002F 409\n",[510,1088,1089,1091,1093,1096,1098,1100,1102],{"class":512,"line":659},[510,1090,385],{"class":610},[510,1092,844],{"class":577},[510,1094,1095],{"class":847},"Internal",[510,1097,851],{"class":577},[510,1099,944],{"class":610},[510,1101,994],{"class":577},[510,1103,1104],{"class":527},"           \u002F\u002F 500\n",[510,1106,1107,1109,1111,1113,1115,1118,1121],{"class":512,"line":674},[510,1108,385],{"class":610},[510,1110,844],{"class":577},[510,1112,399],{"class":847},[510,1114,851],{"class":577},[510,1116,1117],{"class":610},"fieldErrs",[510,1119,1120],{"class":577},"...)",[510,1122,1123],{"class":527},"   \u002F\u002F 422, with errors[]\n",[447,1125,1126,1127,1130,1131,1137,1138,1141,1142,1145,1146,1149],{},"These cover quick, anonymous 4xx cases well: ",[450,1128,1129],{},"return httperr.NotFound(\"no such product\")"," in a handler is perfectly fine as-is. As soon as a failure mode has a name, a stable code, or more than one call site, ",[458,1132,1134],{"href":1133},"\u002Fen\u002Ferrs\u002Fapi#errsdefine-named-failure-modes",[450,1135,1136],{},"errs.Define"," is the better home for it: recognition (",[450,1139,1140],{},"errors.Is",") and rendering (status, code, message) then live in one declaration instead of scattered ",[450,1143,1144],{},"httperr.___(...)"," calls, and the ",[458,1147,1148],{"href":395},"mapping"," picks it up the same way.",[496,1151,1153],{"id":1152},"related-pages","Related pages",[1155,1156,1157,1175,1187,1196],"ul",{},[1158,1159,1160,1162,1163,1166,1167,1170,1171,1174],"li",{},[458,1161,394],{"href":395},": ",[450,1164,1165],{},"WriteError","\u002F",[450,1168,1169],{},"NewWriteError",", the full mapping order, and how ",[450,1172,1173],{},"HTTP_EXPOSE_INTERNAL_ERRORS"," fits in.",[1158,1176,1177,1179,1180,1182,1183,1186],{},[458,1178,399],{"href":400},": the ",[450,1181,483],{}," package, ",[450,1184,1185],{},"Translate",", and the 422 response shape.",[1158,1188,1189,1192,1193,1195],{},[458,1190,1191],{"href":362},"errs: Overview",": the module that builds the errors ",[450,1194,385],{}," renders.",[1158,1197,1198,1200],{},[458,1199,224],{"href":225},": the whole request-to-response pipeline.",[1202,1203,1204],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":506,"searchDepth":531,"depth":531,"links":1206},[1207,1208,1209,1210],{"id":498,"depth":531,"text":499},{"id":561,"depth":531,"text":562},{"id":961,"depth":531,"text":962},{"id":1152,"depth":531,"text":1153},"RFC 9457 problem details for HTTP handlers.","md",null,{},{"icon":386},{"title":52,"description":1211},"xUTTb7qfoiSfji9jNPDla2x7lMALIMXsRJVlWwlUhak",[1219,1221],{"title":381,"path":382,"stem":383,"description":1220,"children":-1},"[object Object]",{"title":394,"path":395,"stem":396,"description":1222,"icon":397,"children":-1},"The httperr package, RFC 9457 problem+json for every error, through one central mapping.",1785445890369]