1// Copyright 2019 Google Inc. All rights reserved. 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 15package terminal 16 17import ( 18 "fmt" 19 "io" 20 21 "android/soong/ui/status" 22) 23 24type simpleStatusOutput struct { 25 writer io.Writer 26 formatter formatter 27} 28 29// NewSimpleStatusOutput returns a StatusOutput that represents the 30// current build status similarly to Ninja's built-in terminal 31// output. 32func NewSimpleStatusOutput(w io.Writer, formatter formatter) status.StatusOutput { 33 return &simpleStatusOutput{ 34 writer: w, 35 formatter: formatter, 36 } 37} 38 39func (s *simpleStatusOutput) Message(level status.MsgLevel, message string) { 40 if level >= status.StatusLvl { 41 fmt.Fprintln(s.writer, s.formatter.message(level, message)) 42 } 43} 44 45func (s *simpleStatusOutput) StartAction(action *status.Action, counts status.Counts) { 46} 47 48func (s *simpleStatusOutput) FinishAction(result status.ActionResult, counts status.Counts) { 49 str := result.Description 50 if str == "" { 51 str = result.Command 52 } 53 54 progress := s.formatter.progress(counts) + str 55 56 output := s.formatter.result(result) 57 output = string(stripAnsiEscapes([]byte(output))) 58 59 if output != "" { 60 fmt.Fprint(s.writer, progress, "\n", output) 61 } else { 62 fmt.Fprintln(s.writer, progress) 63 } 64} 65 66func (s *simpleStatusOutput) Flush() {} 67 68func (s *simpleStatusOutput) Write(p []byte) (int, error) { 69 fmt.Fprint(s.writer, string(p)) 70 return len(p), nil 71} 72