Skip to content

Commit 85272a9

Browse files
authored
Merge pull request #1 from cresta/plat-1067-fix-wellknown-type-typing
PLAT-1067: fix wellknown type mapping
2 parents da98e2f + 8f11b17 commit 85272a9

File tree

5 files changed

+443
-12
lines changed

5 files changed

+443
-12
lines changed

generator/template.go

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ import (
1919

2020
const tmpl = `
2121
{{define "dependencies"}}
22-
{{range .}}import * as {{.ModuleIdentifier}} from "{{.SourceFile}}"
23-
{{end}}{{end}}
22+
{{range . -}}
23+
{{- if isNotWellKnownDeps .SourceFile -}}
24+
import * as {{.ModuleIdentifier}} from "{{.SourceFile}}"
25+
{{- end }}
26+
{{- end}}
27+
{{end}}
2428
2529
{{define "enums"}}
2630
{{range .}}export enum {{.Name}} {
@@ -448,6 +452,9 @@ func GetTemplate(r *registry.Registry) *template.Template {
448452
"renderURL": renderURL(r),
449453
"buildInitReq": buildInitReq,
450454
"fieldName": fieldName(r),
455+
"isNotWellKnownDeps": func(dep string) bool {
456+
return !isWellKnownDeps(dep)
457+
},
451458
})
452459

453460
t = template.Must(t.Parse(tmpl))
@@ -555,13 +562,14 @@ func tsType(r *registry.Registry, fieldType data.Type) string {
555562
return fmt.Sprintf("{[key: %s]: %s}", keyType, valueType)
556563
}
557564

558-
typeStr := ""
559-
if strings.Index(info.Type, ".") != 0 {
560-
typeStr = mapScalaType(info.Type)
561-
} else if !info.IsExternal {
562-
typeStr = typeInfo.PackageIdentifier
563-
} else {
564-
typeStr = data.GetModuleName(typeInfo.Package, typeInfo.File) + "." + typeInfo.PackageIdentifier
565+
typeStr := mapWellKnownType(info.Type)
566+
567+
if typeStr == "" {
568+
if !info.IsExternal {
569+
typeStr = typeInfo.PackageIdentifier
570+
} else {
571+
typeStr = data.GetModuleName(typeInfo.Package, typeInfo.File) + "." + typeInfo.PackageIdentifier
572+
}
565573
}
566574

567575
if info.IsRepeated {
@@ -570,7 +578,7 @@ func tsType(r *registry.Registry, fieldType data.Type) string {
570578
return typeStr
571579
}
572580

573-
func mapScalaType(protoType string) string {
581+
func mapWellKnownType(protoType string) string {
574582
switch protoType {
575583
case "uint64", "sint64", "int64", "fixed64", "sfixed64", "string":
576584
return "string"
@@ -580,8 +588,41 @@ func mapScalaType(protoType string) string {
580588
return "boolean"
581589
case "bytes":
582590
return "Uint8Array"
591+
case ".google.protobuf.Timestamp":
592+
return "string"
593+
case ".google.protobuf.Duration":
594+
return "string"
595+
case ".google.protobuf.Struct":
596+
return "unknown"
597+
case ".google.protobuf.Value":
598+
return "unknown"
599+
case ".google.protobuf.ListValue":
600+
return "unknown[]"
601+
case ".google.protobuf.NullValue":
602+
return "null"
603+
case ".google.protobuf.FieldMask":
604+
return "string[]"
605+
case ".google.protobuf.Any":
606+
return "unknown"
583607
}
584-
585608
return ""
609+
}
586610

611+
var (
612+
wellKnownDeps = []string{
613+
"google/protobuf/duration",
614+
"google/protobuf/timestamp",
615+
"google/protobuf/struct",
616+
"google/protobuf/field_mask",
617+
"google/protobuf/any",
618+
}
619+
)
620+
621+
func isWellKnownDeps(dep string) bool {
622+
for _, wellKnownDep := range wellKnownDeps {
623+
if strings.Contains(dep, wellKnownDep) {
624+
return true
625+
}
626+
}
627+
return false
587628
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
// Protocol Buffers - Google's data interchange format
2+
// Copyright 2008 Google Inc. All rights reserved.
3+
// https://developers.google.com/protocol-buffers/
4+
//
5+
// Redistribution and use in source and binary forms, with or without
6+
// modification, are permitted provided that the following conditions are
7+
// met:
8+
//
9+
// * Redistributions of source code must retain the above copyright
10+
// notice, this list of conditions and the following disclaimer.
11+
// * Redistributions in binary form must reproduce the above
12+
// copyright notice, this list of conditions and the following disclaimer
13+
// in the documentation and/or other materials provided with the
14+
// distribution.
15+
// * Neither the name of Google Inc. nor the names of its
16+
// contributors may be used to endorse or promote products derived from
17+
// this software without specific prior written permission.
18+
//
19+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30+
31+
syntax = "proto3";
32+
33+
package google.protobuf;
34+
35+
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
36+
option cc_enable_arenas = true;
37+
option go_package = "google.golang.org/protobuf/types/known/durationpb";
38+
option java_package = "com.google.protobuf";
39+
option java_outer_classname = "DurationProto";
40+
option java_multiple_files = true;
41+
option objc_class_prefix = "GPB";
42+
43+
// A Duration represents a signed, fixed-length span of time represented
44+
// as a count of seconds and fractions of seconds at nanosecond
45+
// resolution. It is independent of any calendar and concepts like "day"
46+
// or "month". It is related to Timestamp in that the difference between
47+
// two Timestamp values is a Duration and it can be added or subtracted
48+
// from a Timestamp. Range is approximately +-10,000 years.
49+
//
50+
// # Examples
51+
//
52+
// Example 1: Compute Duration from two Timestamps in pseudo code.
53+
//
54+
// Timestamp start = ...;
55+
// Timestamp end = ...;
56+
// Duration duration = ...;
57+
//
58+
// duration.seconds = end.seconds - start.seconds;
59+
// duration.nanos = end.nanos - start.nanos;
60+
//
61+
// if (duration.seconds < 0 && duration.nanos > 0) {
62+
// duration.seconds += 1;
63+
// duration.nanos -= 1000000000;
64+
// } else if (duration.seconds > 0 && duration.nanos < 0) {
65+
// duration.seconds -= 1;
66+
// duration.nanos += 1000000000;
67+
// }
68+
//
69+
// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
70+
//
71+
// Timestamp start = ...;
72+
// Duration duration = ...;
73+
// Timestamp end = ...;
74+
//
75+
// end.seconds = start.seconds + duration.seconds;
76+
// end.nanos = start.nanos + duration.nanos;
77+
//
78+
// if (end.nanos < 0) {
79+
// end.seconds -= 1;
80+
// end.nanos += 1000000000;
81+
// } else if (end.nanos >= 1000000000) {
82+
// end.seconds += 1;
83+
// end.nanos -= 1000000000;
84+
// }
85+
//
86+
// Example 3: Compute Duration from datetime.timedelta in Python.
87+
//
88+
// td = datetime.timedelta(days=3, minutes=10)
89+
// duration = Duration()
90+
// duration.FromTimedelta(td)
91+
//
92+
// # JSON Mapping
93+
//
94+
// In JSON format, the Duration type is encoded as a string rather than an
95+
// object, where the string ends in the suffix "s" (indicating seconds) and
96+
// is preceded by the number of seconds, with nanoseconds expressed as
97+
// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
98+
// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
99+
// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
100+
// microsecond should be expressed in JSON format as "3.000001s".
101+
//
102+
//
103+
message Duration {
104+
// Signed seconds of the span of time. Must be from -315,576,000,000
105+
// to +315,576,000,000 inclusive. Note: these bounds are computed from:
106+
// 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
107+
int64 seconds = 1;
108+
109+
// Signed fractions of a second at nanosecond resolution of the span
110+
// of time. Durations less than one second are represented with a 0
111+
// `seconds` field and a positive or negative `nanos` field. For durations
112+
// of one second or more, a non-zero value for the `nanos` field must be
113+
// of the same sign as the `seconds` field. Must be from -999,999,999
114+
// to +999,999,999 inclusive.
115+
int32 nanos = 2;
116+
}

0 commit comments

Comments
 (0)