forked from imulab/go-scim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
resource_type.go
119 lines (105 loc) · 3.92 KB
/
resource_type.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
package internal
import (
"github.com/justakit/go-scim/pkg/v2/prop"
"github.com/justakit/go-scim/pkg/v2/spec"
)
// SerializableResourceType is the json.Serializable wrapper for spec.ResourceType.
type SerializableResourceType struct {
ResourceType *spec.ResourceType
}
// MainSchemaId returns the main schema id for ResourceType as a resource.
func (s *SerializableResourceType) MainSchemaId() string {
return "urn:ietf:params:scim:schemas:core:2.0:ResourceType"
}
// Visit takes the visitor on a DFS tour of the structure of the ResourceType resource. This method takes control of what
// to visit and will not consult the ShouldVisit method of visitor.
func (s *SerializableResourceType) Visit(visitor prop.Visitor) error {
dummyContainer := prop.NewComplex(spec.MetaAttributes().ResourceTypeAttributeNoSub())
visitor.BeginChildren(dummyContainer)
if err := s.visitCore(visitor); err != nil {
return err
}
if err := s.visitResourceType(visitor); err != nil {
return err
}
visitor.EndChildren(dummyContainer)
return nil
}
func (s *SerializableResourceType) visitCore(visitor prop.Visitor) error {
// schemas
schemas := prop.NewMultiOf(spec.MetaAttributes().CoreSchemasAttribute(), []interface{}{s.MainSchemaId()})
if err := visitor.Visit(schemas); err != nil {
return err
}
visitor.BeginChildren(schemas)
if err := schemas.ForEachChild(func(index int, child prop.Property) error {
return visitor.Visit(child)
}); err != nil {
return err
}
visitor.EndChildren(schemas)
// id
if err := visitor.Visit(prop.NewStringOf(spec.MetaAttributes().CoreIdAttribute(), s.ResourceType.ID())); err != nil {
return err
}
// meta
meta := prop.NewComplexOf(spec.MetaAttributes().CoreMetaPartialAttribute(), map[string]interface{}{
"resourceType": s.ResourceType.ResourceTypeName(),
"location": s.ResourceType.ResourceLocation(),
})
if err := visitor.Visit(meta); err != nil {
return err
}
visitor.BeginChildren(meta)
if err := meta.ForEachChild(func(_ int, child prop.Property) error {
return visitor.Visit(child)
}); err != nil {
return err
}
visitor.EndChildren(meta)
return nil
}
func (s *SerializableResourceType) visitResourceType(visitor prop.Visitor) error {
if err := visitor.Visit(prop.NewStringOf(spec.MetaAttributes().ResourceTypeNameAttribute(), s.ResourceType.Name())); err != nil {
return err
}
if description := s.ResourceType.Description(); len(description) > 0 {
if err := visitor.Visit(prop.NewStringOf(spec.MetaAttributes().ResourceTypeDescriptionAttribute(), description)); err != nil {
return err
}
}
if endpoint := s.ResourceType.Endpoint(); len(endpoint) > 0 {
if err := visitor.Visit(prop.NewStringOf(spec.MetaAttributes().ResourceTypeEndpointAttribute(), endpoint)); err != nil {
return err
}
}
if err := visitor.Visit(prop.NewReferenceOf(spec.MetaAttributes().ResourceTypeSchemaAttribute(), s.ResourceType.Schema().ID())); err != nil {
return err
}
if s.ResourceType.CountExtensions() > 0 {
dummyMulti := prop.NewMulti(spec.MetaAttributes().ResourceTypeSchemaExtensionsAttributeNoSub())
if err := visitor.Visit(dummyMulti); err != nil {
return err
}
visitor.BeginChildren(dummyMulti)
if err := s.ResourceType.ForEachExtension(func(extension *spec.Schema, required bool) error {
dummyComplex := prop.NewComplex(spec.MetaAttributes().ResourceTypeSchemaExtensionsAttributeNoSub().DeriveElementAttribute())
if err := visitor.Visit(dummyComplex); err != nil {
return err
}
visitor.BeginChildren(dummyComplex)
if err := visitor.Visit(prop.NewReferenceOf(spec.MetaAttributes().ResourceTypeSchemaExtensionSchemaAttribute(), extension.ID())); err != nil {
return err
}
if err := visitor.Visit(prop.NewBooleanOf(spec.MetaAttributes().ResourceTypeSchemaExtensionRequiredAttribute(), required)); err != nil {
return err
}
visitor.EndChildren(dummyComplex)
return nil
}); err != nil {
return err
}
visitor.EndChildren(dummyMulti)
}
return nil
}