-
Notifications
You must be signed in to change notification settings - Fork 219
/
version.go
80 lines (76 loc) · 3.67 KB
/
version.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package codegen
const (
// The version of the codegen API in semantic version format (Major.Minor).
//
// We need to make sure that the code generated by 'weaver generate' is in
// sync with the weaver module version compiled into a developer's binary.
// For example, 'weaver generate' may generate code using a function in the
// codegen package that doesn't yet exist in the version of the codegen
// package linked into the developer's binary.
//
// We also need to make sure that all generated weaver_gen.go files are
// compatible. For example, if we change the RPC wire protocol, we have to
// ensure that every weaver_gen.go file is re-generated to use the new wire
// protocol.
//
// To address these issues, we introduce a codegen version. Every time we
// make a change to how code is generated---e.g., we change our wire
// protocol, we change which codegen functions get called---we increment
// the codegen version.
//
// In the future, we have to be careful to make backwards compatible
// changes and ensure different versions work with each other. In the short
// term, we make the restriction that all weaver_gen.go files use the same
// codegen API version linked into the developer's binary.
//
// We could assign the codegen API versions v1, v2, v3, and so on.
// However, this makes it hard to understand the relationship between the
// codegen API version and the version of the Service Weaver module. (What
// version of Service Weaver do I need to install to get version 7 of the
// codegen API?)
//
// Instead, we use Service Weaver module versions as codegen API versions.
// For example, if we change the codegen API in v0.12.0 of Service Weaver,
// then we update the codegen API version to v0.12.0. If we don't change
// the codegen API in v0.13.0 of Service Weaver, then we leave the codegen
// API at v0.12.0.
//
// TODO(mwhittaker): Write a doc explaining this version as well as the
// module version and deployer API version.
Major = 0
Minor = 11
// NOTE: Patch is omitted because all API changes should bump the major or
// minor version. Patch is assumed to be 0.
)
// The following types are used to check, at compile time, that every
// weaver_gen.go file uses the codegen API version that is linked into the
// binary.
//
// It is best explained via an example. Imagine 'weaver generate' is running
// with codegen version 0.1.0. For every package, 'weaver generate' generates
// the following line:
//
// var _ codegen.LatestVersion = codegen.Version[[0][1]struct{}]("...")
//
// This line implicitly checks that the type codegen.LatestVersion is equal to
// the type codegen.Version[[0][1]struct{}]. Imagine we build this code but
// link in codegen API version 0.2.0. When we compile, codegen.LatestVersion is
// an alias of Version[[0][2]struct{}] which is not equal to the
// Version[[0][1]struct{}] that appears in the generated code. This causes a
// compile error which includes a diagnostic message explaining what went wrong
// (this is "..." above). Again note that we ignore the patch number.
type Version[_ any] string
type LatestVersion = Version[[Major][Minor]struct{}]