docs/ai-agent-guides/smarterr.md
AI and Human Contributors: Follow these exact patterns to migrate Terraform AWS Provider error handling to smarterr/smerr.
smerr (provider wrapper) for all diagnostic callssmarterr only for bare error returns| Legacy | Replace With |
|---|---|
sdkdiag.AppendFromErr(diags, err) | smerr.Append(ctx, diags, err) |
sdkdiag.AppendErrorf(diags, "msg", err) | smerr.Append(ctx, diags, err, smerr.ID, id) |
response.Diagnostics.AddError("msg", err.Error()) | smerr.AddError(ctx, &response.Diagnostics, err) |
create.AppendDiagError(diags, ..., err) | smerr.Append(ctx, diags, err, smerr.ID, id) |
// Before
return nil, err
// After
return nil, smarterr.NewError(err)
// Before
return tfresource.AssertSingleValueResult(...)
// After
return smarterr.Assert(tfresource.AssertSingleValueResult(...))
Framework:
// Before: resp.Diagnostics.Append(...)
// After: smerr.AddEnrich(ctx, &resp.Diagnostics, ...)
SDKv2:
// Before: return append(diags, someFunc()...)
// After: return smerr.AppendEnrich(ctx, diags, someFunc())
Framework (Add verbs):
smerr.AddError(ctx, &response.Diagnostics, err, smerr.ID, id)smerr.AddEnrich(ctx, &response.Diagnostics, diagnosticFunc())SDKv2 (Append verbs):
smerr.Append(ctx, diags, err, smerr.ID, id)smerr.AppendEnrich(ctx, diags, diagnosticFunc())Both contexts:
smarterr.NewError(err) - Wrap bare returnssmarterr.Assert(tfresource.AssertSingleValueResult(...)) - Wrap helpersctx firstsmerr.ID, resourceID when available (e.g., d.Id(), state.Name.String())@FrameworkResource, uses terraform-plugin-framework@SDKResource, uses terraform-plugin-sdk/v2, returns *schema.ResourceApply these patterns exactly. No schema or logic changes.