| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package plugin | |
| import ( | |
| "context" | |
| "net/rpc" | |
| "github.com/hashicorp/go-plugin" | |
| "github.com/hashicorp/terraform/internal/terraform" | |
| ) | |
| // UIInput is an implementation of terraform.UIInput that communicates | |
| // over RPC. | |
| type UIInput struct { | |
| Client *rpc.Client | |
| } | |
| func (i *UIInput) Input(ctx context.Context, opts *terraform.InputOpts) (string, error) { | |
| var resp UIInputInputResponse | |
| err := i.Client.Call("Plugin.Input", opts, &resp) | |
| if err != nil { | |
| return "", err | |
| } | |
| if resp.Error != nil { | |
| err = resp.Error | |
| return "", err | |
| } | |
| return resp.Value, nil | |
| } | |
| type UIInputInputResponse struct { | |
| Value string | |
| Error *plugin.BasicError | |
| } | |
| // UIInputServer is a net/rpc compatible structure for serving | |
| // a UIInputServer. This should not be used directly. | |
| type UIInputServer struct { | |
| UIInput terraform.UIInput | |
| } | |
| func (s *UIInputServer) Input( | |
| opts *terraform.InputOpts, | |
| reply *UIInputInputResponse) error { | |
| value, err := s.UIInput.Input(context.Background(), opts) | |
| *reply = UIInputInputResponse{ | |
| Value: value, | |
| Error: plugin.NewBasicError(err), | |
| } | |
| return nil | |
| } |