blob: 3913e210d9592be15e553a645b92cd705b35dc68 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You 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 bufimagebuild
import (
"context"
)
import (
"go.uber.org/zap"
)
import (
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufanalysis"
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufimage"
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufmodule"
"github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufmodule/bufmoduleref"
)
// Builder builds Protobuf files into Images.
type Builder interface {
// Build runs compilation.
//
// The FileRefs are assumed to have been created by a FileRefProvider, that is
// they are unique relative to the roots.
//
// If an error is returned, it is a system error.
// Only one of Image and FileAnnotations will be returned.
//
// FileAnnotations will use external file paths.
Build(
ctx context.Context,
module bufmodule.Module,
options ...BuildOption,
) (bufimage.Image, []bufanalysis.FileAnnotation, error)
}
// NewBuilder returns a new Builder.
func NewBuilder(logger *zap.Logger, moduleReader bufmodule.ModuleReader) Builder {
return newBuilder(logger, moduleReader)
}
// BuildOption is an option for Build.
type BuildOption func(*buildOptions)
// WithExcludeSourceCodeInfo returns a BuildOption that excludes sourceCodeInfo.
func WithExcludeSourceCodeInfo() BuildOption {
return func(buildOptions *buildOptions) {
buildOptions.excludeSourceCodeInfo = true
}
}
// WithExpectedDirectDependencies sets the module dependencies that are expected, usually because
// they are in a configuration file (buf.yaml). If the build detects that there are direct dependencies
// outside of this list, a warning will be printed.
func WithExpectedDirectDependencies(expectedDirectDependencies []bufmoduleref.ModuleReference) BuildOption {
return func(buildOptions *buildOptions) {
buildOptions.expectedDirectDependencies = expectedDirectDependencies
}
}
// WithWorkspace sets the workspace to be read from instead of ModuleReader, and to not warn imports for.
//
// TODO: this can probably be dealt with by finding out if an ImageFile has a commit
// or not, although that is hacky, that's an implementation detail in practice, but perhaps
// we could justify it - transitive dependencies without commits don't make sense?
//
// TODO: shouldn't buf.yamls in workspaces have deps properly declared in them anyways? Why not warn?
func WithWorkspace(workspace bufmodule.Workspace) BuildOption {
return func(buildOptions *buildOptions) {
buildOptions.workspace = workspace
}
}