| package function |
| |
| import ( |
| "github.com/zclconf/go-cty/cty" |
| ) |
| |
| // Unpredictable wraps a given function such that it retains the same arguments |
| // and type checking behavior but will return an unknown value when called. |
| // |
| // It is recommended that most functions be "pure", which is to say that they |
| // will always produce the same value given particular input. However, |
| // sometimes it is necessary to offer functions whose behavior depends on |
| // some external state, such as reading a file or determining the current time. |
| // In such cases, an unpredictable wrapper might be used to stand in for |
| // the function during some sort of prior "checking" phase in order to delay |
| // the actual effect until later. |
| // |
| // While Unpredictable can support a function that isn't pure in its |
| // implementation, it still expects a function to be pure in its type checking |
| // behavior, except for the special case of returning cty.DynamicPseudoType |
| // if it is not yet able to predict its return value based on current argument |
| // information. |
| func Unpredictable(f Function) Function { |
| newSpec := *f.spec // shallow copy |
| newSpec.Impl = unpredictableImpl |
| return New(&newSpec) |
| } |
| |
| func unpredictableImpl(args []cty.Value, retType cty.Type) (cty.Value, error) { |
| return cty.UnknownVal(retType), nil |
| } |