package wire import ( "fmt" "io" ) // Reads the status, and if failure, reads the message and returns it as an error. // If the status is success, doesn't read the message. // req is just used to populate the AdbError, and can be nil. func ReadStatusFailureAsError(s Scanner, req string) error { status, err := s.ReadStatus() if err != nil { return fmt.Errorf("error reading status for %s: %+v", req, err) } if !status.IsSuccess() { msg, err := s.ReadMessage() if err != nil { return fmt.Errorf("server returned error for %s, but couldn't read the error message: %+v", err) } return &AdbError{ Request: req, ServerMsg: string(msg), } } return nil } // writeFully writes all of data to w. // Inverse of io.ReadFully(). func writeFully(w io.Writer, data []byte) error { for len(data) > 0 { n, err := w.Write(data) if err != nil { return err } data = data[n:] } return nil }