in assets/policyDefinition.go [38:63]
func (pd *PolicyDefinition) RoleDefinitionResourceIds() ([]string, error) {
if pd == nil || pd.Properties == nil || pd.Properties.PolicyRule == nil {
return nil, errors.New("PolicyDefinition.RoleDefinitionResourceIds: policy definition is nil, missing properties or policy rule")
}
j, err := json.Marshal(pd.Properties.PolicyRule)
if err != nil {
return nil, fmt.Errorf("PolicyDefinition.RoleDefinitionResourceIds: could not marshal policy rule: %w", err)
}
r := new(policyDefinitionRule)
if err := json.Unmarshal(j, r); err != nil {
// For append policies, the `then.details` field is an array, so we need to handle this case.
// There are no roleDefinitionIds here anyway, so we can just return an empty slice.
// This explains why the PolicyRule field if of type any.
jsonerr := new(json.UnmarshalTypeError)
if errors.As(err, &jsonerr) {
if jsonerr.Value == "array" && jsonerr.Field == "then.details" {
return []string{}, nil
}
}
return nil, fmt.Errorf("PolicyDefinition.RoleDefinitionResourceIds: could not unmarshal policy rule: %w", err)
}
if r.Then.Details == nil || r.Then.Details.RoleDefinitionIds == nil || len(r.Then.Details.RoleDefinitionIds) == 0 {
return []string{}, nil
}
return r.Then.Details.RoleDefinitionIds, nil
}