ipfs-cluster/ipfs-cluster-ctl/formatters.go
Hector Sanjuan cc8c9da28d Fixes #100: EOF responses when cluster peer is not responding
The ReadTimeout for the API was the same as for RPC. So the error
did not have time to be correctly returned to the client.

License: MIT
Signed-off-by: Hector Sanjuan <hector@protocol.ai>
2017-05-18 13:16:27 +02:00

128 lines
2.6 KiB
Go

package main
import (
"encoding/json"
"fmt"
"strings"
"github.com/ipfs/ipfs-cluster/api"
)
const (
formatNone = iota
formatID
formatGPInfo
formatString
formatVersion
formatPin
formatError
)
type format int
func textFormat(body []byte, format int) {
if len(body) < 2 {
fmt.Println("")
}
slice := body[0] == '['
if slice {
textFormatSlice(body, format)
} else {
textFormatObject(body, format)
}
}
func textFormatObject(body []byte, format int) {
switch format {
case formatID:
var obj api.IDSerial
textFormatDecodeOn(body, &obj)
textFormatPrintIDSerial(&obj)
case formatGPInfo:
var obj api.GlobalPinInfoSerial
textFormatDecodeOn(body, &obj)
textFormatPrintGPinfo(&obj)
case formatVersion:
var obj api.Version
textFormatDecodeOn(body, &obj)
textFormatPrintVersion(&obj)
case formatPin:
var obj api.PinSerial
textFormatDecodeOn(body, &obj)
textFormatPrintPin(&obj)
case formatError:
var obj api.Error
textFormatDecodeOn(body, &obj)
textFormatPrintError(&obj)
default:
var obj interface{}
textFormatDecodeOn(body, &obj)
fmt.Printf("%s\n", obj)
}
}
func textFormatSlice(body []byte, format int) {
var rawMsg []json.RawMessage
textFormatDecodeOn(body, &rawMsg)
for _, raw := range rawMsg {
textFormatObject(raw, format)
}
}
func textFormatDecodeOn(body []byte, obj interface{}) {
checkErr("decoding JSON", json.Unmarshal(body, obj))
}
func textFormatPrintIDSerial(obj *api.IDSerial) {
if obj.Error != "" {
fmt.Printf("%s | ERROR: %s\n", obj.ID, obj.Error)
return
}
fmt.Printf("%s | %d peers\n", obj.ID, len(obj.ClusterPeers))
fmt.Println(" > Addresses:")
for _, a := range obj.Addresses {
fmt.Printf(" - %s\n", a)
}
if obj.IPFS.Error != "" {
fmt.Printf(" > IPFS ERROR: %s\n", obj.IPFS.Error)
return
}
fmt.Printf(" > IPFS: %s\n", obj.IPFS.ID)
for _, a := range obj.IPFS.Addresses {
fmt.Printf(" - %s\n", a)
}
}
func textFormatPrintGPinfo(obj *api.GlobalPinInfoSerial) {
fmt.Printf("%s :\n", obj.Cid)
for k, v := range obj.PeerMap {
if v.Error != "" {
fmt.Printf(" > Peer %s: ERROR | %s\n", k, v.Error)
continue
}
fmt.Printf(" > Peer %s: %s | %s\n", k, strings.ToUpper(v.Status), v.TS)
}
}
func textFormatPrintVersion(obj *api.Version) {
fmt.Println(obj.Version)
}
func textFormatPrintPin(obj *api.PinSerial) {
fmt.Printf("%s | Allocations: ", obj.Cid)
if obj.ReplicationFactor < 0 {
fmt.Printf("[everywhere]\n")
} else {
fmt.Printf("%s\n", obj.Allocations)
}
}
func textFormatPrintError(obj *api.Error) {
fmt.Printf("An error ocurred:\n")
fmt.Printf(" Code: %d\n", obj.Code)
fmt.Printf(" Message: %s\n", obj.Message)
}