// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package hooks import ( "context" ) // BeginFunc is the signature of a callback for a hook which begins a // series of related events. // // The given context is guaranteed to preserve the values from whichever // context was passed to the top-level [stackruntime.Plan] or // [stackruntime.Apply] call. // // The hook callback may return any value, and that value will be passed // verbatim to the corresponding [MoreFunc]. A typical use for that // extra arbitrary value would be to begin a tracing span in "Begin" and then // either adding events to or ending that span in "More". // // If a particular "begin" hook isn't implemented but one of its "more" hooks // is implemented then the extra tracking value will always be nil when // the first "more" hook runs. type BeginFunc[Msg any] func(context.Context, Msg) any // MoreFunc is the signature of a callback for a hook which reports // ongoing process or completion of a multi-step process previously reported // using a [HookFuncBegin] callback. // // The given context is guaranteed to preserve the values from whichever // context was passed to the top-level [stackruntime.Plan] or // [stackruntime.Apply] call. // // The hook callback recieves an additional argument which is guaranteed to be // the same value returned from the corresponding [BeginFunc]. See // [BeginFunc]'s documentation for more information. // // If the overall hooks also defines a [ContextAttachFunc] then a context // descended from its result will be passed into the [MoreFunc] for any events // related to the operation previously signalled by [BeginFunc]. // // The hook callback may optionally return a new arbitrary tracking value. If // the return value is non-nil then it replaces the original value for future // hooks belonging to the same context. If it's nil then the previous value // is retained. // // MoreFunc is also sometimes used in isolation for one-shot events, // in which case the extra value will always be nil unless stated otherwise // in a particular hook's documentation. type MoreFunc[Msg any] func(context.Context, any, Msg) any // ContextAttachFunc is the signature of an optional callback that knows // how to bind an arbitrary tracking value previously returned by a [BeginFunc] // to the values of a [context.Context] so that the tracking value can be // made available to downstream operations outside the direct scope of the // stack runtime, such as external HTTP requests. // // Use this if your [BeginFunc]s return something that should be visible to // all context-aware operations within the scope of the operation that was // begun. // // If you use this then your related [MoreFunc] callbacks for the same event // should always return nil, because there is no way to mutate the context // with a new tracking value after the fact. type ContextAttachFunc func(parent context.Context, tracking any) context.Context // SingleFunc is the signature of a callback for a hook which operates in // isolation, and has no related or enclosed events. // // The given context is guaranteed to preserve the values from whichever // context was passed to the top-level [stackruntime.Plan] or // [stackruntime.Apply] call. type SingleFunc[Msg any] func(context.Context, Msg)