Files
go-roots/events/validated_event.go
2026-05-22 10:08:10 -04:00

59 lines
1.8 KiB
Go

package events
// ValidatedEvent is an immutable wrapper around a fully validated event. It
// shares no memory with the original Event struct.
//
// When created with NewValidatedEvent, the wrapped event is guaranteed to:
// - have a valid structure
// - have a valid ID
// - have a valid signature
type ValidatedEvent struct {
event Event
}
// NewValidatedEvent validates the provided Event. If valid, returns an
// immutable ValidatedEvent. Otherwise returns an error.
func NewValidatedEvent(e Event) (ValidatedEvent, error) {
if err := Validate(e); err != nil {
return ValidatedEvent{}, err
}
e.Tags = deepCopyTags(e.Tags)
return ValidatedEvent{event: e}, nil
}
func (v ValidatedEvent) ID() string { return v.event.ID }
func (v ValidatedEvent) PubKey() string { return v.event.PubKey }
func (v ValidatedEvent) CreatedAt() int64 { return v.event.CreatedAt }
func (v ValidatedEvent) Kind() int { return v.event.Kind }
func (v ValidatedEvent) Content() string { return v.event.Content }
func (v ValidatedEvent) Sig() string { return v.event.Sig }
// Tags returns a deep copy of the event's tag list. The returned slice shares
// no memory with the ValidatedEvent.
func (v ValidatedEvent) Tags() []Tag { return deepCopyTags(v.event.Tags) }
// Event returns a deep copy of the underlying Event. The returned Event shares
// no memory with the ValidatedEvent.
func (v ValidatedEvent) Event() Event {
e := v.event
e.Tags = deepCopyTags(v.event.Tags)
return e
}
func deepCopyTags(tags []Tag) []Tag {
if tags == nil {
return nil
}
cp := make([]Tag, len(tags))
for i, tag := range tags {
tagcp := make(Tag, len(tag))
copy(tagcp, tag)
cp[i] = tagcp
}
return cp
}
func (v ValidatedEvent) MarshalJSON() ([]byte, error) {
return v.event.MarshalJSON()
}