3
3
namespace ArtARTs36 \MergeRequestLinter \DocBuilder \ConfigJsonSchema ;
4
4
5
5
use ArtARTs36 \MergeRequestLinter \Contracts \Rule \RuleConstructorFinder ;
6
+ use ArtARTs36 \MergeRequestLinter \DocBuilder \ConfigJsonSchema \Schema \JsonSchema ;
6
7
use ArtARTs36 \MergeRequestLinter \Rule \DefaultRules ;
7
8
use ArtARTs36 \MergeRequestLinter \Rule \Factory \Constructor \ConstructorFinder ;
8
9
use ArtARTs36 \MergeRequestLinter \Support \Reflector \Reflector ;
10
+ use ArtARTs36 \Str \Facade \Str ;
9
11
10
12
class RuleSchemaGenerator
11
13
{
@@ -15,27 +17,29 @@ public function __construct(
15
17
//
16
18
}
17
19
18
- public function generate ()
20
+ public function generate (JsonSchema $ jsonSchema ): array
19
21
{
20
22
$ rules = DefaultRules::map ();
21
23
$ schema = [];
22
24
23
25
foreach ($ rules as $ ruleName => $ rule ) {
24
26
$ ruleSchema = [
25
- 'type ' => 'object ' ,
26
27
'description ' => Reflector::findPHPDocSummary (new \ReflectionClass ($ rule )),
28
+ ];
29
+
30
+ $ constructor = $ this ->constructorFinder ->find ($ rule );
31
+ $ params = $ constructor ->params ();
32
+
33
+ $ definition = [
34
+ 'type ' => 'object ' ,
27
35
'properties ' => [
28
36
'when ' => [
29
37
'$ref ' => '#/definitions/rule_conditions ' ,
30
38
],
31
- ]
39
+ ],
32
40
];
33
41
34
- $ constructor = $ this ->constructorFinder ->find ($ rule );
35
- $ params = $ constructor ->params ();
36
-
37
42
if (count ($ params ) > 0 ) {
38
- $ ruleSchema ['required ' ] = [];
39
43
foreach ($ constructor ->params () as $ paramName => $ paramType ) {
40
44
$ typeSchema = [
41
45
'type ' => JsonType::to ($ paramType ->name ),
@@ -64,12 +68,30 @@ public function generate()
64
68
}
65
69
}
66
70
67
- $ ruleSchema ['properties ' ][$ paramName ] = $ typeSchema ;
68
-
69
- $ ruleSchema ['required ' ][] = $ paramName ;
71
+ $ definition ['properties ' ][$ paramName ] = $ typeSchema ;
72
+ $ definition ['required ' ][] = $ paramName ;
70
73
}
71
74
}
72
75
76
+ $ definitionName = Str::replace ('rules_properties_ ' . $ ruleName , [
77
+ '/ ' => '_ ' ,
78
+ ]);
79
+
80
+ $ propertyDefinitionRef = $ jsonSchema ->addDefinition ($ definitionName , $ definition );
81
+
82
+ $ ruleSchema ['oneOf ' ] = [
83
+ [
84
+ '$ref ' => $ propertyDefinitionRef ,
85
+ ],
86
+ [
87
+ 'type ' => 'array ' ,
88
+ 'items ' => [
89
+ '$ref ' => $ propertyDefinitionRef ,
90
+ ],
91
+ 'minItems ' => 1 ,
92
+ ],
93
+ ];
94
+
73
95
$ schema [$ ruleName ] = $ ruleSchema ;
74
96
}
75
97
0 commit comments