Skip to content

Commit db24f62

Browse files
authored
Move bufpolicy PolicyConfig methods types to bufpolicy (#3916)
This PR defines the bufpolicy.PolicyConfig methods as package types to avoid depending on bufconfig. Helpers to convert to bufconfig are provided in `bufpolicyconfig`.
1 parent 41eb6aa commit db24f62

File tree

7 files changed

+771
-189
lines changed

7 files changed

+771
-189
lines changed

private/bufpkg/bufpolicy/bufpolicyapi/convert.go

Lines changed: 80 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"buf.build/go/bufplugin/option"
2222
"buf.build/go/standard/xslices"
2323
"github.com/bufbuild/buf/private/bufpkg/bufcas"
24-
"github.com/bufbuild/buf/private/bufpkg/bufconfig"
2524
"github.com/bufbuild/buf/private/bufpkg/bufparse"
2625
"github.com/bufbuild/buf/private/bufpkg/bufpolicy"
2726
)
@@ -50,8 +49,75 @@ func V1Beta1ProtoToDigest(protoDigest *policyv1beta1.Digest) (bufpolicy.Digest,
5049

5150
// V1Beta1ProtoToPolicyConfig converts the given proto PolicyConfig to a PolicyConfig.
5251
// The registry is used to resolve plugin references.
53-
func V1Beta1ProtoToPolicyConfig(registry string, protoPolicyConfig *policyv1beta1.PolicyConfig) (bufpolicy.PolicyConfig, error) {
54-
return newPolicyConfig(registry, protoPolicyConfig)
52+
func V1Beta1ProtoToPolicyConfig(registry string, policyConfigV1Beta1 *policyv1beta1.PolicyConfig) (bufpolicy.PolicyConfig, error) {
53+
lintConfig, err := getLintConfigForV1Beta1LintConfig(policyConfigV1Beta1.GetLint())
54+
if err != nil {
55+
return nil, err
56+
}
57+
breakingConfig, err := getBreakingConfigForV1Beta1BreakingConfig(policyConfigV1Beta1.GetBreaking())
58+
if err != nil {
59+
return nil, err
60+
}
61+
pluginConfigs, err := xslices.MapError(
62+
policyConfigV1Beta1.GetPlugins(),
63+
func(pluginConfigV1Beta1 *policyv1beta1.PolicyConfig_CheckPluginConfig) (bufpolicy.PluginConfig, error) {
64+
return getPluginConfigForV1Beta1PluginConfig(registry, pluginConfigV1Beta1)
65+
},
66+
)
67+
if err != nil {
68+
return nil, err
69+
}
70+
return bufpolicy.NewPolicyConfig(
71+
lintConfig,
72+
breakingConfig,
73+
pluginConfigs,
74+
)
75+
}
76+
77+
// PolicyConfigToV1Beta1Proto converts the given PolicyConfig to a proto PolicyConfig.
78+
func PolicyConfigToV1Beta1Proto(policyConfig bufpolicy.PolicyConfig) (*policyv1beta1.PolicyConfig, error) {
79+
pluginConfigs, err := xslices.MapError(
80+
policyConfig.PluginConfigs(),
81+
func(pluginConfig bufpolicy.PluginConfig) (*policyv1beta1.PolicyConfig_CheckPluginConfig, error) {
82+
pluginRef := pluginConfig.Ref()
83+
if pluginRef == nil {
84+
return nil, fmt.Errorf("plugin config %q has no reference", pluginConfig.Name())
85+
}
86+
pluginOptions, err := pluginConfig.Options().ToProto()
87+
if err != nil {
88+
return nil, err
89+
}
90+
return &policyv1beta1.PolicyConfig_CheckPluginConfig{
91+
Name: &policyv1beta1.PolicyConfig_CheckPluginConfig_Name{
92+
Owner: pluginRef.FullName().Owner(),
93+
Plugin: pluginRef.FullName().Name(),
94+
Ref: pluginRef.Ref(),
95+
},
96+
Options: pluginOptions,
97+
Args: pluginConfig.Args(),
98+
}, nil
99+
},
100+
)
101+
if err != nil {
102+
return nil, err
103+
}
104+
return &policyv1beta1.PolicyConfig{
105+
Lint: &policyv1beta1.PolicyConfig_LintConfig{
106+
Use: policyConfig.LintConfig().UseIDsAndCategories(),
107+
Except: policyConfig.LintConfig().ExceptIDsAndCategories(),
108+
EnumZeroValueSuffix: policyConfig.LintConfig().EnumZeroValueSuffix(),
109+
RpcAllowSameRequestResponse: policyConfig.LintConfig().RPCAllowSameRequestResponse(),
110+
RpcAllowGoogleProtobufEmptyRequests: policyConfig.LintConfig().RPCAllowGoogleProtobufEmptyRequests(),
111+
RpcAllowGoogleProtobufEmptyResponses: policyConfig.LintConfig().RPCAllowGoogleProtobufEmptyResponses(),
112+
ServiceSuffix: policyConfig.LintConfig().ServiceSuffix(),
113+
},
114+
Breaking: &policyv1beta1.PolicyConfig_BreakingConfig{
115+
Use: policyConfig.BreakingConfig().UseIDsAndCategories(),
116+
Except: policyConfig.BreakingConfig().ExceptIDsAndCategories(),
117+
IgnoreUnstablePackages: policyConfig.BreakingConfig().IgnoreUnstablePackages(),
118+
},
119+
Plugins: pluginConfigs,
120+
}, nil
55121
}
56122

57123
// *** PRIVATE ***
@@ -75,108 +141,34 @@ func v1beta1ProtoToDigestType(protoDigestType policyv1beta1.DigestType) (bufpoli
75141
return digestType, nil
76142
}
77143

78-
// policyConfig implements bufpolicy.PolicyConfig.
79-
type policyConfig struct {
80-
lintConfig bufconfig.LintConfig
81-
breakingConfig bufconfig.BreakingConfig
82-
pluginConfigs []bufconfig.PluginConfig
83-
}
84-
85-
func newPolicyConfig(
86-
registry string,
87-
policyConfigV1Beta1 *policyv1beta1.PolicyConfig,
88-
) (*policyConfig, error) {
89-
if policyConfigV1Beta1 == nil {
90-
return nil, fmt.Errorf("policyConfigV1Beta1 must not be nil")
91-
}
92-
lintConfig, err := getLintConfigForV1Beta1LintConfig(policyConfigV1Beta1.Lint)
93-
if err != nil {
94-
return nil, err
95-
}
96-
breakingConfig, err := getBreakingConfigForV1Beta1BreakingConfig(policyConfigV1Beta1.Breaking)
97-
if err != nil {
98-
return nil, err
99-
}
100-
pluginConfigs, err := xslices.MapError(
101-
policyConfigV1Beta1.Plugins,
102-
func(pluginConfigV1Beta1 *policyv1beta1.PolicyConfig_CheckPluginConfig) (bufconfig.PluginConfig, error) {
103-
return getPluginConfigForV1Beta1PluginConfig(registry, pluginConfigV1Beta1)
104-
},
105-
)
106-
if err != nil {
107-
return nil, err
108-
}
109-
return &policyConfig{
110-
lintConfig: lintConfig,
111-
breakingConfig: breakingConfig,
112-
pluginConfigs: pluginConfigs,
113-
}, nil
114-
}
115-
116-
// LintConfig returns the LintConfig for the File.
117-
func (p *policyConfig) LintConfig() bufconfig.LintConfig {
118-
return p.lintConfig
119-
}
120-
121-
// BreakingConfig returns the BreakingConfig for the File.
122-
func (p *policyConfig) BreakingConfig() bufconfig.BreakingConfig {
123-
return p.breakingConfig
124-
}
125-
126-
// PluginConfigs returns the PluginConfigs for the File.
127-
func (p *policyConfig) PluginConfigs() []bufconfig.PluginConfig {
128-
return p.pluginConfigs
129-
}
130-
131144
func getLintConfigForV1Beta1LintConfig(
132145
lintConfigV1Beta1 *policyv1beta1.PolicyConfig_LintConfig,
133-
) (bufconfig.LintConfig, error) {
134-
checkConfig, err := bufconfig.NewEnabledCheckConfig(
135-
bufconfig.FileVersionV2,
146+
) (bufpolicy.LintConfig, error) {
147+
return bufpolicy.NewLintConfig(
136148
lintConfigV1Beta1.GetUse(),
137149
lintConfigV1Beta1.GetExcept(),
138-
nil,
139-
nil,
140-
false,
141-
)
142-
if err != nil {
143-
return nil, err
144-
}
145-
return bufconfig.NewLintConfig(
146-
checkConfig,
147150
lintConfigV1Beta1.GetEnumZeroValueSuffix(),
148151
lintConfigV1Beta1.GetRpcAllowSameRequestResponse(),
149152
lintConfigV1Beta1.GetRpcAllowGoogleProtobufEmptyRequests(),
150153
lintConfigV1Beta1.GetRpcAllowGoogleProtobufEmptyResponses(),
151154
lintConfigV1Beta1.GetServiceSuffix(),
152-
false, // Comment ignores are not allowed in Policy files.
153-
), nil
155+
)
154156
}
155157

156158
func getBreakingConfigForV1Beta1BreakingConfig(
157159
breakingConfigV1Beta1 *policyv1beta1.PolicyConfig_BreakingConfig,
158-
) (bufconfig.BreakingConfig, error) {
159-
checkConfig, err := bufconfig.NewEnabledCheckConfig(
160-
bufconfig.FileVersionV2,
160+
) (bufpolicy.BreakingConfig, error) {
161+
return bufpolicy.NewBreakingConfig(
161162
breakingConfigV1Beta1.GetUse(),
162163
breakingConfigV1Beta1.GetExcept(),
163-
nil,
164-
nil,
165-
false,
166-
)
167-
if err != nil {
168-
return nil, err
169-
}
170-
return bufconfig.NewBreakingConfig(
171-
checkConfig,
172164
breakingConfigV1Beta1.GetIgnoreUnstablePackages(),
173-
), nil
165+
)
174166
}
175167

176168
func getPluginConfigForV1Beta1PluginConfig(
177169
registry string,
178170
pluginConfigV1Beta1 *policyv1beta1.PolicyConfig_CheckPluginConfig,
179-
) (bufconfig.PluginConfig, error) {
171+
) (bufpolicy.PluginConfig, error) {
180172
nameV1Beta1 := pluginConfigV1Beta1.GetName()
181173
pluginRef, err := bufparse.NewRef(
182174
registry,
@@ -187,17 +179,14 @@ func getPluginConfigForV1Beta1PluginConfig(
187179
if err != nil {
188180
return nil, err
189181
}
190-
options, err := option.OptionsForProtoOptions(pluginConfigV1Beta1.GetOptions())
182+
pluginOptions, err := option.OptionsForProtoOptions(pluginConfigV1Beta1.GetOptions())
191183
if err != nil {
192184
return nil, err
193185
}
194-
optionsMap := make(map[string]any)
195-
options.Range(func(key string, value any) {
196-
optionsMap[key] = value
197-
})
198-
return bufconfig.NewRemoteWasmPluginConfig(
186+
return bufpolicy.NewPluginConfig(
187+
nameV1Beta1.String(),
199188
pluginRef,
200-
optionsMap,
189+
pluginOptions,
201190
pluginConfigV1Beta1.GetArgs(),
202191
)
203192
}

private/bufpkg/bufpolicy/bufpolicyapi/policy_data_provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ func (p *policyDataProvider) getIndexedPolicyDatasForRegistryAndIndexedPolicyKey
151151
return nil, syserror.Newf("did not get policy key from store with commitID %q", commitID)
152152
}
153153
getContent := func() (bufpolicy.PolicyConfig, error) {
154-
return newPolicyConfig(registry, policyContent.GetConfig())
154+
return V1Beta1ProtoToPolicyConfig(registry, policyContent.GetConfig())
155155
}
156156
policyData, err := bufpolicy.NewPolicyData(ctx, indexedPolicyKey.Value, getContent)
157157
if err != nil {

private/bufpkg/bufpolicy/bufpolicyapi/uploader.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ import (
2222

2323
ownerv1 "buf.build/gen/go/bufbuild/registry/protocolbuffers/go/buf/registry/owner/v1"
2424
policyv1beta1 "buf.build/gen/go/bufbuild/registry/protocolbuffers/go/buf/registry/policy/v1beta1"
25-
"buf.build/go/bufplugin/option"
2625
"buf.build/go/standard/xslices"
2726
"connectrpc.com/connect"
28-
"github.com/bufbuild/buf/private/bufpkg/bufconfig"
2927
"github.com/bufbuild/buf/private/bufpkg/bufpolicy"
3028
"github.com/bufbuild/buf/private/bufpkg/bufregistryapi/bufregistryapipolicy"
3129
"github.com/bufbuild/buf/private/pkg/syserror"
@@ -143,12 +141,8 @@ func (u *uploader) uploadIndexedPoliciesForRegistry(
143141
lintConfig := config.LintConfig()
144142
breakingConfig := config.BreakingConfig()
145143
pluginConfigs := config.PluginConfigs()
146-
pluginConfigsProto, err := xslices.MapError(pluginConfigs, func(pluginConfig bufconfig.PluginConfig) (*policyv1beta1.PolicyConfig_CheckPluginConfig, error) {
147-
options, err := option.NewOptions(pluginConfig.Options())
148-
if err != nil {
149-
return nil, err
150-
}
151-
optionsProto, err := options.ToProto()
144+
pluginConfigsProto, err := xslices.MapError(pluginConfigs, func(pluginConfig bufpolicy.PluginConfig) (*policyv1beta1.PolicyConfig_CheckPluginConfig, error) {
145+
optionsProto, err := pluginConfig.Options().ToProto()
152146
if err != nil {
153147
return nil, err
154148
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// Copyright 2020-2025 Buf Technologies, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package bufpolicyconfig
16+
17+
import (
18+
"strings"
19+
20+
"buf.build/go/standard/xslices"
21+
"github.com/bufbuild/buf/private/bufpkg/bufconfig"
22+
"github.com/bufbuild/buf/private/bufpkg/bufpolicy"
23+
)
24+
25+
// LintConfigToBufConfig converts the given LintConfig to a bufconfig.LintConfig.
26+
func LintConfigToBufConfig(lintConfig bufpolicy.LintConfig) (bufconfig.LintConfig, error) {
27+
checkConfig, err := bufconfig.NewEnabledCheckConfig(
28+
bufconfig.FileVersionV2,
29+
lintConfig.UseIDsAndCategories(),
30+
lintConfig.ExceptIDsAndCategories(),
31+
nil,
32+
nil,
33+
false,
34+
)
35+
if err != nil {
36+
return nil, err
37+
}
38+
return bufconfig.NewLintConfig(
39+
checkConfig,
40+
lintConfig.EnumZeroValueSuffix(),
41+
lintConfig.RPCAllowSameRequestResponse(),
42+
lintConfig.RPCAllowGoogleProtobufEmptyRequests(),
43+
lintConfig.RPCAllowGoogleProtobufEmptyResponses(),
44+
lintConfig.ServiceSuffix(),
45+
false, // Comment ignores are not allowed in Policy files.
46+
), nil
47+
}
48+
49+
// BreakingConfigToBufConfig converts the given BreakingConfig to a bufconfig.BreakingConfig.
50+
func BreakingConfigToBufConfig(breakingConfig bufpolicy.BreakingConfig) (bufconfig.BreakingConfig, error) {
51+
checkConfig, err := bufconfig.NewEnabledCheckConfig(
52+
bufconfig.FileVersionV2,
53+
breakingConfig.UseIDsAndCategories(),
54+
breakingConfig.ExceptIDsAndCategories(),
55+
nil,
56+
nil,
57+
false,
58+
)
59+
if err != nil {
60+
return nil, err
61+
}
62+
return bufconfig.NewBreakingConfig(
63+
checkConfig,
64+
breakingConfig.IgnoreUnstablePackages(),
65+
), nil
66+
}
67+
68+
// PluginConfigsToBufConfig converts the given plugin configs to bufconfig.PluginConfig.
69+
func PluginConfigsToBufConfig(pluginConfigs []bufpolicy.PluginConfig) ([]bufconfig.PluginConfig, error) {
70+
return xslices.MapError(pluginConfigs, func(pluginConfig bufpolicy.PluginConfig) (bufconfig.PluginConfig, error) {
71+
options := make(map[string]any)
72+
pluginConfig.Options().Range(func(key string, value any) {
73+
options[key] = value
74+
})
75+
args := pluginConfig.Args()
76+
switch {
77+
case pluginConfig.Ref() != nil:
78+
return bufconfig.NewRemoteWasmPluginConfig(
79+
pluginConfig.Ref(),
80+
options,
81+
args,
82+
)
83+
case strings.HasSuffix(pluginConfig.Name(), ".wasm"):
84+
return bufconfig.NewLocalWasmPluginConfig(
85+
pluginConfig.Name(),
86+
options,
87+
args,
88+
)
89+
default:
90+
return bufconfig.NewLocalPluginConfig(
91+
pluginConfig.Name(),
92+
options,
93+
args,
94+
)
95+
}
96+
})
97+
}

0 commit comments

Comments
 (0)