Skip to content

Commit 8e72347

Browse files
committed
feat(ns-asyncapi-2-0): add support for OperationTrait Object
Refs #387
1 parent c4ad53c commit 8e72347

File tree

12 files changed

+162
-2
lines changed

12 files changed

+162
-2
lines changed

apidom/packages/apidom-ns-asyncapi-2-0/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ Only fully implemented specification objects should be checked here.
151151
- [x] [Channels Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#channelsObject)
152152
- [x] [Channel Item Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#channelItemObject)
153153
- [ ] [Operation Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#operationObject) (partial)
154-
- [ ] [Operation Trait Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#operationTraitObject)
154+
- [x] [Operation Trait Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#operationTraitObject)
155155
- [x] [Message Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#messageObject)
156156
- [x] [Message Trait Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#messageTraitObject)
157157
- [x] [Tags Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#tagsObject)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { Attributes, Meta, ObjectElement, StringElement } from 'minim';
2+
3+
import TagsElement from './Tags';
4+
import ExternalDocumentationElement from './ExternalDocumentation';
5+
import OperationBindingsElement from './OperationBindings';
6+
import ReferenceElement from './Reference';
7+
8+
class OperationTrait extends ObjectElement {
9+
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
10+
super(content, meta, attributes);
11+
this.element = 'operationTrait';
12+
}
13+
14+
get operationId(): StringElement {
15+
return this.get('operationId');
16+
}
17+
18+
set operationId(operationId: StringElement) {
19+
this.set('operationId', operationId);
20+
}
21+
22+
get summary(): StringElement {
23+
return this.get('summary');
24+
}
25+
26+
set summary(summary: StringElement) {
27+
this.set('summary', summary);
28+
}
29+
30+
get description(): StringElement {
31+
return this.get('description');
32+
}
33+
34+
set description(description: StringElement) {
35+
this.set('description', description);
36+
}
37+
38+
get tags(): TagsElement | undefined {
39+
return this.get('tags');
40+
}
41+
42+
set tags(tags: TagsElement | undefined) {
43+
this.set('tags', tags);
44+
}
45+
46+
get externalDocs(): ExternalDocumentationElement | undefined {
47+
return this.get('externalDocs');
48+
}
49+
50+
set externalDocs(externalDocs: ExternalDocumentationElement | undefined) {
51+
this.set('externalDocs', externalDocs);
52+
}
53+
54+
get bindings(): OperationBindingsElement | ReferenceElement | undefined {
55+
return this.get('bindings');
56+
}
57+
58+
set bindings(bindings: OperationBindingsElement | ReferenceElement | undefined) {
59+
this.set('bindings', bindings);
60+
}
61+
}
62+
63+
export default OperationTrait;

apidom/packages/apidom-ns-asyncapi-2-0/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export { default as OAuthFlowElement } from './elements/OAuthFlow';
7474
export { default as OAuthFlowsElement } from './elements/OAuthFlows';
7575
export { default as OperationElement } from './elements/Operation';
7676
export { default as OperationBindingsElement } from './elements/OperationBindings';
77+
export { default as OperationTraitElement } from './elements/OperationTrait';
7778
export { default as ParameterElement } from './elements/Parameter';
7879
export { default as ParametersElement } from './elements/Parameters';
7980
export { default as ReferenceElement } from './elements/Reference';

apidom/packages/apidom-ns-asyncapi-2-0/src/namespace.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import OAuthFlowElement from './elements/OAuthFlow';
2323
import OAuthFlowsElement from './elements/OAuthFlows';
2424
import OperationElement from './elements/Operation';
2525
import OperationBindingsElement from './elements/OperationBindings';
26+
import OperationTraitElement from './elements/OperationTrait';
2627
import ParameterElement from './elements/Parameter';
2728
import ParametersElement from './elements/Parameters';
2829
import ReferenceElement from './elements/Reference';
@@ -136,6 +137,7 @@ const asyncApi2_0 = {
136137
base.register('oAuthFlows', OAuthFlowsElement);
137138
base.register('operation', OperationElement);
138139
base.register('operationBindings', OperationBindingsElement);
140+
base.register('operationTrait', OperationTraitElement);
139141
base.register('parameter', ParameterElement);
140142
base.register('parameters', ParametersElement);
141143
base.register('reference', ReferenceElement);

apidom/packages/apidom-ns-asyncapi-2-0/src/refractor/registration.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import OAuthFlowElement from '../elements/OAuthFlow';
2222
import OAuthFlowsElement from '../elements/OAuthFlows';
2323
import OperationElement from '../elements/Operation';
2424
import OperationBindingsElement from '../elements/OperationBindings';
25+
import OperationTraitElement from '../elements/OperationTrait';
2526
import ParameterElement from '../elements/Parameter';
2627
import ParametersElement from '../elements/Parameters';
2728
import ReferenceElement from '../elements/Reference';
@@ -245,6 +246,13 @@ OperationBindingsElement.refract = createRefractor([
245246
'OperationBindings',
246247
'$visitor',
247248
]);
249+
OperationTraitElement.refract = createRefractor([
250+
'visitors',
251+
'document',
252+
'objects',
253+
'OperationTrait',
254+
'$visitor',
255+
]);
248256
ParameterElement.refract = createRefractor([
249257
'visitors',
250258
'document',

apidom/packages/apidom-ns-asyncapi-2-0/src/refractor/specification.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ import MessageDescriptionVisitor from './visitors/async-api-2-0/message/Descript
9999
import MessageBindingsVisitor_ from './visitors/async-api-2-0/message/BindingsVisitor';
100100
import MessageExamplesVisitor from './visitors/async-api-2-0/message/ExamplesVisitor';
101101
import MessageTraitsVisitor from './visitors/async-api-2-0/message/TraitsVisitor';
102+
import OperationBindingsVisitor from './visitors/async-api-2-0/operation-bindings';
103+
import OperationTraitVisitor from './visitors/async-api-2-0/operation-trait';
104+
import OperationTraitOperationIdVisitor from './visitors/async-api-2-0/operation-trait/OperationIdVisitor';
105+
import OperationTraitSummaryVisitor from './visitors/async-api-2-0/operation-trait/SummaryVisitor';
106+
import OperationTraitDescriptionVisitor from './visitors/async-api-2-0/operation-trait/DescriptionVisitor';
107+
import OperationTraitBindingsVisitor from './visitors/async-api-2-0/operation-trait/BindingsVisitor';
102108
/**
103109
* Binding elements.
104110
*/
@@ -207,7 +213,6 @@ import WebSocketChannelBindingBindingVersionVisitor from './visitors/async-api-2
207213
import WebSocketMessageBindingVisitor from './visitors/async-api-2-0/bindings/ws/message-binding';
208214
import WebSocketOperationBindingVisitor from './visitors/async-api-2-0/bindings/ws/operation-binding';
209215
import WebSocketServerBindingVisitor from './visitors/async-api-2-0/bindings/ws/server-binding';
210-
import OperationBindingsVisitor from './visitors/async-api-2-0/operation-bindings';
211216

212217
/**
213218
* Specification object allows us to have complete control over visitors
@@ -342,6 +347,21 @@ const specification = {
342347
$visitor: OperationVisitor,
343348
fixedFields: {},
344349
},
350+
OperationTrait: {
351+
$visitor: OperationTraitVisitor,
352+
fixedFields: {
353+
operationId: OperationTraitOperationIdVisitor,
354+
summary: OperationTraitSummaryVisitor,
355+
description: OperationTraitDescriptionVisitor,
356+
tags: {
357+
$ref: '#/visitors/document/objects/Tags',
358+
},
359+
externalDocs: {
360+
$ref: '#/visitors/document/objects/ExternalDocumentation',
361+
},
362+
bindings: OperationTraitBindingsVisitor,
363+
},
364+
},
345365
Message: {
346366
$visitor: MessageVisitor,
347367
fixedFields: {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import stampit from 'stampit';
2+
import { T as stubTrue } from 'ramda';
3+
import { ObjectElement } from 'apidom';
4+
5+
import ReferenceElement from '../../../../elements/Reference';
6+
import AlternatingVisitor from '../../generics/AlternatingVisitor';
7+
import FallbackVisitor from '../../FallbackVisitor';
8+
import { isReferenceLikeElement } from '../../../predicates';
9+
import { isReferenceElement } from '../../../../predicates';
10+
11+
const BindingsVisitor = stampit(AlternatingVisitor, FallbackVisitor, {
12+
props: {
13+
alternator: [
14+
{ predicate: isReferenceLikeElement, specPath: ['document', 'objects', 'Reference'] },
15+
{ predicate: stubTrue, specPath: ['document', 'objects', 'OperationBindings'] },
16+
],
17+
},
18+
methods: {
19+
ObjectElement(objectElement: ObjectElement) {
20+
// @ts-ignore
21+
const result = AlternatingVisitor.compose.methods.ObjectElement.call(this, objectElement);
22+
23+
this.element.filter(isReferenceElement).forEach((referenceElement: ReferenceElement) => {
24+
referenceElement.setMetaProperty('referenced-element', 'operationBindings');
25+
});
26+
27+
return result;
28+
},
29+
},
30+
});
31+
32+
export default BindingsVisitor;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import FallbackVisitor from '../../FallbackVisitor';
2+
3+
const DescriptionVisitor = FallbackVisitor;
4+
5+
export default DescriptionVisitor;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import FallbackVisitor from '../../FallbackVisitor';
2+
3+
const OperationIdVisitor = FallbackVisitor;
4+
5+
export default OperationIdVisitor;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import FallbackVisitor from '../../FallbackVisitor';
2+
3+
const SummaryVisitor = FallbackVisitor;
4+
5+
export default SummaryVisitor;

0 commit comments

Comments
 (0)