package packets
import (
"fmt"
"net"
"strconv"
"strings"
)
type Status struct {
code uint16
lines []string
}
func (s *Status) Code() uint16 {
return s.code
}
func (s *Status) String() string {
out := ""
for i, l := range s.lines {
if i == len(s.lines)-1 {
out = fmt.Sprintf("%s%d %s\r\n", out, s.code, l)
} else {
out = fmt.Sprintf("%s%d-%s\r\n", out, s.code, l)
}
}
return out
}
func (s *Status) SafeString() string {
out := ""
for i, l := range s.lines {
if i == len(s.lines)-1 {
out = fmt.Sprintf("%s%d %s\\r\\n", out, s.code, l)
} else {
out = fmt.Sprintf("%s%d-%s\\r\\n", out, s.code, l)
}
}
return out
}
func (s *Status) Bytes() []byte {
return []byte(s.String())
}
func (s *Status) Send(c net.Conn) error {
_, err := c.Write(s.Bytes())
return err
}
func ParseStatus(b []byte) (*Status, error) {
code, err := strconv.Atoi(string(b[:3]))
if err != nil {
return nil, err
}
bstr := strings.TrimSpace(string(b))
var stat *Status
lines := strings.Split(bstr, "\r\n")
for i := range lines {
if len(lines[i]) > 4 {
lines[i] = lines[i][4:]
}
}
stat = NewStatus(uint16(code), lines...)
return stat, nil
}
func NewStatus(code uint16, lines ...string) (*Status) {
return &Status{code, lines}
}