Skip to content

Instantly share code, notes, and snippets.

@DivinityArcane
Created May 11, 2014 22:56
Show Gist options
  • Save DivinityArcane/53bfd0f6af41d2cb493d to your computer and use it in GitHub Desktop.
Save DivinityArcane/53bfd0f6af41d2cb493d to your computer and use it in GitHub Desktop.
package network
import (
"strings"
)
type Packet struct {
Command, Parameter, Body string
Arguments map[string]string
SubPacket *Packet
}
func NewPacket(command, parameter string) Packet {
p := Packet{}
p.Command = command
p.Parameter = parameter
return p
}
func (p *Packet) SetBody(body string) {
p.Body = body
}
func (p *Packet) AddArgument(key, value string) {
if p.Arguments == nil {
p.Arguments = make(map[string]string)
}
p.Arguments[key] = value
}
func (p *Packet) RemoveArgument(key string) {
if p.Arguments != nil {
delete(p.Arguments, key)
}
}
func (p *Packet) String() string {
if p == nil {
return ""
}
data := p.Command
if p.Parameter != "" {
data += " " + p.Parameter
}
data += "\n"
if p.Arguments != nil {
for k, v := range p.Arguments {
data += k + "=" + v + "\n"
}
}
if p.Body != "" {
data += "\n" + p.Body
}
return data
}
func ParsePacket(data string) Packet {
p := Packet{}
if !strings.Contains(data, "\n") {
return p
}
sub := strings.Index(data, "\n\n")
if sub != -1 {
p.Body = data[sub+2:]
data = data[:sub]
if strings.Contains(p.Body, "\n") && (strings.Contains(p.Body, " ") || strings.Contains(p.Body, "=")) {
sub := ParsePacket(p.Body)
p.Body = ""
p.SubPacket = &sub
}
}
for _, chunk := range strings.Split(data, "\n") {
if pos := strings.Index(chunk, "="); pos != -1 {
p.AddArgument(chunk[:pos], chunk[pos+1:])
} else if pos := strings.Index(chunk, " "); pos != -1 {
p.Command = chunk[:pos]
p.Parameter = chunk[pos+1:]
} else if len(chunk) > 1 {
p.Command = chunk
}
}
return p
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment