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 keepANSI bool 28} 29 30// NewSimpleStatusOutput returns a StatusOutput that represents the 31// current build status similarly to Ninja's built-in terminal 32// output. 33func NewSimpleStatusOutput(w io.Writer, formatter formatter, keepANSI bool) status.StatusOutput { 34 return &simpleStatusOutput{ 35 writer: w, 36 formatter: formatter, 37 keepANSI: keepANSI, 38 } 39} 40 41func (s *simpleStatusOutput) Message(level status.MsgLevel, message string) { 42 if level >= status.StatusLvl { 43 output := s.formatter.message(level, message) 44 if !s.keepANSI { 45 output = string(stripAnsiEscapes([]byte(output))) 46 } 47 fmt.Fprintln(s.writer, output) 48 } 49} 50 51func (s *simpleStatusOutput) StartAction(action *status.Action, counts status.Counts) { 52} 53 54func (s *simpleStatusOutput) FinishAction(result status.ActionResult, counts status.Counts) { 55 str := result.Description 56 if str == "" { 57 str = result.Command 58 } 59 60 progress := s.formatter.progress(counts) + str 61 62 output := s.formatter.result(result) 63 if !s.keepANSI { 64 output = string(stripAnsiEscapes([]byte(output))) 65 } 66 67 if output != "" { 68 fmt.Fprint(s.writer, progress, "\n", output) 69 } else { 70 fmt.Fprintln(s.writer, progress) 71 } 72} 73 74func (s *simpleStatusOutput) Flush() {} 75 76func (s *simpleStatusOutput) Write(p []byte) (int, error) { 77 fmt.Fprint(s.writer, string(p)) 78 return len(p), nil 79} 80