Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
b3435b4
refactor(bedrock): split giant files by op-family (no 'backend' in na…
Jul 16, 2026
491c1d3
refactor(apigateway): split giant files by op-family (no 'backend' in…
Jul 16, 2026
8c2618b
refactor(sts): split by op-family (no 'backend' in names)
Jul 16, 2026
bf14ef4
refactor(stepfunctions): split by op-family (no 'backend' in names)
Jul 16, 2026
4a809b2
refactor(kinesis): split by op-family (no 'backend' in names)
Jul 16, 2026
6834094
refactor(ses): split by op-family (no 'backend' in names)
Jul 16, 2026
fdc4ce3
fix(dynamodb): maintain table size counters on BatchWriteItem (UI sho…
Jul 16, 2026
ccfa725
refactor(secretsmanager): split by op-family (no 'backend' in names)
Jul 16, 2026
130f706
test(s3): lock in cross-region bucket behavior (region-selector inves…
Jul 16, 2026
8a6ac6b
refactor(memorydb): split by op-family (no 'backend' in names)
Jul 16, 2026
dcbfbfc
refactor(eks): split by op-family (no 'backend' in names)
Jul 16, 2026
deac122
refactor(cloudwatch): split by op-family (no 'backend' in names)
Jul 16, 2026
6ea213b
refactor(ecr): split by op-family, consolidate tests (no 'backend' in…
Jul 16, 2026
6216b5a
refactor(kafka): split by op-family (no 'backend' in names)
Jul 16, 2026
d8fdab2
refactor(sqs): split by op-family (no 'backend' in names)
Jul 16, 2026
add3144
refactor(transfer): split by op-family (no 'backend' in names)
Jul 16, 2026
49a99e2
refactor(organizations): split by op-family (no 'backend' in names)
Jul 16, 2026
99e2d03
refactor(neptune): split by op-family (no 'backend' in names)
Jul 16, 2026
ffaf210
refactor(transcribe): split by op-family (no 'backend' in names)
Jul 16, 2026
9c67223
refactor(mwaa): split by op-family (no 'backend' in names)
Jul 17, 2026
5f78e1c
refactor(timestreamwrite): split by op-family (no 'backend' in names)
Jul 17, 2026
89abc1f
refactor(firehose): split by op-family (no 'backend' in names)
Jul 17, 2026
95d0a35
refactor(glacier): split by op-family (no 'backend' in names)
Jul 17, 2026
27f73d8
refactor(ssoadmin): split by op-family (no 'backend' in names)
Jul 17, 2026
82275e4
refactor(xray): split by op-family (no 'backend' in names)
Jul 17, 2026
0281f72
refactor(mediaconvert): split by op-family (no 'backend' in names)
Jul 17, 2026
04dddcd
refactor(textract): split by op-family (no 'backend' in names)
Jul 17, 2026
09a91b8
refactor(mq): split by op-family (no 'backend' in names)
Jul 17, 2026
9737419
refactor(route53resolver): split by op-family (no 'backend' in names)
Jul 17, 2026
bf55310
refactor(ram): split by op-family (no 'backend' in names)
Jul 17, 2026
61a76c5
refactor(route53): split by op-family (no 'backend' in names)
Jul 17, 2026
5ede8bf
refactor(securityhub): split by op-family (no 'backend' in names), dr…
Jul 17, 2026
8c7e59a
refactor(wafv2): split by op-family (no 'backend' in names), drop fun…
Jul 17, 2026
d734937
refactor(appsync): split by op-family (no 'backend' in names)
Jul 17, 2026
2fc3523
refactor(efs): split by op-family (no 'backend' in names)
Jul 17, 2026
13f6898
refactor(elb): split by op-family (no 'backend' in names)
Jul 17, 2026
6c1bad7
refactor(elasticsearch): split by op-family (no 'backend' in names)
Jul 17, 2026
5178a10
refactor(scheduler): split by op-family (no 'backend' in names)
Jul 17, 2026
5e5760a
refactor(pipes): split backend by op-family (no 'backend' in names)
Jul 17, 2026
645b698
refactor(resourcegroupstaggingapi): split by op-family (no 'backend' …
Jul 17, 2026
1d8e064
refactor(support): split by op-family (no 'backend' in names)
Jul 17, 2026
eb45c04
refactor(timestreamquery): split by op-family (no 'backend' in names)
Jul 17, 2026
90e7523
refactor(fsx): split by op-family (no 'backend' in names)
Jul 17, 2026
57f0f87
refactor(athena): split by op-family (no 'backend'/'extra' names)
Jul 17, 2026
57a8e52
refactor(emr): split by op-family (no 'backend' in names)
Jul 17, 2026
826798f
refactor(apigatewayv2): split by op-family (no 'backend' in names)
Jul 17, 2026
a02a3c5
refactor(directoryservice): split by op-family (no 'backend'/'appendi…
Jul 17, 2026
c1aa5b3
refactor(lakeformation): split by op-family (no 'backend'/'comprehens…
Jul 17, 2026
7f24faa
refactor(redshiftdata): split by op-family (no 'backend' in names)
Jul 17, 2026
73917ef
refactor(rekognition): split by op-family (no 'backend'/'appendix' na…
Jul 17, 2026
b21e837
refactor(serverlessrepo): split by op-family (no 'backend' in names)
Jul 17, 2026
73bedbc
refactor(sesv2): split by op-family (no 'backend'/'_ops' names); fix …
Jul 17, 2026
b965f73
refactor(swf): split by op-family (no 'backend' in names)
Jul 17, 2026
675aba7
refactor(iotdataplane): split by op-family (no 'backend'/'iface' names)
Jul 17, 2026
b79b15b
refactor(workspaces): split by op-family (no 'backend'/'appendix' names)
Jul 17, 2026
6438baa
refactor(emrserverless): split by op-family (no 'backend' in names)
Jul 17, 2026
d3b47ec
refactor(codepipeline): split by op-family (no 'backend' in names)
Jul 17, 2026
a186589
refactor(mediatailor): split by op-family (no 'backend' in names)
Jul 17, 2026
5d5eb23
refactor(kinesisanalytics): split by op-family (no 'backend' in names)
Jul 17, 2026
a3d4d9c
refactor(kinesisanalyticsv2): split by op-family (no 'backend' in names)
Jul 17, 2026
2d1277d
refactor(mediapackage): split by op-family (no 'backend' in names)
Jul 17, 2026
cccbd9a
refactor(medialive): split by op-family (no 'backend' in names)
Jul 17, 2026
4b6b4e0
refactor(opensearch): strip 'backend_' prefix from op-family files
Jul 17, 2026
6b5aee2
refactor(mediastoredata): split by op-family (no 'backend' in names)
Jul 17, 2026
882bb57
refactor(mediastore): split by op-family (no 'backend' in names)
Jul 17, 2026
842a102
refactor(cloudfront): strip 'backend_' prefix + split giant test files
Jul 17, 2026
bfae589
refactor(cognitoidp): strip 'backend_' prefix + split giant test files
Jul 17, 2026
1cc685a
refactor(eventbridge): strip 'backend_' prefix from op-family files
Jul 17, 2026
76c7f4e
refactor(cognitoidentity): split by op-family (no 'backend' in names)
Jul 17, 2026
5932e4e
refactor(cloudtrail): split by op-family (no 'backend' in names)
Jul 17, 2026
cf82e65
refactor(cloudwatchlogs): split giant files by op-family + strip goof…
Jul 17, 2026
7af18d5
refactor(ecs): strip 'backend_' prefix + split giant test files
Jul 17, 2026
fba7f85
refactor(guardduty): split by op-family (no 'backend'/'appendix' names)
Jul 17, 2026
a56ab4d
refactor(detective): split by op-family (no 'backend'/'appendix' names)
Jul 17, 2026
01649a1
refactor(inspector2): split by op-family (no 'backend'/'appendix' names)
Jul 17, 2026
e9314fb
refactor(macie2): split by op-family (no 'backend'/'appendix' names)
Jul 17, 2026
9b350d0
refactor(sns): strip 'backend_' prefix from op-family files
Jul 17, 2026
10717f3
refactor(shield): split by op-family (no 'backend' in names)
Jul 17, 2026
690861a
refactor(ssm): strip 'backend_' prefix + split giant test files
Jul 17, 2026
d4d196c
refactor(codebuild): split by op-family (no 'backend' in names)
Jul 17, 2026
baa4d92
refactor(codecommit): split by op-family (no 'backend'/'_ops' names)
Jul 17, 2026
4778cd3
refactor(codeartifact): split by op-family (no 'backend' in names)
Jul 17, 2026
ad20a5e
refactor(codedeploy): split by op-family (no 'backend' in names)
Jul 17, 2026
cea86cd
refactor(codestarconnections): split by op-family (no 'backend' in na…
Jul 17, 2026
117d1ef
refactor(codeconnections): split by op-family (no 'backend' in names)
Jul 17, 2026
2e9ef2e
refactor(elasticache): strip 'backend_' prefix + split giant test file
Jul 17, 2026
ddaffb3
refactor(dms): strip 'backend_' prefix + split giant handler_test.go
Jul 17, 2026
ad11940
refactor(redshift): strip 'backend_' prefix + split giant test files
Jul 17, 2026
805ad87
refactor(docdb): split by op-family (no 'backend' in names)
Jul 17, 2026
d2abaee
refactor(datasync): split by op-family (no 'backend' in names)
Jul 17, 2026
54fc3e2
refactor(dax): split by op-family (no 'backend' in names)
Jul 17, 2026
cb8be33
refactor(batch): split by op-family (no 'backend' in names)
Jul 17, 2026
6d3aef5
refactor(autoscaling): split by op-family (no 'backend' in names)
Jul 17, 2026
da803a3
refactor(elbv2): split by op-family (no 'backend' in names)
Jul 17, 2026
856cd77
refactor(applicationautoscaling): split by op-family (no 'backend' in…
Jul 17, 2026
3c85e35
refactor(elasticbeanstalk): split by op-family (no 'backend' in names)
Jul 17, 2026
6145e85
refactor(appconfig): split by op-family (no 'backend'/'iface' names)
Jul 17, 2026
119e0d0
refactor(kms): strip 'backend_' prefix + split giant test files
Jul 17, 2026
0e0c502
refactor(appconfigdata): split by op-family (no 'backend'/'iface' names)
Jul 17, 2026
9c74283
refactor(backup): strip 'backend_' prefix + eliminate handler_stub_op…
Jul 17, 2026
293e572
refactor(amplify): split by op-family (no 'backend'/'extended' names)
Jul 17, 2026
208c45b
refactor(acm): split by op-family (no 'backend' in names)
Jul 17, 2026
b37f290
refactor(acmpca): split by op-family (no 'backend' in names)
Jul 17, 2026
ace2ca2
refactor(waf): split by op-family (no 'backend' in names)
Jul 17, 2026
0b43d4b
refactor(comprehend): split by op-family (no 'backend' in names)
Jul 17, 2026
8c83893
refactor(quicksight): split by op-family (no 'backend'/'appendix' names)
Jul 17, 2026
5060e54
refactor(pinpoint): split by op-family (no 'backend'/'_ops' names)
Jul 17, 2026
42ff54c
Merge remote-tracking branch 'origin/main' into go-refactoring-2
Jul 18, 2026
ba8aefd
refactor(servicediscovery): split by op-family (no 'backend' in names)
Jul 18, 2026
30e6c26
refactor(appmesh): split by op-family (no 'backend' in names)
Jul 18, 2026
da2b44b
refactor(translate): split by op-family (no 'backend'/'_ops' names)
Jul 18, 2026
edff98b
refactor(personalize): split by op-family (no 'backend' in names)
Jul 18, 2026
ef26958
refactor(verifiedpermissions): split by op-family (no 'backend' in na…
Jul 18, 2026
ef44194
refactor(vpclattice): split by op-family (no 'backend' in names)
Jul 18, 2026
b2b4fde
refactor(networkmonitor): split by op-family (no 'backend' in names)
Jul 18, 2026
4fa6a20
refactor(opsworks): split by op-family (no 'backend' in names)
Jul 18, 2026
de724e2
refactor(managedblockchain): split by op-family (no 'backend' in names)
Jul 18, 2026
d0b80c9
refactor(omics): split by op-family (no 'backend' in names)
Jul 18, 2026
0d34255
refactor(iotanalytics): split by op-family (no 'backend' in names)
Jul 18, 2026
b6914ee
refactor(databrew): split by op-family (no 'backend' in names)
Jul 18, 2026
c7559f9
refactor(forecast): split by op-family (no 'backend' in names)
Jul 18, 2026
d4e27d1
refactor(accessanalyzer): split by op-family (no 'backend'/'appendix'…
Jul 18, 2026
941a012
refactor(fis): split by op-family (no 'backend' in names)
Jul 18, 2026
4f405e4
refactor(apprunner): split by op-family (no 'backend'/'_ops' names)
Jul 18, 2026
7ab798b
refactor(cleanrooms): split by op-family (no 'backend' in names)
Jul 18, 2026
4d6360c
refactor(appstream): strip 'backend_' prefix + split by op-family
Jul 18, 2026
9fce61a
refactor(dlm): split by op-family (no 'backend' in names)
Jul 18, 2026
b96b92e
refactor(identitystore): split by op-family (no 'backend' in names)
Jul 18, 2026
4fb22ba
refactor(resourcegroups): split by op-family (no 'backend' in names)
Jul 18, 2026
ccda2ab
refactor(awsconfig): merge backend/ext/real + split by op-family
Jul 18, 2026
2fd1957
refactor(account): split by op-family (no 'backend' in names)
Jul 18, 2026
3a5ad7f
refactor(iot): strip 'backend_' prefix from op-family files
Jul 18, 2026
4f1ee38
refactor(rdsdata): split by op-family (no 'backend' in names)
Jul 18, 2026
4a4c3d3
refactor(rolesanywhere): split by op-family (no 'backend' in names)
Jul 18, 2026
e7bbf7d
refactor(sagemakerruntime): split by op-family (no 'backend' in names)
Jul 18, 2026
989fdec
refactor(cloudcontrol): split by op-family (no 'backend' in names)
Jul 18, 2026
95c6deb
refactor(polly): split by op-family (no 'backend' in names)
Jul 18, 2026
c022644
refactor(bedrockagent): split by op-family (no 'backend' in names)
Jul 18, 2026
c571277
refactor(ce): split by op-family (no 'backend'/'_ops' names)
Jul 18, 2026
1d5c590
refactor(bedrockruntime): split by op-family (no 'backend' in names)
Jul 18, 2026
04e9f4e
refactor(workmail): split by op-family (no 'backend' in names)
Jul 18, 2026
f2d1db5
refactor(apigatewaymanagementapi): split by op-family (no 'backend'/'…
Jul 18, 2026
d38d9c1
refactor(dynamodbstreams): rename goofy test files (source already cl…
Jul 18, 2026
8396a74
refactor(s3control): strip 'backend_' prefix + split giant test files
Jul 18, 2026
b4af07b
refactor(s3tables): split by op-family (no 'backend' in names)
Jul 18, 2026
6cc8171
refactor(lambda): strip 'backend_' prefix + split giant test files
Jul 18, 2026
34e24db
refactor(iotwireless): split by op-family (no 'backend'/'_ops'/'stubs…
Jul 18, 2026
9f6831e
refactor(iam): strip 'backend_' prefix + split giant test files
Jul 18, 2026
47bd13e
refactor(rds): strip 'backend_' prefix + split giant test files
Jul 18, 2026
aa67c8a
refactor(s3): strip goofy prefixes + split giant files (no 'backend' …
Jul 18, 2026
23194e2
refactor(glue): strip 'backend_' prefix + rename handler_ops_table
Jul 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
18 changes: 17 additions & 1 deletion .beads/issues.jsonl

Large diffs are not rendered by default.

136 changes: 136 additions & 0 deletions services/accessanalyzer/access_previews.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package accessanalyzer

import (
"sort"
"time"

"github.com/google/uuid"
)

// CreateAccessPreview creates a new access preview.
func (b *InMemoryBackend) CreateAccessPreview(analyzerArn string) (*AccessPreview, error) {
b.mu.Lock("CreateAccessPreview")
defer b.mu.Unlock()

var found bool

for _, a := range b.analyzers.All() {
if a.Arn == analyzerArn {
found = true

break
}
}

if !found {
return nil, ErrAnalyzerNotFound
}

now := time.Now().UTC()
ap := &AccessPreview{
ID: uuid.NewString(),
AnalyzerArn: analyzerArn,
Status: AccessPreviewStatusCompleted,
CreatedAt: now,
}

b.accessPreviews.Put(ap)

return copyAccessPreview(ap), nil
}

// GetAccessPreview returns an access preview by ID.
func (b *InMemoryBackend) GetAccessPreview(accessPreviewID string) (*AccessPreview, error) {
b.mu.RLock("GetAccessPreview")
defer b.mu.RUnlock()

ap, ok := b.accessPreviews.Get(accessPreviewID)
if !ok {
return nil, ErrAccessPreviewNotFound
}

return copyAccessPreview(ap), nil
}

// ListAccessPreviews returns all access previews for a given analyzerArn.
func (b *InMemoryBackend) ListAccessPreviews(analyzerArn string) ([]*AccessPreview, error) {
b.mu.RLock("ListAccessPreviews")
defer b.mu.RUnlock()

result := make([]*AccessPreview, 0)

for _, ap := range b.accessPreviews.All() {
if analyzerArn != "" && ap.AnalyzerArn != analyzerArn {
continue
}

result = append(result, copyAccessPreview(ap))
}

sort.Slice(result, func(i, j int) bool {
return result[i].ID < result[j].ID
})

return result, nil
}

// ListAccessPreviewFindings returns findings from the analyzer associated with the preview.
func (b *InMemoryBackend) ListAccessPreviewFindings(
accessPreviewID string,
maxResults int,
nextToken string,
) ([]*Finding, string, error) {
b.mu.RLock("ListAccessPreviewFindings")
defer b.mu.RUnlock()

ap, ok := b.accessPreviews.Get(accessPreviewID)
if !ok {
return nil, "", ErrAccessPreviewNotFound
}

// Find the analyzer by ARN.
var analyzerName string

for _, a := range b.analyzers.All() {
if a.Arn == ap.AnalyzerArn {
analyzerName = a.Name

break
}
}

if analyzerName == "" {
return []*Finding{}, "", nil
}

group := b.findingsByAnalyzer.Get(analyzerName)
findings := make([]*Finding, 0, len(group))

for _, f := range group {
findings = append(findings, copyFinding(f))
}

sort.Slice(findings, func(i, j int) bool {
return findings[i].ID < findings[j].ID
})

start := 0

if nextToken != "" {
for i, f := range findings {
if f.ID == nextToken {
start = i

break
}
}
}

findings = findings[start:]

if maxResults > 0 && len(findings) > maxResults {
return findings[:maxResults], findings[maxResults].ID, nil
}

return findings, "", nil
}
111 changes: 111 additions & 0 deletions services/accessanalyzer/analyzed_resources.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package accessanalyzer

import (
"sort"
"time"
)

// StartResourceScan records that a scan was initiated for a resource (no-op in simulation).
func (b *InMemoryBackend) StartResourceScan(analyzerARN string, _ string) error {
b.mu.RLock("StartResourceScan")
defer b.mu.RUnlock()

// Verify the analyzer exists by ARN.
for _, a := range b.analyzers.All() {
if a.Arn == analyzerARN {
return nil
}
}

return ErrAnalyzerNotFound
}

// GetAnalyzedResource returns an analyzed resource for an analyzer by resource ARN.
func (b *InMemoryBackend) GetAnalyzedResource(analyzerArn, resourceArn string) (*AnalyzedResource, error) {
b.mu.RLock("GetAnalyzedResource")
defer b.mu.RUnlock()

ar, ok := b.analyzedResources.Get(analyzedResourceKey(analyzerArn, resourceArn))
if !ok {
return nil, ErrAnalyzedResourceNotFound
}

cp := *ar

return &cp, nil
}

// ListAnalyzedResources returns analyzed resources for an analyzer, optionally filtered by type.
func (b *InMemoryBackend) ListAnalyzedResources(
analyzerArn, resourceType string,
maxResults int,
nextToken string,
) ([]*AnalyzedResource, string, error) {
b.mu.RLock("ListAnalyzedResources")
defer b.mu.RUnlock()

result := make([]*AnalyzedResource, 0)

for _, ar := range b.analyzedResources.All() {
if ar.AnalyzerArn != analyzerArn {
continue
}

if resourceType != "" && ar.ResourceType != resourceType {
continue
}

cp := *ar
result = append(result, &cp)
}

sort.Slice(result, func(i, j int) bool {
return result[i].ResourceArn < result[j].ResourceArn
})

start := 0

if nextToken != "" {
for i, ar := range result {
if ar.ResourceArn == nextToken {
start = i

break
}
}
}

result = result[start:]

if maxResults > 0 && len(result) > maxResults {
return result[:maxResults], result[maxResults].ResourceArn, nil
}

return result, "", nil
}

// AddAnalyzedResource adds a synthetic analyzed resource (for testing).
func (b *InMemoryBackend) AddAnalyzedResource(
analyzerArn, resourceArn, resourceType string,
isPublic bool,
) (*AnalyzedResource, error) {
b.mu.Lock("AddAnalyzedResource")
defer b.mu.Unlock()

now := time.Now().UTC()
ar := &AnalyzedResource{
ResourceArn: resourceArn,
ResourceType: resourceType,
AnalyzerArn: analyzerArn,
IsPublic: isPublic,
CreatedAt: now,
AnalyzedAt: now,
UpdatedAt: now,
}

b.analyzedResources.Put(ar)

cp := *ar

return &cp, nil
}
119 changes: 119 additions & 0 deletions services/accessanalyzer/analyzers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package accessanalyzer

import (
"slices"
"sort"
"time"

"github.com/google/uuid"
)

// CreateAnalyzer creates a new analyzer.
func (b *InMemoryBackend) CreateAnalyzer(
name string,
analyzerType AnalyzerType,
tags map[string]string,
) (*Analyzer, error) {
if name == "" {
return nil, ErrValidation
}

b.mu.Lock("CreateAnalyzer")
defer b.mu.Unlock()

if b.analyzers.Has(name) {
return nil, ErrAnalyzerAlreadyExists
}

now := time.Now().UTC()
a := &Analyzer{
Arn: b.analyzerARN(name),
Name: name,
Type: analyzerType,
Status: AnalyzerStatusActive,
CreatedAt: now,
Tags: cloneTags(tags),
}

b.analyzers.Put(a)

return copyAnalyzer(a), nil
}

// GetAnalyzer returns the named analyzer.
func (b *InMemoryBackend) GetAnalyzer(name string) (*Analyzer, error) {
b.mu.RLock("GetAnalyzer")
defer b.mu.RUnlock()

a, exists := b.analyzers.Get(name)
if !exists {
return nil, ErrAnalyzerNotFound
}

return copyAnalyzer(a), nil
}

// ListAnalyzers returns all analyzers, optionally filtered by type.
func (b *InMemoryBackend) ListAnalyzers(analyzerType string) ([]*Analyzer, error) {
b.mu.RLock("ListAnalyzers")
defer b.mu.RUnlock()

all := b.analyzers.All()
result := make([]*Analyzer, 0, len(all))

for _, a := range all {
if analyzerType != "" && string(a.Type) != analyzerType {
continue
}

result = append(result, copyAnalyzer(a))
}

sort.Slice(result, func(i, j int) bool {
return result[i].Name < result[j].Name
})

return result, nil
}

// DeleteAnalyzer removes an analyzer and all its findings and archive rules.
func (b *InMemoryBackend) DeleteAnalyzer(name string) error {
b.mu.Lock("DeleteAnalyzer")
defer b.mu.Unlock()

if !b.analyzers.Has(name) {
return ErrAnalyzerNotFound
}

b.analyzers.Delete(name)

for _, r := range slices.Clone(b.archiveRulesByAnalyzer.Get(name)) {
b.archiveRules.Delete(archiveRuleKey(r.AnalyzerName, r.RuleName))
}

for _, f := range slices.Clone(b.findingsByAnalyzer.Get(name)) {
b.findings.Delete(f.ID)
}

return nil
}

// CreateServiceLinkedAnalyzer creates an analyzer with a generated service-linked name.
func (b *InMemoryBackend) CreateServiceLinkedAnalyzer(analyzerType AnalyzerType) (*Analyzer, error) {
name := "_AccessAnalyzerForInternalUse-" + uuid.NewString()[:8]

return b.CreateAnalyzer(name, analyzerType, nil)
}

// UpdateAnalyzer updates an analyzer (currently a no-op — configuration not stored).
func (b *InMemoryBackend) UpdateAnalyzer(name string) (*Analyzer, error) {
b.mu.RLock("UpdateAnalyzer")
defer b.mu.RUnlock()

a, ok := b.analyzers.Get(name)
if !ok {
return nil, ErrAnalyzerNotFound
}

return copyAnalyzer(a), nil
}
Loading
Loading