diff --git a/README.md b/README.md index cf907b4..214da70 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,8 @@ out, _ := evt.ToXML() Note: the `groupOwner` attribute is mandatory for TAK chat messages. It must be present for schema validation to succeed when using the TAK chat format. +See `examples/group_chat_example.go` for an example of parsing and validating a TAK group chat message. + Delivery or read receipts can be sent by populating `Detail.ChatReceipt` with the appropriate `Ack`, `ID`, and `MessageID` fields. diff --git a/examples/group_chat_example.go b/examples/group_chat_example.go new file mode 100644 index 0000000..16f66fa --- /dev/null +++ b/examples/group_chat_example.go @@ -0,0 +1,60 @@ +//go:build ignore + +package main + +import ( + "context" + "encoding/xml" + "fmt" + "log/slog" + "os" + + "github.com/NERVsystems/cotlib" + "github.com/NERVsystems/cotlib/validator" +) + +func main() { + logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) + cotlib.SetLogger(logger) + ctx := cotlib.WithLogger(context.Background(), logger) + + xmlInput := ` + + + + <__chat chatroom="room" groupOwner="false" id="1" senderCallsign="Bravo"> + + + +` + + evt, err := cotlib.UnmarshalXMLEvent(ctx, []byte(xmlInput)) + if err != nil { + logger.Error("failed to parse event", "err", err) + return + } + + c := evt.Detail.Chat + fmt.Printf("Chatroom: %s\n", c.Chatroom) + fmt.Printf("GroupOwner: %s\n", c.GroupOwner) + fmt.Printf("SenderCallsign: %s\n", c.SenderCallsign) + + if err := evt.Validate(); err != nil { + logger.Error("Event validation failed", "err", err) + return + } + fmt.Println("Event validated via Event.Validate") + + data, err := xml.Marshal(c) + if err != nil { + logger.Error("marshal chat", "err", err) + return + } + if err := validator.ValidateAgainstSchema("tak-details-__chat", data); err != nil { + logger.Error("schema validation failed", "err", err) + return + } + fmt.Println("Chat validated with tak-details-__chat schema") + + cotlib.ReleaseEvent(evt) +}