blob: db6826aebacdc3a93a7eab9a5fca09fcab5b6927 [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 bufpluginexec
import (
"bytes"
"errors"
"io"
)
type protocGenSwiftStderrWriteCloser struct {
delegate io.Writer
buffer *bytes.Buffer
}
func newProtocGenSwiftStderrWriteCloser(delegate io.Writer) io.WriteCloser {
return &protocGenSwiftStderrWriteCloser{
delegate: delegate,
buffer: bytes.NewBuffer(nil),
}
}
func (p *protocGenSwiftStderrWriteCloser) Write(data []byte) (int, error) {
// If protoc-gen-swift, we want to capture all the stderr so we can process it.
return p.buffer.Write(data)
}
func (p *protocGenSwiftStderrWriteCloser) Close() error {
data := p.buffer.Bytes()
if len(data) == 0 {
return nil
}
newData := bytes.ReplaceAll(
data,
// If swift-protobuf changes their error message, this may not longer filter properly
// but this is OK - this filtering should be treated as non-critical.
// https://github.com/apple/swift-protobuf/blob/c3d060478fcf1f564be0a3876bde8c04247793ae/Sources/protoc-gen-swift/main.swift#L244
//
// Note that our heuristic as to whether this is protoc-gen-swift or not for isProtocGenSwift
// is that the binary is named protoc-gen-swift, and protoc-gen-swift will print the binary name
// before any message to stderr, so given our protoc-gen-swift heuristic, this is the
// error message that will be printed.
// https://github.com/apple/swift-protobuf/blob/c3d060478fcf1f564be0a3876bde8c04247793ae/Sources/protoc-gen-swift/FileIo.swift#L19
//
// Tested manually on Mac.
// TODO: Test manually on Windows.
[]byte("protoc-gen-swift: WARNING: unknown version of protoc, use 3.2.x or later to ensure JSON support is correct.\n"),
nil,
)
if len(newData) == 0 {
return nil
}
n, err := p.delegate.Write(newData)
if err != nil {
return err
}
if n != len(newData) {
return errors.New("incomplete write")
}
return nil
}