Skip to content

Commit d1f1d72

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

File tree

9 files changed

+207
-3
lines changed

9 files changed

+207
-3
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
@@ -150,7 +150,7 @@ Only fully implemented specification objects should be checked here.
150150
- [x] [Default Content Type](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#defaultContentTypeString)
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)
153-
- [ ] [Operation Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#operationObject) (partial)
153+
- [x] [Operation Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#operationObject)
154154
- [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)
Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,80 @@
1-
import { Attributes, Meta, ObjectElement } from 'minim';
1+
import { Attributes, Meta } from 'minim';
2+
import { ObjectElement, StringElement, ArrayElement } from 'apidom';
3+
4+
import TagsElement from './Tags';
5+
import ExternalDocumentationElement from './ExternalDocumentation';
6+
import OperationBindingsElement from './OperationBindings';
7+
import ReferenceElement from './Reference';
28

39
class Operation extends ObjectElement {
410
constructor(content?: Record<string, unknown>, meta?: Meta, attributes?: Attributes) {
511
super(content, meta, attributes);
612
this.element = 'operation';
713
}
14+
15+
get operationId(): StringElement {
16+
return this.get('operationId');
17+
}
18+
19+
set operationId(operationId: StringElement) {
20+
this.set('operationId', operationId);
21+
}
22+
23+
get summary(): StringElement {
24+
return this.get('summary');
25+
}
26+
27+
set summary(summary: StringElement) {
28+
this.set('summary', summary);
29+
}
30+
31+
get description(): StringElement {
32+
return this.get('description');
33+
}
34+
35+
set description(description: StringElement) {
36+
this.set('description', description);
37+
}
38+
39+
get tags(): TagsElement | undefined {
40+
return this.get('tags');
41+
}
42+
43+
set tags(tags: TagsElement | undefined) {
44+
this.set('tags', tags);
45+
}
46+
47+
get externalDocs(): ExternalDocumentationElement | undefined {
48+
return this.get('externalDocs');
49+
}
50+
51+
set externalDocs(externalDocs: ExternalDocumentationElement | undefined) {
52+
this.set('externalDocs', externalDocs);
53+
}
54+
55+
get bindings(): OperationBindingsElement | ReferenceElement | undefined {
56+
return this.get('bindings');
57+
}
58+
59+
set bindings(bindings: OperationBindingsElement | ReferenceElement | undefined) {
60+
this.set('bindings', bindings);
61+
}
62+
63+
get traits(): ArrayElement | undefined {
64+
return this.get('traits');
65+
}
66+
67+
set traits(traits: ArrayElement | undefined) {
68+
this.set('traits', traits);
69+
}
70+
71+
get message(): ArrayElement | undefined {
72+
return this.get('message');
73+
}
74+
75+
set message(message: ArrayElement | undefined) {
76+
this.set('message', message);
77+
}
878
}
979

1080
export default Operation;

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ import ComponentsVisitor from './visitors/async-api-2-0/components';
6565
import ComponentsSchemasVisitor from './visitors/async-api-2-0/components/SchemasVisitor';
6666
import ComponentParametersVisitor from './visitors/async-api-2-0/components/ParametersVisitor';
6767
import OperationVisitor from './visitors/async-api-2-0/operation';
68+
import OperationOperationIdVisitor from './visitors/async-api-2-0/operation/OperationIdVisitor';
69+
import OperationSummaryVisitor from './visitors/async-api-2-0/operation/SummaryVisitor';
70+
import OperationDescriptionVisitor from './visitors/async-api-2-0/operation/DescriptionVisitor';
71+
import OperationBindingsVisitor_ from './visitors/async-api-2-0/operation/BindingsVisitor';
72+
import OperationTraitsVisitor from './visitors/async-api-2-0/operation/TraitsVisitor';
73+
import OperationMessageVisitor from './visitors/async-api-2-0/operation/MessageVisitor';
6874
import TagsVisitor from './visitors/async-api-2-0/tags';
6975
import TagVisitor from './visitors/async-api-2-0/tag';
7076
import TagNameVisitor from './visitors/async-api-2-0/tag/NameVisitor';
@@ -345,7 +351,20 @@ const specification = {
345351
},
346352
Operation: {
347353
$visitor: OperationVisitor,
348-
fixedFields: {},
354+
fixedFields: {
355+
operationId: OperationOperationIdVisitor,
356+
summary: OperationSummaryVisitor,
357+
description: OperationDescriptionVisitor,
358+
tags: {
359+
$ref: '#/visitors/document/objects/Tags',
360+
},
361+
externalDocs: {
362+
$ref: '#/visitors/document/objects/ExternalDocumentation',
363+
},
364+
bindings: OperationBindingsVisitor_,
365+
traits: OperationTraitsVisitor,
366+
message: OperationMessageVisitor,
367+
},
349368
},
350369
OperationTrait: {
351370
$visitor: OperationTraitVisitor,
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: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import stampit from 'stampit';
2+
import { ArrayElement, Element, BREAK } from 'apidom';
3+
4+
import SpecificationVisitor from '../../SpecificationVisitor';
5+
import FallbackVisitor from '../../FallbackVisitor';
6+
import { isReferenceLikeElement } from '../../../predicates';
7+
8+
const MessageVisitor = stampit(SpecificationVisitor, FallbackVisitor, {
9+
init() {
10+
this.element = new ArrayElement();
11+
},
12+
methods: {
13+
ArrayElement(arrayElement: ArrayElement) {
14+
arrayElement.forEach((item: Element) => {
15+
let element;
16+
17+
if (isReferenceLikeElement(item)) {
18+
element = this.toRefractedElement(['document', 'objects', 'Reference'], item);
19+
element.setMetaProperty('referenced-element', 'message');
20+
} else {
21+
element = this.toRefractedElement(['document', 'objects', 'Message'], item);
22+
}
23+
24+
this.element.push(element);
25+
});
26+
27+
this.copyMetaAndAttributes(arrayElement, this.element);
28+
29+
return BREAK;
30+
},
31+
},
32+
});
33+
34+
export default MessageVisitor;
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;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import stampit from 'stampit';
2+
import { ArrayElement, Element, BREAK } from 'apidom';
3+
4+
import SpecificationVisitor from '../../SpecificationVisitor';
5+
import FallbackVisitor from '../../FallbackVisitor';
6+
import { isReferenceLikeElement } from '../../../predicates';
7+
8+
const TraitsVisitor = stampit(SpecificationVisitor, FallbackVisitor, {
9+
init() {
10+
this.element = new ArrayElement();
11+
},
12+
methods: {
13+
ArrayElement(arrayElement: ArrayElement) {
14+
arrayElement.forEach((item: Element) => {
15+
let element;
16+
17+
if (isReferenceLikeElement(item)) {
18+
element = this.toRefractedElement(['document', 'objects', 'Reference'], item);
19+
element.setMetaProperty('referenced-element', 'operationTrait');
20+
} else {
21+
element = this.toRefractedElement(['document', 'objects', 'OperationTrait'], item);
22+
}
23+
24+
this.element.push(element);
25+
});
26+
27+
this.copyMetaAndAttributes(arrayElement, this.element);
28+
29+
return BREAK;
30+
},
31+
},
32+
});
33+
34+
export default TraitsVisitor;

0 commit comments

Comments
 (0)