Skip to content

Commit

Permalink
[kit] handle omitempty tag in desc parser
Browse files Browse the repository at this point in the history
  • Loading branch information
ehsannm committed Jun 13, 2024
1 parent ab7caaf commit 358cfc8
Show file tree
Hide file tree
Showing 8 changed files with 231 additions and 203 deletions.
14 changes: 7 additions & 7 deletions example/ex-04-stubgen/stub/sampleservice/stub.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

198 changes: 98 additions & 100 deletions example/ex-04-stubgen/stub/sampleservicets/stub.ts
Original file line number Diff line number Diff line change
@@ -1,159 +1,157 @@
// Code generated by RonyKIT Stub Generator (TypeScript); DO NOT EDIT.

import useSWR, {SWRConfiguration} from 'swr'


// ErrorMessage is a data transfer object
export interface ErrorMessage {
code: number
item: string
}

// KeyValue is a data transfer object
export interface KeyValue {
key: string
value: number
}
// Code generated by RonyKIT Stub Generator (TypeScript); DO NOT EDIT.

// SimpleHdr is a data transfer object
export interface SimpleHdr {
sKey1: string
sKey2: number
}
import useSWR, { SWRConfiguration } from 'swr'


// ErrorMessage is a data transfer object
export interface ErrorMessage {
code: number
item: string
}
// KeyValue is a data transfer object
export interface KeyValue {
key: string
value: number
}
// SimpleHdr is a data transfer object
export interface SimpleHdr {
sKey1: string
sKey2: number
}
// VeryComplexRequest is a data transfer object
export interface VeryComplexRequest extends SimpleHdr {
key1: string
key1Ptr?: string
mapKey1: {[key: string]: number}
mapKey2: {[key: number]: KeyValue}
sliceKey1: boolean[]
sliceKey2: KeyValue[]
rawKey: any
}
// VeryComplexResponse is a data transfer object
export interface VeryComplexResponse {
key1: string
key1Ptr?: string
mapKey1: {[key: string]: number}
mapKey2: {[key: number]: KeyValue}
sliceKey1: number[]
sliceKey2: KeyValue[]
}

// VeryComplexRequest is a data transfer object
export interface VeryComplexRequest extends SimpleHdr {
key1: string
key1Ptr?: string
mapKey1: { [key: string]: number }
mapKey2: { [key: number]: KeyValue }
sliceKey1: boolean[]
sliceKey2: KeyValue[]
rawKey: any
}

// VeryComplexResponse is a data transfer object
export interface VeryComplexResponse {
key1: string
key1Ptr?: string
mapKey1: { [key: string]: number }
mapKey2: { [key: number]: KeyValue }
sliceKey1: number[]
sliceKey2: KeyValue[]
}


export class sampleServiceStub {
readonly serverURL: string;
readonly serverURL: string ;

constructor(serverURL: string) {
this.serverURL = serverURL.replace(/\/$/, '');
}
constructor(serverURL: string) {
this.serverURL = serverURL.replace(/\/$/, '');
}


// @ts-ignore
async complexDummy(req: VeryComplexRequest, headers?: HeadersInit): Promise<VeryComplexResponse> {
return fetch(this.serverURL + `/complexDummy`, {
// @ts-ignore
async complexDummy(req: VeryComplexRequest, headers?: HeadersInit): Promise<VeryComplexResponse> {
return fetch(this.serverURL + `/complexDummy`, {
method: "POST",
headers: {
"Content-Type": "application/json",
...headers,
"Content-Type": "application/json",
...headers,
},
body: JSON.stringify(req)
}).then((res: Response) => {
}).then((res: Response) => {
if (res.status !== 200) {
throw new Error("Failed to fetch the data");
throw new Error("Failed to fetch the data");
}

return res.json()
})
}

// @ts-ignore
async complexDummy2(req: VeryComplexRequest, headers?: HeadersInit): Promise<VeryComplexResponse> {
return fetch(this.serverURL + `/complexDummy/${req.key1}`, {
})
}
// @ts-ignore
async complexDummy2(req: VeryComplexRequest, headers?: HeadersInit): Promise<VeryComplexResponse> {
return fetch(this.serverURL + `/complexDummy/${req.key1}`, {
method: "POST",
headers: {
"Content-Type": "application/json",
...headers,
"Content-Type": "application/json",
...headers,
},
body: JSON.stringify(req)
}).then((res: Response) => {
}).then((res: Response) => {
if (res.status !== 200) {
throw new Error("Failed to fetch the data");
throw new Error("Failed to fetch the data");
}

return res.json()
})
}

// @ts-ignore
async getComplexDummy(req: VeryComplexRequest, headers?: HeadersInit): Promise<VeryComplexResponse> {
const keys = Object.keys(req);
const keyValuePairs = keys.map(key => {
})
}
// @ts-ignore
async getComplexDummy(req: VeryComplexRequest, headers?: HeadersInit): Promise<VeryComplexResponse> {
const keys = Object.keys(req);
const keyValuePairs = keys.map(key => {
return encodeURIComponent(key) + '=' + encodeURIComponent((req as any)[key]);
}).join('&');
const queryParams = (keyValuePairs.length > 0) ? `?${keyValuePairs}` : ""
const url = `${this.serverURL}/complexDummy/${req.key1}/xs/${req.sKey1}${queryParams}`;
return fetch(url, {
}).join('&');
const queryParams = (keyValuePairs.length > 0) ? `?${keyValuePairs}`: ""
const url = `${this.serverURL}/complexDummy/${req.key1}/xs/${req.sKey1}${queryParams}`;
return fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
...headers,
"Content-Type": "application/json",
...headers,
}
}).then((res: Response) => {
}).then((res: Response) => {
if (res.status !== 200) {
throw new Error("Failed to fetch the data");
throw new Error("Failed to fetch the data");
}

return res.json()
})
}
})
}

} // end of sampleServiceStub


export function useComplexDummy(
export function useComplexDummy(
stub: sampleServiceStub,
req: VeryComplexRequest,
reqHeader?: HeadersInit,
options?: Partial<SWRConfiguration<VeryComplexResponse>>
) {
) {
return useSWR(
[req, 'ComplexDummy'],
(req) => {
return stub.complexDummy(req[0], reqHeader)
},
options
[req, 'ComplexDummy'],
(req) => {
return stub.complexDummy(req[0], reqHeader)
},
options
)
}

export function useComplexDummy2(
}
export function useComplexDummy2(
stub: sampleServiceStub,
req: VeryComplexRequest,
reqHeader?: HeadersInit,
options?: Partial<SWRConfiguration<VeryComplexResponse>>
) {
) {
return useSWR(
[req, 'ComplexDummy2'],
(req) => {
return stub.complexDummy2(req[0], reqHeader)
},
options
[req, 'ComplexDummy2'],
(req) => {
return stub.complexDummy2(req[0], reqHeader)
},
options
)
}

export function useGetComplexDummy(
}
export function useGetComplexDummy(
stub: sampleServiceStub,
req: VeryComplexRequest,
reqHeader?: HeadersInit,
options?: Partial<SWRConfiguration<VeryComplexResponse>>
) {
) {
return useSWR(
[req, 'GetComplexDummy'],
(req) => {
return stub.getComplexDummy(req[0], reqHeader)
},
options
[req, 'GetComplexDummy'],
(req) => {
return stub.getComplexDummy(req[0], reqHeader)
},
options
)
}
}
15 changes: 9 additions & 6 deletions kit/desc/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ func (ps *ParsedService) parseElement(ft reflect.Type, enc kit.Encoding) ParsedE
}
switch kind {
case Map:
// we only support maps with string keys
pe.Key = utils.ValPtr(ps.parseElement(ft.Key(), enc))
pe.Element = utils.ValPtr(ps.parseElement(ft.Elem(), enc))

Expand Down Expand Up @@ -512,18 +511,19 @@ const (
)

type ParsedStructTag struct {
original reflect.StructTag
Raw reflect.StructTag
Name string
Value string
Optional bool
PossibleValues []string
Deprecated bool
OmitEmpty bool
}

func (pst ParsedStructTag) Tags(keys ...string) map[string]string {
tags := make(map[string]string)
for _, k := range keys {
v, ok := pst.original.Lookup(k)
v, ok := pst.Raw.Lookup(k)
if ok {
tags[k] = v
}
Expand All @@ -533,13 +533,13 @@ func (pst ParsedStructTag) Tags(keys ...string) map[string]string {
}

func (pst ParsedStructTag) Get(key string) string {
return pst.original.Get(key)
return pst.Raw.Get(key)
}

func getParsedStructTag(tag reflect.StructTag, name string) ParsedStructTag {
pst := ParsedStructTag{
original: tag,
Name: name,
Raw: tag,
Name: name,
}
nameTag := tag.Get(name)
if nameTag == "" {
Expand All @@ -549,6 +549,9 @@ func getParsedStructTag(tag reflect.StructTag, name string) ParsedStructTag {
// This is a hack to remove omitempty from tags
if fNameParts := strings.Split(nameTag, swagValueSep); len(fNameParts) > 0 {
pst.Value = strings.TrimSpace(fNameParts[0])
if len(fNameParts) > 1 && fNameParts[1] == "omitempty" {
pst.OmitEmpty = true
}
}

swagTag := tag.Get(swagTagKey)
Expand Down
2 changes: 2 additions & 0 deletions kit/desc/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,14 @@ var _ = Describe("DescParser", func() {
Expect(contract0.Request.Message.Fields[2].Element.Kind).To(Equal(desc.Array))
Expect(contract0.Request.Message.Fields[2].Element.Element.Kind).To(Equal(desc.Object))
Expect(contract0.Request.Message.Fields[2].Element.Element.Message.Name).To(Equal("FlatMessage"))
Expect(contract0.Request.Message.Fields[2].Tag.OmitEmpty).To(BeTrue())
Expect(contract0.Request.Message.Fields[2].Optional).To(BeFalse())
Expect(contract0.Request.Message.Fields[3].Name).To(Equal("bm"))
Expect(contract0.Request.Message.Fields[3].Element.Kind).To(Equal(desc.Map))
Expect(contract0.Request.Message.Fields[3].Element.Element.Kind).To(Equal(desc.Object))
Expect(contract0.Request.Message.Fields[3].Element.Element.Message.Name).To(Equal("FlatMessage"))
Expect(contract0.Request.Message.Fields[3].Optional).To(BeFalse())
Expect(contract0.Request.Message.Fields[3].Tag.OmitEmpty).To(BeFalse())
Expect(contract0.Request.Message.Fields[4].Name).To(Equal("c"))
Expect(contract0.Request.Message.Fields[4].Element.Kind).To(Equal(desc.Object))
Expect(contract0.Request.Message.Fields[4].Element.Message.Name).To(Equal("FlatMessage"))
Expand Down
Loading

0 comments on commit 358cfc8

Please sign in to comment.