-
Notifications
You must be signed in to change notification settings - Fork 246
/
operations.go
126 lines (109 loc) · 3.43 KB
/
operations.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//go:build wasm
// +build wasm
package main
import (
"fmt"
"strings"
"github.com/authzed/spicedb/pkg/development"
core "github.com/authzed/spicedb/pkg/proto/core/v1"
devinterface "github.com/authzed/spicedb/pkg/proto/developer/v1"
v1 "github.com/authzed/spicedb/pkg/proto/dispatch/v1"
"github.com/authzed/spicedb/pkg/schemadsl/generator"
"github.com/authzed/spicedb/pkg/tuple"
)
func runOperation(devContext *development.DevContext, operation *devinterface.Operation) (*devinterface.OperationResult, error) {
switch {
case operation.FormatSchemaParameters != nil:
formatted := ""
for _, nsDef := range devContext.Namespaces {
source, _ := generator.GenerateSource(nsDef)
formatted += source
formatted += "\n\n"
}
trimmed := strings.TrimSpace(formatted)
return &devinterface.OperationResult{
FormatSchemaResult: &devinterface.FormatSchemaResult{
FormattedSchema: trimmed,
},
}, nil
case operation.CheckParameters != nil:
result, err := development.RunCheck(devContext, operation.CheckParameters.Resource, operation.CheckParameters.Subject)
if err != nil {
devErr, wireErr := development.DistinguishGraphError(
devContext,
err,
devinterface.DeveloperError_CHECK_WATCH,
0, 0,
tuple.String(&core.RelationTuple{
ResourceAndRelation: operation.CheckParameters.Resource,
Subject: operation.CheckParameters.Subject,
}),
)
if wireErr != nil {
return nil, wireErr
}
return &devinterface.OperationResult{
CheckResult: &devinterface.CheckOperationsResult{
CheckError: devErr,
},
}, nil
}
// TODO(jschorr): Support caveats here.
membership := devinterface.CheckOperationsResult_NOT_MEMBER
if result == v1.ResourceCheckResult_MEMBER {
membership = devinterface.CheckOperationsResult_MEMBER
}
return &devinterface.OperationResult{
CheckResult: &devinterface.CheckOperationsResult{
Membership: membership,
},
}, nil
case operation.AssertionsParameters != nil:
assertions, devErr := development.ParseAssertionsYAML(operation.AssertionsParameters.AssertionsYaml)
if devErr != nil {
return &devinterface.OperationResult{
AssertionsResult: &devinterface.RunAssertionsResult{
InputError: devErr,
},
}, nil
}
validationErrors, err := development.RunAllAssertions(devContext, assertions)
if err != nil {
return nil, err
}
return &devinterface.OperationResult{
AssertionsResult: &devinterface.RunAssertionsResult{
ValidationErrors: validationErrors,
},
}, nil
case operation.ValidationParameters != nil:
validation, devErr := development.ParseExpectedRelationsYAML(operation.ValidationParameters.ValidationYaml)
if devErr != nil {
return &devinterface.OperationResult{
ValidationResult: &devinterface.RunValidationResult{
InputError: devErr,
},
}, nil
}
membershipSet, validationErrors, err := development.RunValidation(devContext, validation)
if err != nil {
return nil, err
}
updatedValidationYaml := ""
if membershipSet != nil {
generatedValidationYaml, gerr := development.GenerateValidation(membershipSet)
if gerr != nil {
return nil, gerr
}
updatedValidationYaml = generatedValidationYaml
}
return &devinterface.OperationResult{
ValidationResult: &devinterface.RunValidationResult{
UpdatedValidationYaml: updatedValidationYaml,
ValidationErrors: validationErrors,
},
}, nil
default:
return nil, fmt.Errorf("unknown operation")
}
}