Skip to content

Commit 9fe5fed

Browse files
committed
internal/proto: move location of cue/cue.proto
This makes cuelang.org/cue/encoding/protobuf (git) the import path and cue/cue.proto the canonical import name. Add google files for import, even though the types are mapped, for better validation. Change-Id: I8f31102baf362608c50c26f85e810b87321aab94 Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2342 Reviewed-by: Marcel van Lohuizen <[email protected]>
1 parent fbcb339 commit 9fe5fed

File tree

18 files changed

+2442
-13
lines changed

18 files changed

+2442
-13
lines changed

internal/protobuf/debug.test

4.27 MB
Binary file not shown.

internal/protobuf/parse.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ func (p *protoConverter) resolveTopScope(pos scanner.Position, name string, opti
244244
}
245245

246246
func (p *protoConverter) doImport(v *proto.Import) {
247-
if v.Filename == "cuelang/cue.proto" {
247+
if v.Filename == "cue/cue.proto" {
248248
return
249249
}
250250

@@ -259,10 +259,7 @@ func (p *protoConverter) doImport(v *proto.Import) {
259259
break
260260
}
261261

262-
if filename == "" {
263-
p.mustBuiltinPackage(v.Position, v.Filename)
264-
return
265-
}
262+
p.mapBuiltinPackage(v.Position, v.Filename, filename == "")
266263

267264
imp, err := p.state.parse(filename, nil)
268265
if err != nil {
@@ -356,6 +353,9 @@ func (p *protoConverter) topElement(v proto.Visitee) {
356353
case *proto.Import:
357354
// already handled.
358355

356+
case *proto.Extensions:
357+
// no need to handle
358+
359359
default:
360360
failf(scanner.Position{}, "unsupported type %T", x)
361361
}
@@ -440,6 +440,9 @@ func (p *protoConverter) messageField(s *ast.StructLit, i int, v proto.Visitee)
440440
case *proto.Oneof:
441441
p.oneOf(x)
442442

443+
case *proto.Extensions:
444+
// no need to handle
445+
443446
default:
444447
failf(scanner.Position{}, "unsupported type %T", v)
445448
}

internal/protobuf/protobuf.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
// Package protobuf defines functionality for parsing protocol buffer
1616
// definitions and instances.
1717
//
18-
// TODO: this package can become public once we have found a good nest for it.
1918
package protobuf
2019

2120
import (
@@ -28,10 +27,12 @@ type Config struct {
2827
}
2928

3029
// Parse parses a single proto file and returns its contents translated to a CUE
31-
// file. Imports are resolved using the paths defined in Config. If src is not
32-
// nil, it will use this as the contents of the file. It may be a string, []byte
33-
// or io.Reader. Otherwise Parse will open the given file name at the fully
34-
// qualified path.
30+
// file. If src is not nil, it will use this as the contents of the file. It may
31+
// be a string, []byte or io.Reader. Otherwise Parse will open the given file
32+
// name at the fully qualified path.
33+
//
34+
// Parse assumes the proto file compiles with protoc and may not report an error
35+
// if it does not. Imports are resolved using the paths defined in Config.
3536
//
3637
// The following field options are supported:
3738
// (cue.val) string CUE constraint for this field. The string may
@@ -40,6 +41,9 @@ type Config struct {
4041
// required bool Defines the field is required. Use with
4142
// caution.
4243
func Parse(filename string, src interface{}, c *Config) (f *ast.File, err error) {
44+
if c == nil {
45+
c = &Config{}
46+
}
4347
state := &sharedState{
4448
paths: c.Paths,
4549
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
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 go_package = "types";
37+
option java_package = "com.google.protobuf";
38+
option java_outer_classname = "AnyProto";
39+
option java_multiple_files = true;
40+
option objc_class_prefix = "GPB";
41+
42+
// `Any` contains an arbitrary serialized protocol buffer message along with a
43+
// URL that describes the type of the serialized message.
44+
//
45+
// Protobuf library provides support to pack/unpack Any values in the form
46+
// of utility functions or additional generated methods of the Any type.
47+
//
48+
// Example 1: Pack and unpack a message in C++.
49+
//
50+
// Foo foo = ...;
51+
// Any any;
52+
// any.PackFrom(foo);
53+
// ...
54+
// if (any.UnpackTo(&foo)) {
55+
// ...
56+
// }
57+
//
58+
// Example 2: Pack and unpack a message in Java.
59+
//
60+
// Foo foo = ...;
61+
// Any any = Any.pack(foo);
62+
// ...
63+
// if (any.is(Foo.class)) {
64+
// foo = any.unpack(Foo.class);
65+
// }
66+
//
67+
// Example 3: Pack and unpack a message in Python.
68+
//
69+
// foo = Foo(...)
70+
// any = Any()
71+
// any.Pack(foo)
72+
// ...
73+
// if any.Is(Foo.DESCRIPTOR):
74+
// any.Unpack(foo)
75+
// ...
76+
//
77+
// Example 4: Pack and unpack a message in Go
78+
//
79+
// foo := &pb.Foo{...}
80+
// any, err := ptypes.MarshalAny(foo)
81+
// ...
82+
// foo := &pb.Foo{}
83+
// if err := ptypes.UnmarshalAny(any, foo); err != nil {
84+
// ...
85+
// }
86+
//
87+
// The pack methods provided by protobuf library will by default use
88+
// 'type.googleapis.com/full.type.name' as the type URL and the unpack
89+
// methods only use the fully qualified type name after the last '/'
90+
// in the type URL, for example "foo.bar.com/x/y.z" will yield type
91+
// name "y.z".
92+
//
93+
//
94+
// JSON
95+
// ====
96+
// The JSON representation of an `Any` value uses the regular
97+
// representation of the deserialized, embedded message, with an
98+
// additional field `@type` which contains the type URL. Example:
99+
//
100+
// package google.profile;
101+
// message Person {
102+
// string first_name = 1;
103+
// string last_name = 2;
104+
// }
105+
//
106+
// {
107+
// "@type": "type.googleapis.com/google.profile.Person",
108+
// "firstName": <string>,
109+
// "lastName": <string>
110+
// }
111+
//
112+
// If the embedded message type is well-known and has a custom JSON
113+
// representation, that representation will be embedded adding a field
114+
// `value` which holds the custom JSON in addition to the `@type`
115+
// field. Example (for message [google.protobuf.Duration][]):
116+
//
117+
// {
118+
// "@type": "type.googleapis.com/google.protobuf.Duration",
119+
// "value": "1.212s"
120+
// }
121+
//
122+
message Any {
123+
// A URL/resource name that uniquely identifies the type of the serialized
124+
// protocol buffer message. This string must contain at least
125+
// one "/" character. The last segment of the URL's path must represent
126+
// the fully qualified name of the type (as in
127+
// `path/google.protobuf.Duration`). The name should be in a canonical form
128+
// (e.g., leading "." is not accepted).
129+
//
130+
// In practice, teams usually precompile into the binary all types that they
131+
// expect it to use in the context of Any. However, for URLs which use the
132+
// scheme `http`, `https`, or no scheme, one can optionally set up a type
133+
// server that maps type URLs to message definitions as follows:
134+
//
135+
// * If no scheme is provided, `https` is assumed.
136+
// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
137+
// value in binary format, or produce an error.
138+
// * Applications are allowed to cache lookup results based on the
139+
// URL, or have them precompiled into a binary to avoid any
140+
// lookup. Therefore, binary compatibility needs to be preserved
141+
// on changes to types. (Use versioned type names to manage
142+
// breaking changes.)
143+
//
144+
// Note: this functionality is not currently available in the official
145+
// protobuf release, and it is not used for type URLs beginning with
146+
// type.googleapis.com.
147+
//
148+
// Schemes other than `http`, `https` (or the empty scheme) might be
149+
// used with implementation specific semantics.
150+
//
151+
string type_url = 1;
152+
153+
// Must be a valid serialized protocol buffer of the above specified type.
154+
bytes value = 2;
155+
}

0 commit comments

Comments
 (0)