mirror of https://github.com/cjbassi/gotop.git
148 lines
4.1 KiB
Go
148 lines
4.1 KiB
Go
// battery
|
|
// Copyright (C) 2016-2017 Karol 'Kenji Takahashi' Woźniak
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the "Software"),
|
|
// to deal in the Software without restriction, including without limitation
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
// and/or sell copies of the Software, and to permit persons to whom the
|
|
// Software is furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
|
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
package battery
|
|
|
|
import "fmt"
|
|
|
|
// ErrNotFound variable represents battery not found error.
|
|
//
|
|
// Only ever returned wrapped in ErrFatal.
|
|
var ErrNotFound = fmt.Errorf("Not found")
|
|
|
|
// ErrAllNotNil variable says that backend returned ErrPartial with
|
|
// all fields having not nil values, hence it was converted to ErrFatal.
|
|
//
|
|
// Only ever returned wrapped in ErrFatal.
|
|
var ErrAllNotNil = fmt.Errorf("All fields had not nil errors")
|
|
|
|
// ErrFatal type represents a fatal error.
|
|
//
|
|
// It indicates that either the library was not able to perform some kind
|
|
// of operation critical to retrieving any data, or all partials have failed at
|
|
// once (which would be equivalent to returning a ErrPartial with no nils).
|
|
//
|
|
// As such, the caller should assume that no meaningful data was
|
|
// returned alongside the error and act accordingly.
|
|
type ErrFatal struct {
|
|
Err error // The actual error that happened.
|
|
}
|
|
|
|
func (f ErrFatal) Error() string {
|
|
return fmt.Sprintf("Could not retrieve battery info: `%s`", f.Err)
|
|
}
|
|
|
|
// ErrPartial type represents a partial error.
|
|
//
|
|
// It indicates that there were problems retrieving some of the data,
|
|
// but some was also retrieved successfully.
|
|
// If there would be all nils, nil is returned instead.
|
|
// If there would be all not nils, ErrFatal is returned instead.
|
|
//
|
|
// The fields represent fields in the Battery type.
|
|
type ErrPartial struct {
|
|
State error
|
|
Current error
|
|
Full error
|
|
Design error
|
|
ChargeRate error
|
|
Voltage error
|
|
DesignVoltage error
|
|
}
|
|
|
|
func (p ErrPartial) Error() string {
|
|
if p.isNil() {
|
|
return "{}"
|
|
}
|
|
errors := map[string]error{
|
|
"State": p.State,
|
|
"Current": p.Current,
|
|
"Full": p.Full,
|
|
"Design": p.Design,
|
|
"ChargeRate": p.ChargeRate,
|
|
"Voltage": p.Voltage,
|
|
"DesignVoltage": p.DesignVoltage,
|
|
}
|
|
keys := []string{"State", "Current", "Full", "Design", "ChargeRate", "Voltage", "DesignVoltage"}
|
|
s := "{"
|
|
for _, name := range keys {
|
|
err := errors[name]
|
|
if err != nil {
|
|
s += fmt.Sprintf("%s:%s ", name, err.Error())
|
|
}
|
|
}
|
|
return s[:len(s)-1] + "}"
|
|
}
|
|
|
|
func (p ErrPartial) isNil() bool {
|
|
return p.State == nil &&
|
|
p.Current == nil &&
|
|
p.Full == nil &&
|
|
p.Design == nil &&
|
|
p.ChargeRate == nil &&
|
|
p.Voltage == nil &&
|
|
p.DesignVoltage == nil
|
|
}
|
|
|
|
func (p ErrPartial) noNil() bool {
|
|
return p.State != nil &&
|
|
p.Current != nil &&
|
|
p.Full != nil &&
|
|
p.Design != nil &&
|
|
p.ChargeRate != nil &&
|
|
p.Voltage != nil &&
|
|
p.DesignVoltage != nil
|
|
}
|
|
|
|
// Errors type represents an array of ErrFatal, ErrPartial or nil values.
|
|
//
|
|
// Can only possibly be returned by GetAll() call.
|
|
type Errors []error
|
|
|
|
func (e Errors) Error() string {
|
|
s := "["
|
|
for _, err := range e {
|
|
if err != nil {
|
|
s += err.Error() + " "
|
|
}
|
|
}
|
|
if len(s) > 1 {
|
|
s = s[:len(s)-1]
|
|
}
|
|
return s + "]"
|
|
}
|
|
|
|
func wrapError(err error) error {
|
|
if perr, ok := err.(ErrPartial); ok {
|
|
if perr.isNil() {
|
|
return nil
|
|
}
|
|
if perr.noNil() {
|
|
return ErrFatal{ErrAllNotNil}
|
|
}
|
|
return perr
|
|
}
|
|
if err != nil {
|
|
return ErrFatal{err}
|
|
}
|
|
return nil
|
|
}
|