internal/services/parse/data_plane_resource_id.go (95 lines of code) (raw):

package parse import ( "fmt" "strings" "github.com/Azure/terraform-provider-azapi/utils" ) type DataPlaneResourceId struct { AzureResourceId string ApiVersion string AzureResourceType string Name string ParentId string } func NewDataPlaneResourceId(name, parentId, resourceType string) (DataPlaneResourceId, error) { azureResourceType, apiVersion, err := utils.GetAzureResourceTypeApiVersion(resourceType) if err != nil { return DataPlaneResourceId{}, err } azureResourceId := "" if apiPath := findApiPathByResourceType(azureResourceType); apiPath != nil { parts := strings.Split(apiPath.UrlFormat, "/") for i, part := range parts { switch { case part == "{parentId}": parts[i] = parentId case part == "{name}": parts[i] = name case part == "{apiVersion}": parts[i] = apiVersion case strings.HasPrefix(part, "{name="): defaultName := part[6 : len(part)-1] if !strings.EqualFold(name, defaultName) { return DataPlaneResourceId{}, fmt.Errorf("name %s is not equal to %s", name, defaultName) } parts[i] = defaultName } } azureResourceId = strings.Join(parts, "/") } return DataPlaneResourceId{ AzureResourceId: azureResourceId, ApiVersion: apiVersion, AzureResourceType: azureResourceType, Name: name, ParentId: parentId, }, nil } // DataPlaneResourceIDWithResourceType parses a Resource ID and resource type into an ResourceId struct func DataPlaneResourceIDWithResourceType(azureResourceId, resourceType string) (DataPlaneResourceId, error) { azureResourceType, _, err := utils.GetAzureResourceTypeApiVersion(resourceType) if err != nil { return DataPlaneResourceId{}, err } name := "" parentId := "" if apiPath := findApiPathByResourceType(azureResourceType); apiPath != nil { urlFormatParts := strings.Split(apiPath.UrlFormat, "/") azureResourceIdParts := strings.Split(azureResourceId, "/") j := len(azureResourceIdParts) - 1 for i := len(urlFormatParts) - 1; i >= 0; i-- { if j < 0 { return DataPlaneResourceId{}, fmt.Errorf("index %d is less than 0", j) } switch { case strings.HasPrefix(urlFormatParts[i], "{name"): name = azureResourceIdParts[j] j-- case urlFormatParts[i] == "{parentId}": for j >= 0 { if j > 0 && i > 0 && azureResourceIdParts[j-1] == urlFormatParts[i-1] { break } parentId = azureResourceIdParts[j] + "/" + parentId j-- } case urlFormatParts[i] == "{apiVersion}": j-- case strings.EqualFold(azureResourceIdParts[j], urlFormatParts[i]): j-- } } } parentId = strings.TrimSuffix(parentId, "/") return NewDataPlaneResourceId(name, parentId, resourceType) } func (id DataPlaneResourceId) String() string { segments := []string{ fmt.Sprintf("ResourceId %q", id.AzureResourceId), fmt.Sprintf("Api Version %q", id.ApiVersion), } segmentsStr := strings.Join(segments, " / ") return fmt.Sprintf("%s: (%s)", "Resource", segmentsStr) } func (id DataPlaneResourceId) ID() string { return id.AzureResourceId }