stillbox/pkg/talkgroups/talkgroup.go

121 lines
2.2 KiB
Go
Raw Normal View History

2024-11-03 08:09:49 -05:00
package talkgroups
import (
2024-11-25 09:44:12 -05:00
"encoding"
"encoding/json"
"errors"
2024-11-03 08:09:49 -05:00
"fmt"
"strconv"
2024-11-25 09:44:12 -05:00
"strings"
2024-11-03 09:45:51 -05:00
"dynatron.me/x/stillbox/pkg/database"
2025-01-21 08:43:03 -05:00
"dynatron.me/x/stillbox/pkg/rbac"
2024-11-03 08:09:49 -05:00
)
2024-11-03 09:45:51 -05:00
type Talkgroup struct {
database.Talkgroup
System database.System `json:"system"`
Learned bool `json:"learned"`
}
func (t *Talkgroup) GetResourceName() string {
2025-01-21 08:43:03 -05:00
return rbac.ResourceTalkgroup
}
func (t Talkgroup) String() string {
if t.System.Name == "" {
t.System.Name = strconv.Itoa(int(t.Talkgroup.TGID))
}
if t.Talkgroup.Name != nil || t.Talkgroup.TGGroup != nil || t.Talkgroup.AlphaTag != nil {
return t.System.Name + " " + t.Talkgroup.String()
}
2024-11-13 09:24:11 -05:00
return fmt.Sprintf("%s:%d", t.System.Name, int(t.Talkgroup.TGID))
2024-11-07 23:17:16 -05:00
}
type Metadata map[string]interface{}
2024-11-03 08:09:49 -05:00
type ID struct {
System uint32 `json:"sys"`
Talkgroup uint32 `json:"tg"`
2024-11-03 08:09:49 -05:00
}
2024-11-25 09:44:12 -05:00
var _ encoding.TextUnmarshaler = (*ID)(nil)
var ErrBadTG = errors.New("bad talkgroup format")
func (tid *ID) UnmarshalJSON(j []byte) error {
// this is a dirty hack since we cannot implement both TextUnmarshaler
// and json.Unmarshaler at the same time. sigh.
v := &struct {
System uint32 `json:"sys"`
2024-11-25 09:44:12 -05:00
Talkgroup uint32 `json:"tg"`
}{}
2024-11-25 09:44:12 -05:00
if tid != nil {
v.System, v.Talkgroup = tid.System, tid.Talkgroup
}
err := json.Unmarshal(j, v)
if err != nil {
return err
}
tid.System, tid.Talkgroup = v.System, v.Talkgroup
return nil
}
func (tid *ID) UnmarshalText(txt []byte) error {
ar := strings.Split(string(txt), ":")
switch len(ar) {
case 2:
sys, err := strconv.Atoi(ar[0])
if err != nil {
return err
}
tid.System = uint32(sys)
fallthrough
case 1:
tg, err := strconv.Atoi(ar[len(ar)-1])
if err != nil {
return err
}
tid.Talkgroup = uint32(tg)
default:
return ErrBadTG
}
return nil
}
2024-11-04 11:15:24 -05:00
type IDs []ID
2024-11-15 10:37:58 -05:00
func (t IDs) Tuples() database.TGTuples {
sys := make([]uint32, len(t))
tg := make([]uint32, len(t))
for i := range t {
sys[i] = t[i].System
tg[i] = t[i].Talkgroup
2024-11-04 11:15:24 -05:00
}
2024-11-15 10:37:58 -05:00
return database.TGTuples{sys, tg}
2024-11-04 11:15:24 -05:00
}
2024-11-07 12:53:20 -05:00
type intId interface {
int | uint | int64 | uint64 | int32 | uint32
}
func TG[T intId, U intId](sys T, tgid U) ID {
2024-11-03 08:09:49 -05:00
return ID{
System: uint32(sys),
Talkgroup: uint32(tgid),
}
}
func (t ID) String() string {
return fmt.Sprintf("%d:%d", t.System, t.Talkgroup)
}