git.sophuwu.com > statlog   
              96
            
             package device

import (
	"encoding/json"
	"fmt"
	"git.sophuwu.com/statlog/types"
	"os"
	"strings"
)

type MEM struct {
	Total   types.Bytes `json:"Total"`
	Free    types.Bytes `json:"Free"`
	Buffer  types.Bytes `json:"Buffer"`
	Used    types.Bytes `json:"Used"`
	Percent struct {
		Used types.Percent `json:"Used"`
		Buff types.Percent `json:"Buff"`
		Free types.Percent `json:"Free"`
	} `json:"Percent"`
}

func (m *MEM) Update() {
	b := make([]byte, 140)
	f, _ := os.Open("/proc/meminfo")
	_, err := f.Read(b)
	if err != nil {
		return
	}
	f.Close()
	var seeker types.NumSeeker
	seeker.Init(b)
	m.Total.FromKiB(seeker.GetNum())
	m.Free.FromKiB(seeker.GetNum())
	m.Used.FromKiB(seeker.GetNum())
	m.Used = m.Total - m.Used
	m.Buffer.FromKiB(seeker.GetNum() + seeker.GetNum())
	m.Percent.Used.CalcBytes(m.Used, m.Total)
	m.Percent.Buff.CalcBytes(m.Buffer, m.Total)
	m.Percent.Free.CalcBytes(m.Free, m.Total)
}

func (m *MEM) String() string {
	return fmt.Sprintf("%s (%s) USED  %s BUFF  %s FREE", m.Used, m.Percent.Used.Compact(), m.Buffer, m.Free)
}

func (m *MEM) Bar() (string, error) {
	w, _ := types.TermSize()
	if w < 40 {
		return "", fmt.Errorf("terminal too narrow")
	}

	s := "MEM: "
	// s += "[\033[1;35m" + m.Used.Human() + " USED\033[0m  "
	// s += "\033[1;36m" + m.Buffer.Human() + " BUFF\033[0m  "
	// s += "\033[1;32m" + m.Free.Human() + " FREE\033[0m]"
	s += "[\033[1;35mUSED\033[0m/"
	s += "\033[1;36mBUFF\033[0m/"
	s += "\033[1;32mFREE\033[0m] "

	l := len(strings.NewReplacer("\033[1;32m", "", "\033[1;36m", "", "\033[1;35m", "", "\033[0m", "").Replace(s))
	w -= l
	if w < 40 {
		return "", fmt.Errorf("terminal too narrow")
	}
	w -= 2

	s += "[\033[1;35m"
	i, ul := 0, int(m.Percent.Used.Value()*float64(w)/100)
	c := m.Percent.Used.Compact()
	s += c
	for i = len(c); i < w && i < ul; i++ {
		s += "|"
	}
	s += "\033[0m\033[1;36m"
	c = m.Percent.Buff.Compact()
	s += c
	i += len(c)
	for ul += int(m.Percent.Buff.Value() * float64(w) / 100); i < w && i < ul; i++ {
		s += "|"
	}
	s += "\033[0m\033[1;32m"
	c = m.Percent.Free.Compact()
	s += c
	i += len(c)
	for ; i < w; i++ {
		s += "|"
	}
	s += "\033[0m]"
	return s, nil
}

func (m *MEM) JSON() (string, error) {
	b, e := json.Marshal(m)
	return string(b), e
}