[{"data":1,"prerenderedAt":1351},["ShallowReactive",2],{"navigation_docs_en":3,"-en-errs-overview":441,"-en-errs-overview-surround":1346},[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":1339,"extension":1340,"links":1341,"meta":1342,"navigation":1343,"path":362,"seo":1344,"stem":363,"__hash__":1345},"docs_en\u002Fen\u002F5.errs\u002F1.overview.md",{"type":444,"value":445,"toc":1332},"minimark",[446,475,480,519,539,543,549,574,603,607,623,675,687,691,694,1287,1291,1328],[447,448,449,452,453,456,457,461,462,465,466,471,472,474],"p",{},[450,451,357],"code",{}," is a standalone, stdlib-only Go module (",[450,454,455],{},"github.com\u002Fgp-system\u002Ferrs","): errors that carry a stack trace, a machine-readable code and a client-safe public message, alongside the usual wrapped internal message. It has ",[458,459,460],"strong",{},"zero third-party dependencies",", works in any Go program (a CLI, a Lambda, a plain ",[450,463,464],{},"net\u002Fhttp"," service), and needs no other gp-system module to be useful. The gpsystem kit uses it for exactly one reason: it's the error type every service, repository and handler in a generated project builds and wraps, and it's the type ",[467,468,469],"a",{"href":391},[450,470,385],{}," renders to HTTP. See ",[467,473,224],{"href":225}," for how the two fit together across a whole request.",[476,477,479],"h2",{"id":478},"install","Install",[481,482,487],"pre",{"className":483,"code":484,"language":485,"meta":486,"style":486},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com\u002Fgp-system\u002Ferrs@v0.1.0 # the kit itself uses this tag\ngo get github.com\u002Fgp-system\u002Ferrs@latest\n","sh","",[450,488,489,509],{"__ignoreMap":486},[490,491,494,498,502,505],"span",{"class":492,"line":493},"line",1,[490,495,497],{"class":496},"sBMFI","go",[490,499,501],{"class":500},"sfazB"," get",[490,503,504],{"class":500}," github.com\u002Fgp-system\u002Ferrs@v0.1.0",[490,506,508],{"class":507},"sHwdD"," # the kit itself uses this tag\n",[490,510,512,514,516],{"class":492,"line":511},2,[490,513,497],{"class":496},[490,515,501],{"class":500},[490,517,518],{"class":500}," github.com\u002Fgp-system\u002Ferrs@latest\n",[447,520,521,522,524,525,528,529,528,532,528,535,538],{},"Go 1.25+, and nothing else: ",[450,523,357],{}," imports only the standard library (",[450,526,527],{},"errors",", ",[450,530,531],{},"fmt",[450,533,534],{},"runtime",[450,536,537],{},"log\u002Fslog","). Adding it to a project pulls in no transitive dependency at all.",[476,540,542],{"id":541},"why-two-messages","Why two messages",[447,544,545,546,548],{},"Every error ",[450,547,357],{}," builds carries two texts, deliberately kept apart:",[550,551,552,564],"ul",{},[553,554,555,556,559,560,563],"li",{},"the ",[458,557,558],{},"internal message"," (",[450,561,562],{},"Error()","): the full detail, meant for you. It includes the wrap chain, so a failing query, a product ID, a downstream timeout, all show up here.",[553,565,555,566,569,570,573],{},[458,567,568],{},"public message"," (set with the ",[450,571,572],{},"Public"," attribute): the only text a client is ever allowed to see. When none is set, there simply isn't one to leak; nothing falls back to the internal message.",[447,575,576,577,580,581,585,586,588,589,592,593,595,596,599,600,602],{},"Keeping the two separate means a stray ",[450,578,579],{},"err.Error()"," written into a response can never leak internals: whatever renders the error (the ",[467,582,584],{"href":583},"\u002Fen\u002Ferrs\u002Fintegration#a-minimal-net-http-mapper","minimal mapper"," below, or ",[450,587,385],{},") reads ",[450,590,591],{},"errs.PublicOf",", never ",[450,594,562],{},". The status code travels the same way: it is set on the error at the point it's defined, not decided later in a handler's ",[450,597,598],{},"if"," branch. An ",[450,601,357],{}," error is, in this sense, a small API contract in itself: code, public message and status together describe one failure mode, independent of whatever eventually renders it.",[476,604,606],{"id":605},"what-rendering-you-still-need","What rendering you still need",[447,608,609,611,612,615,616,615,619,622],{},[450,610,357],{}," builds and carries the error. It does not know what an HTTP response, a JSON body or a log line looks like: rendering is a separate concern, left to the layer on top, which turns ",[450,613,614],{},"errs.CodeOf","\u002F",[450,617,618],{},"PublicOf",[450,620,621],{},"StatusOf"," into bytes on the wire.",[624,625,626,639],"table",{},[627,628,629],"thead",{},[630,631,632,636],"tr",{},[633,634,635],"th",{},"Layer",[633,637,638],{},"Responsibility",[640,641,642,652,667],"tbody",{},[630,643,644,649],{},[645,646,647],"td",{},[450,648,357],{},[645,650,651],{},"builds and wraps the error: stack, code, public message, status",[630,653,654,660],{},[645,655,656],{},[467,657,658],{"href":391},[450,659,385],{},[645,661,662,663,666],{},"renders it to an RFC 9457 ",[450,664,665],{},"problem+json"," HTTP response",[630,668,669,672],{},[645,670,671],{},"your own code",[645,673,674],{},"anything else: a gRPC status, a CLI exit code, a queue-message envelope",[447,676,677,678,680,681,683,684,686],{},"If you're not on HTTP, or don't want the extra dependency, ",[467,679,369],{"href":583}," shows a mapper small enough to write yourself, with ",[450,682,357],{}," alone, no ",[450,685,385],{},".",[476,688,690],{"id":689},"standalone-example","Standalone example",[447,692,693],{},"A plain Go program, no HTTP, no kit:",[481,695,699],{"className":696,"code":697,"filename":698,"language":497,"meta":486,"style":486},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"errors\"\n    \"fmt\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fgp-system\u002Ferrs\"\n)\n\nvar ErrOutOfStock = errs.Define(\"out_of_stock\",\n    errs.Public(\"The product is out of stock.\"),\n    errs.Status(http.StatusConflict))\n\nfunc decrementStock(productID string, qty int) error {\n    if qty > 3 {\n        return ErrOutOfStock.New(\"decrement stock\",\n            errs.With(\"product_id\", productID))\n    }\n    return nil\n}\n\nfunc placeOrder(productID string) error {\n    if err := decrementStock(productID, 5); err != nil {\n        if errors.Is(err, ErrOutOfStock) {\n            return err \u002F\u002F expected: pass through unchanged\n        }\n        return errs.Wrap(err, \"place order\")\n    }\n    return nil\n}\n\nfunc main() {\n    err := placeOrder(\"prod_42\")\n    fmt.Println(err)                \u002F\u002F internal message, for you\n    fmt.Println(errs.PublicOf(err)) \u002F\u002F \"The product is out of stock.\", safe for a client\n    fmt.Println(errs.StatusOf(err)) \u002F\u002F 409\n    fmt.Println(errs.CodeOf(err))   \u002F\u002F \"out_of_stock\"\n}\n","main.go",[450,700,701,710,716,726,737,746,755,760,769,775,780,816,838,861,866,903,921,946,973,979,988,994,999,1019,1054,1081,1092,1098,1126,1131,1138,1143,1148,1161,1182,1202,1229,1255,1282],{"__ignoreMap":486},[490,702,703,707],{"class":492,"line":493},[490,704,706],{"class":705},"sMK4o","package",[490,708,709],{"class":496}," main\n",[490,711,712],{"class":492,"line":511},[490,713,715],{"emptyLinePlaceholder":714},true,"\n",[490,717,719,723],{"class":492,"line":718},3,[490,720,722],{"class":721},"s7zQu","import",[490,724,725],{"class":705}," (\n",[490,727,729,732,734],{"class":492,"line":728},4,[490,730,731],{"class":705},"    \"",[490,733,527],{"class":496},[490,735,736],{"class":705},"\"\n",[490,738,740,742,744],{"class":492,"line":739},5,[490,741,731],{"class":705},[490,743,531],{"class":496},[490,745,736],{"class":705},[490,747,749,751,753],{"class":492,"line":748},6,[490,750,731],{"class":705},[490,752,464],{"class":496},[490,754,736],{"class":705},[490,756,758],{"class":492,"line":757},7,[490,759,715],{"emptyLinePlaceholder":714},[490,761,763,765,767],{"class":492,"line":762},8,[490,764,731],{"class":705},[490,766,455],{"class":496},[490,768,736],{"class":705},[490,770,772],{"class":492,"line":771},9,[490,773,774],{"class":705},")\n",[490,776,778],{"class":492,"line":777},10,[490,779,715],{"emptyLinePlaceholder":714},[490,781,783,786,790,793,796,798,802,805,808,811,813],{"class":492,"line":782},11,[490,784,785],{"class":705},"var",[490,787,789],{"class":788},"sTEyZ"," ErrOutOfStock ",[490,791,792],{"class":705},"=",[490,794,795],{"class":788}," errs",[490,797,686],{"class":705},[490,799,801],{"class":800},"s2Zo4","Define",[490,803,804],{"class":705},"(",[490,806,807],{"class":705},"\"",[490,809,810],{"class":500},"out_of_stock",[490,812,807],{"class":705},[490,814,815],{"class":705},",\n",[490,817,819,822,824,826,828,830,833,835],{"class":492,"line":818},12,[490,820,821],{"class":788},"    errs",[490,823,686],{"class":705},[490,825,572],{"class":800},[490,827,804],{"class":705},[490,829,807],{"class":705},[490,831,832],{"class":500},"The product is out of stock.",[490,834,807],{"class":705},[490,836,837],{"class":705},"),\n",[490,839,841,843,845,848,850,853,855,858],{"class":492,"line":840},13,[490,842,821],{"class":788},[490,844,686],{"class":705},[490,846,847],{"class":800},"Status",[490,849,804],{"class":705},[490,851,852],{"class":788},"http",[490,854,686],{"class":705},[490,856,857],{"class":788},"StatusConflict",[490,859,860],{"class":705},"))\n",[490,862,864],{"class":492,"line":863},14,[490,865,715],{"emptyLinePlaceholder":714},[490,867,869,872,875,877,881,885,888,891,894,897,900],{"class":492,"line":868},15,[490,870,871],{"class":705},"func",[490,873,874],{"class":800}," decrementStock",[490,876,804],{"class":705},[490,878,880],{"class":879},"sHdIc","productID",[490,882,884],{"class":883},"spNyl"," string",[490,886,887],{"class":705},",",[490,889,890],{"class":879}," qty",[490,892,893],{"class":883}," int",[490,895,896],{"class":705},")",[490,898,899],{"class":883}," error",[490,901,902],{"class":705}," {\n",[490,904,906,909,912,915,919],{"class":492,"line":905},16,[490,907,908],{"class":721},"    if",[490,910,911],{"class":788}," qty ",[490,913,914],{"class":705},">",[490,916,918],{"class":917},"sbssI"," 3",[490,920,902],{"class":705},[490,922,924,927,930,932,935,937,939,942,944],{"class":492,"line":923},17,[490,925,926],{"class":721},"        return",[490,928,929],{"class":788}," ErrOutOfStock",[490,931,686],{"class":705},[490,933,934],{"class":800},"New",[490,936,804],{"class":705},[490,938,807],{"class":705},[490,940,941],{"class":500},"decrement stock",[490,943,807],{"class":705},[490,945,815],{"class":705},[490,947,949,952,954,957,959,961,964,966,968,971],{"class":492,"line":948},18,[490,950,951],{"class":788},"            errs",[490,953,686],{"class":705},[490,955,956],{"class":800},"With",[490,958,804],{"class":705},[490,960,807],{"class":705},[490,962,963],{"class":500},"product_id",[490,965,807],{"class":705},[490,967,887],{"class":705},[490,969,970],{"class":788}," productID",[490,972,860],{"class":705},[490,974,976],{"class":492,"line":975},19,[490,977,978],{"class":705},"    }\n",[490,980,982,985],{"class":492,"line":981},20,[490,983,984],{"class":721},"    return",[490,986,987],{"class":705}," nil\n",[490,989,991],{"class":492,"line":990},21,[490,992,993],{"class":705},"}\n",[490,995,997],{"class":492,"line":996},22,[490,998,715],{"emptyLinePlaceholder":714},[490,1000,1002,1004,1007,1009,1011,1013,1015,1017],{"class":492,"line":1001},23,[490,1003,871],{"class":705},[490,1005,1006],{"class":800}," placeOrder",[490,1008,804],{"class":705},[490,1010,880],{"class":879},[490,1012,884],{"class":883},[490,1014,896],{"class":705},[490,1016,899],{"class":883},[490,1018,902],{"class":705},[490,1020,1022,1024,1027,1030,1032,1034,1036,1038,1041,1044,1046,1049,1052],{"class":492,"line":1021},24,[490,1023,908],{"class":721},[490,1025,1026],{"class":788}," err ",[490,1028,1029],{"class":705},":=",[490,1031,874],{"class":800},[490,1033,804],{"class":705},[490,1035,880],{"class":788},[490,1037,887],{"class":705},[490,1039,1040],{"class":917}," 5",[490,1042,1043],{"class":705},");",[490,1045,1026],{"class":788},[490,1047,1048],{"class":705},"!=",[490,1050,1051],{"class":705}," nil",[490,1053,902],{"class":705},[490,1055,1057,1060,1063,1065,1068,1070,1073,1075,1077,1079],{"class":492,"line":1056},25,[490,1058,1059],{"class":721},"        if",[490,1061,1062],{"class":788}," errors",[490,1064,686],{"class":705},[490,1066,1067],{"class":800},"Is",[490,1069,804],{"class":705},[490,1071,1072],{"class":788},"err",[490,1074,887],{"class":705},[490,1076,929],{"class":788},[490,1078,896],{"class":705},[490,1080,902],{"class":705},[490,1082,1084,1087,1089],{"class":492,"line":1083},26,[490,1085,1086],{"class":721},"            return",[490,1088,1026],{"class":788},[490,1090,1091],{"class":507},"\u002F\u002F expected: pass through unchanged\n",[490,1093,1095],{"class":492,"line":1094},27,[490,1096,1097],{"class":705},"        }\n",[490,1099,1101,1103,1105,1107,1110,1112,1114,1116,1119,1122,1124],{"class":492,"line":1100},28,[490,1102,926],{"class":721},[490,1104,795],{"class":788},[490,1106,686],{"class":705},[490,1108,1109],{"class":800},"Wrap",[490,1111,804],{"class":705},[490,1113,1072],{"class":788},[490,1115,887],{"class":705},[490,1117,1118],{"class":705}," \"",[490,1120,1121],{"class":500},"place order",[490,1123,807],{"class":705},[490,1125,774],{"class":705},[490,1127,1129],{"class":492,"line":1128},29,[490,1130,978],{"class":705},[490,1132,1134,1136],{"class":492,"line":1133},30,[490,1135,984],{"class":721},[490,1137,987],{"class":705},[490,1139,1141],{"class":492,"line":1140},31,[490,1142,993],{"class":705},[490,1144,1146],{"class":492,"line":1145},32,[490,1147,715],{"emptyLinePlaceholder":714},[490,1149,1151,1153,1156,1159],{"class":492,"line":1150},33,[490,1152,871],{"class":705},[490,1154,1155],{"class":800}," main",[490,1157,1158],{"class":705},"()",[490,1160,902],{"class":705},[490,1162,1164,1167,1169,1171,1173,1175,1178,1180],{"class":492,"line":1163},34,[490,1165,1166],{"class":788},"    err ",[490,1168,1029],{"class":705},[490,1170,1006],{"class":800},[490,1172,804],{"class":705},[490,1174,807],{"class":705},[490,1176,1177],{"class":500},"prod_42",[490,1179,807],{"class":705},[490,1181,774],{"class":705},[490,1183,1185,1188,1190,1193,1195,1197,1199],{"class":492,"line":1184},35,[490,1186,1187],{"class":788},"    fmt",[490,1189,686],{"class":705},[490,1191,1192],{"class":800},"Println",[490,1194,804],{"class":705},[490,1196,1072],{"class":788},[490,1198,896],{"class":705},[490,1200,1201],{"class":507},"                \u002F\u002F internal message, for you\n",[490,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1226],{"class":492,"line":1204},36,[490,1206,1187],{"class":788},[490,1208,686],{"class":705},[490,1210,1192],{"class":800},[490,1212,804],{"class":705},[490,1214,357],{"class":788},[490,1216,686],{"class":705},[490,1218,618],{"class":800},[490,1220,804],{"class":705},[490,1222,1072],{"class":788},[490,1224,1225],{"class":705},"))",[490,1227,1228],{"class":507}," \u002F\u002F \"The product is out of stock.\", safe for a client\n",[490,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252],{"class":492,"line":1231},37,[490,1233,1187],{"class":788},[490,1235,686],{"class":705},[490,1237,1192],{"class":800},[490,1239,804],{"class":705},[490,1241,357],{"class":788},[490,1243,686],{"class":705},[490,1245,621],{"class":800},[490,1247,804],{"class":705},[490,1249,1072],{"class":788},[490,1251,1225],{"class":705},[490,1253,1254],{"class":507}," \u002F\u002F 409\n",[490,1256,1258,1260,1262,1264,1266,1268,1270,1273,1275,1277,1279],{"class":492,"line":1257},38,[490,1259,1187],{"class":788},[490,1261,686],{"class":705},[490,1263,1192],{"class":800},[490,1265,804],{"class":705},[490,1267,357],{"class":788},[490,1269,686],{"class":705},[490,1271,1272],{"class":800},"CodeOf",[490,1274,804],{"class":705},[490,1276,1072],{"class":788},[490,1278,1225],{"class":705},[490,1280,1281],{"class":507},"   \u002F\u002F \"out_of_stock\"\n",[490,1283,1285],{"class":492,"line":1284},39,[490,1286,993],{"class":705},[476,1288,1290],{"id":1289},"related-pages","Related pages",[550,1292,1293,1306,1314,1323],{},[553,1294,1295,1298,1299,615,1301,615,1303,1305],{},[467,1296,1297],{"href":366},"errs: API",": the full ",[450,1300,934],{},[450,1302,1109],{},[450,1304,801],{},"\u002Fattributes\u002Faccessors walkthrough.",[553,1307,1308,1311,1312,686],{},[467,1309,1310],{"href":370},"errs: Integration",": logging, Sentry, and a minimal HTTP mapper without ",[450,1313,385],{},[553,1315,1316,1319,1320,1322],{},[467,1317,1318],{"href":391},"httperr: Overview",": the module that renders ",[450,1321,357],{}," errors to HTTP.",[553,1324,1325,1327],{},[467,1326,224],{"href":225},": the whole pipeline, end to end, with a worked example.",[1329,1330,1331],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":486,"searchDepth":511,"depth":511,"links":1333},[1334,1335,1336,1337,1338],{"id":478,"depth":511,"text":479},{"id":541,"depth":511,"text":542},{"id":605,"depth":511,"text":606},{"id":689,"depth":511,"text":690},{"id":1289,"depth":511,"text":1290},"Structured Go errors with stacks, codes and client-safe messages.","md",null,{},{"icon":227},{"title":52,"description":1339},"syDtwr3xQ3Lzcz7IkrooLa8TLbUmeFnIjGi_mKBSz14",[1347,1349],{"title":352,"path":353,"stem":354,"description":1348,"icon":355,"children":-1},"Re-sync the project's codegen templates from the CLI's embedded set.",{"title":365,"path":366,"stem":367,"description":1350,"children":-1},"[object Object]",1785445889991]