status-im/status-go

View on GitHub
connection/state.go

Summary

Maintainability
A
0 mins
Test Coverage
B
88%
package connection

import (
    "fmt"
)

// State represents device connection state and type,
// as reported by mobile framework.
//
// Zero value represents default assumption about network (online and unknown type).
type State struct {
    Offline   bool `json:"offline"`
    Type      Type `json:"type"`
    Expensive bool `json:"expensive"`
}

// Type represents description of available
// connection types as reported by React Native (see
// https://facebook.github.io/react-native/docs/netinfo.html)
// We're interested mainly in 'wifi' and 'cellular', but
// other types are also may be used.
type Type byte

const (
    Offline  = "offline"
    Wifi     = "wifi"
    Cellular = "cellular"
    Unknown  = "unknown"
    None     = "none"
)

// NewType creates new Type from string.
func NewType(s string) Type {
    switch s {
    case Cellular:
        return connectionCellular
    case Wifi:
        return connectionWifi
    }

    return connectionUnknown
}

// Type constants
const (
    connectionUnknown  Type = iota
    connectionCellular      // cellular, LTE, 4G, 3G, EDGE, etc.
    connectionWifi          // WIFI or iOS simulator
)

func (c State) IsExpensive() bool {
    return c.Expensive || c.Type == connectionCellular
}

// string formats ConnectionState for logs. Implements Stringer.
func (c State) String() string {
    if c.Offline {
        return Offline
    }

    var typ string
    switch c.Type {
    case connectionWifi:
        typ = Wifi
    case connectionCellular:
        typ = Cellular
    default:
        typ = Unknown
    }

    if c.Expensive {
        return fmt.Sprintf("%s (expensive)", typ)
    }

    return typ
}