| // Copyright (c) The OpenTofu Authors | |
| // SPDX-License-Identifier: MPL-2.0 | |
| // Copyright (c) 2023 HashiCorp, Inc. | |
| // SPDX-License-Identifier: MPL-2.0 | |
| package method | |
| import ( | |
| "fmt" | |
| "regexp" | |
| "github.com/hashicorp/hcl/v2" | |
| ) | |
| // TODO is there a generalized way to regexp-check names? | |
| var addrRe = regexp.MustCompile(`^method\.([a-zA-Z_0-9-]+)\.([a-zA-Z_0-9-]+)$`) | |
| var nameRe = regexp.MustCompile("^([a-zA-Z_0-9-]+)$") | |
| var idRe = regexp.MustCompile("^([a-zA-Z_0-9-]+)$") | |
| // Addr is a type-alias for method address strings that identify a specific encryption method configuration. | |
| // The Addr is an opaque value. Do not perform string manipulation on it outside the functions supplied by the | |
| // method package. | |
| type Addr string | |
| // Validate validates the Addr for formal naming conformance, but does not check if the referenced method actually | |
| // exists in the configuration. | |
| func (a Addr) Validate() hcl.Diagnostics { | |
| if !addrRe.MatchString(string(a)) { | |
| return hcl.Diagnostics{ | |
| &hcl.Diagnostic{ | |
| Severity: hcl.DiagError, | |
| Summary: "Invalid encryption method address", | |
| Detail: fmt.Sprintf( | |
| "The supplied encryption method address does not match the required form of %s", | |
| addrRe.String(), | |
| ), | |
| }, | |
| } | |
| } | |
| return nil | |
| } | |
| // NewAddr creates a new Addr type from the provider and name supplied. The Addr is a type-alias for encryption method | |
| // address strings that identify a specific encryption method configuration. You should treat the value as opaque and | |
| // not perform string manipulation on it outside the functions supplied by the method package. | |
| func NewAddr(method string, name string) (addr Addr, err hcl.Diagnostics) { | |
| if !nameRe.MatchString(method) { | |
| err = err.Append( | |
| &hcl.Diagnostic{ | |
| Severity: hcl.DiagError, | |
| Summary: "The provided encryption method type is invalid", | |
| Detail: fmt.Sprintf( | |
| "The supplied encryption method type (%s) does not match the required form of %s.", | |
| method, | |
| nameRe.String(), | |
| ), | |
| }, | |
| ) | |
| } | |
| if !nameRe.MatchString(name) { | |
| err = err.Append( | |
| &hcl.Diagnostic{ | |
| Severity: hcl.DiagError, | |
| Summary: "The provided encryption method name is invalid", | |
| Detail: fmt.Sprintf( | |
| "The supplied encryption method name (%s) does not match the required form of %s.", | |
| name, | |
| nameRe.String(), | |
| ), | |
| }, | |
| ) | |
| } | |
| return Addr(fmt.Sprintf("method.%s.%s", method, name)), err | |
| } |