| // 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 |
| } |