Skip to content

Commit 8b57c43

Browse files
authored
feat: render patternProperties and additionalProperties as fields for Go struct (#301)
1 parent f05150f commit 8b57c43

File tree

4 files changed

+44
-5
lines changed

4 files changed

+44
-5
lines changed

src/generators/go/GoPreset.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@ import { Preset, CommonModel, CommonPreset, PresetArgs, EnumPreset } from '../..
44
import { StructRenderer, GO_DEFAULT_STRUCT_PRESET } from './renderers/StructRenderer';
55
import { EnumRenderer, GO_DEFAULT_ENUM_PRESET } from './renderers/EnumRenderer';
66

7+
export enum FieldType {
8+
field,
9+
additionalProperty,
10+
patternProperties
11+
}
712
export interface FieldArgs {
813
fieldName: string;
914
field: CommonModel;
15+
type: FieldType;
1016
}
1117

1218
export interface StructPreset<R extends AbstractRenderer, O extends object = any> extends CommonPreset<R, O> {

src/generators/go/GoRenderer.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { AbstractRenderer } from '../AbstractRenderer';
22
import { GoGenerator, GoOptions } from './GoGenerator';
33
import { CommonModel, CommonInputModel, Preset } from '../../models';
44
import { FormatHelpers } from '../../helpers/FormatHelpers';
5+
import { DefaultPropertyNames, getUniquePropertyName } from '../../helpers';
6+
import { FieldType } from './GoPreset';
57

68
/**
79
* Common renderer for Go types
@@ -28,6 +30,19 @@ export abstract class GoRenderer extends AbstractRenderer<GoOptions> {
2830
content.push(renderField);
2931
}
3032

33+
if (this.model.additionalProperties !== undefined) {
34+
const propertyName = getUniquePropertyName(this.model, DefaultPropertyNames.additionalProperties);
35+
const additionalProperty = await this.runFieldPreset(propertyName, this.model.additionalProperties, FieldType.additionalProperty);
36+
content.push(additionalProperty);
37+
}
38+
39+
if (this.model.patternProperties !== undefined) {
40+
for (const [pattern, patternModel] of Object.entries(this.model.patternProperties)) {
41+
const propertyName = getUniquePropertyName(this.model, `${pattern}${DefaultPropertyNames.patternProperties}`);
42+
const renderedPatternProperty = await this.runFieldPreset(propertyName, patternModel, FieldType.patternProperties);
43+
content.push(renderedPatternProperty);
44+
}
45+
}
3146
return this.renderBlock(content);
3247
}
3348

@@ -57,8 +72,8 @@ export abstract class GoRenderer extends AbstractRenderer<GoOptions> {
5772
: fieldName || '';
5873
}
5974

60-
runFieldPreset(fieldName: string, field: CommonModel): Promise<string> {
61-
return this.runPreset('field', { fieldName, field });
75+
runFieldPreset(fieldName: string, field: CommonModel, type: FieldType = FieldType.field): Promise<string> {
76+
return this.runPreset('field', { fieldName, field, type });
6277
}
6378

6479
renderType(model: CommonModel): string {

src/generators/go/renderers/StructRenderer.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GoRenderer } from '../GoRenderer';
2-
import { StructPreset } from '../GoPreset';
2+
import { FieldType, StructPreset } from '../GoPreset';
33

44
/**
55
* Renderer for Go's `struct` type
@@ -27,8 +27,12 @@ export const GO_DEFAULT_STRUCT_PRESET: StructPreset<StructRenderer> = {
2727
self({ renderer }) {
2828
return renderer.defaultSelf();
2929
},
30-
field({ fieldName, field, renderer }) {
30+
field({ fieldName, field, renderer, type }) {
3131
fieldName = renderer.nameField(fieldName, field);
32-
return `${ fieldName } ${ renderer.renderType(field)}`;
32+
let fieldType = renderer.renderType(field);
33+
if (type === FieldType.additionalProperty || type === FieldType.patternProperties) {
34+
fieldType = `map[string]${fieldType}`;
35+
}
36+
return `${ fieldName } ${ fieldType }`;
3337
},
3438
};

test/generators/go/GoGenerator.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ describe('GoGenerator', () => {
2020
array_type: { type: 'array', items: { type: 'string' } },
2121
},
2222
required: ['street_name', 'city', 'state', 'house_number', 'array_type'],
23+
additionalProperties: {
24+
type: 'string'
25+
},
26+
patternProperties: {
27+
'^S(.?*)test&': {
28+
type: 'string'
29+
}
30+
},
2331
};
2432
const expected = `// Address represents a Address model.
2533
type Address struct {
@@ -31,6 +39,8 @@ type Address struct {
3139
Members []interface{}
3240
TupleType []interface{}
3341
ArrayType []string
42+
AdditionalProperties map[string]string
43+
STestPatternProperties map[string]string
3444
}`;
3545

3646
const inputModel = await generator.process(doc);
@@ -51,11 +61,15 @@ type Address struct {
5161
type: 'object',
5262
properties: {
5363
property: { type: 'string' },
64+
},
65+
additionalProperties: {
66+
type: 'string'
5467
}
5568
};
5669
const expected = `// CustomStruct represents a CustomStruct model.
5770
type CustomStruct struct {
5871
property string
72+
additionalProperties string
5973
}`;
6074

6175
generator = new GoGenerator({ presets: [

0 commit comments

Comments
 (0)