ppforge/protocol/protocol.go

108 lines
2.1 KiB
Go

package protocol
import (
"encoding/json"
"fmt"
"io/fs"
"os"
)
type Protocol struct {
Metadata ProtocolMeta
Structure []*Field
DefaultValues []DefaultValue
JavaScript string
}
func (p Protocol) ToJson() string {
data, err := json.MarshalIndent(p, "", " ")
if err != nil {
return ""
}
return string(data)
}
func NewProtocolStructure() *Protocol {
p := Protocol{}
return &p
}
func (prot *Protocol) AppendField(field Field) int {
i := len(prot.Structure)
prot.Structure = append(prot.Structure, &field)
return i + 1
}
func (prot *Protocol) AddField(index int, field *Field) {
if len(prot.Structure) == index {
prot.AppendField(*field)
return
}
ret := make([]*Field, 0)
ret = append(ret, prot.Structure[:index]...)
ret = append(ret, field)
ret = append(ret, prot.Structure[index:]...)
prot.Structure = ret
}
func (prot *Protocol) UpdateFieldByName(name string, field *Field) {
var fnd int = -1
for i, f := range prot.Structure {
if f.Name == name {
fnd = i
}
}
if fnd != -1 {
prot.Structure[fnd] = field
}
}
func (prot *Protocol) UpdateFieldByElement(element int, field *Field) {
prot.Structure[element] = field
}
func (prot *Protocol) RemoveFieldByName(name string) {
element := -1
for i, f := range prot.Structure {
if f.Name == name {
element = i
}
}
if element == -1 {
return
}
prot.RemoveFieldByElement(element)
}
func (prot *Protocol) RemoveFieldByElement(field int) {
ret := make([]*Field, 0)
for i, f := range prot.Structure {
if i != field {
fmt.Printf("appending %d, %s\n", i, f.ToJson())
ret = append(ret, f)
}
}
prot.Structure = ret
}
func (prot *Protocol) Load(path string) error {
data, err := os.ReadFile(path)
if err != nil {
return err
}
err = json.Unmarshal(data, prot)
return err
}
func (prot *Protocol) Save(path string) error {
data, err := json.MarshalIndent(*prot, "", " ")
if err != nil {
return err
}
err = os.WriteFile(path, data, fs.ModeAppend)
return err
}
func LoadNew(path string) (*Protocol, error) {
prot := NewProtocolStructure()
err := prot.Load(path)
return prot, err
}