twink/vendor/sourcery.dny.nu/pana/pana.go

59 lines
1.5 KiB
Go
Raw Normal View History

2025-12-05 12:20:05 +01:00
package pana
import (
"unsafe"
ld "sourcery.dny.nu/longdistance"
)
// Has checks if an object has a specific property set.
//
// It handles JSON-LD keyword aliasses for id and type.
func Has[T ld.Internal](in *T, property string) bool {
if property == "id" {
property = ld.KeywordID
}
if property == "type" {
property = ld.KeywordType
}
return (*ld.Node)(unsafe.Pointer(in)).Has(property)
}
// IsReference indicates if this object is a reference.
//
// This means it only has the ID, and optionally a Type, set. You'll need to
// retrieve the object using the ID to get additional properties.
func IsReference[T ld.Internal](in *T) bool {
return (*ld.Node)(unsafe.Pointer(in)).IsSubjectReference()
}
// IsObject indicates if this object is a (partially) complete object.
//
// This means it has an ID, optionally a Type and at least one other
// property. It doesn't mean the object representation is complete, and you may
// need to retrieve the object using the ID to get additional properties.
func IsObjec[T ld.Internal](in *T) bool {
return (*ld.Node)(unsafe.Pointer(in)).IsSubject()
}
// Properties returns a set with an entry for each property set on an object.
//
// It handles JSON-LD keyword aliasses for id and type.
func Properties[T ld.Internal](in *T) map[string]struct{} {
s := (*ld.Node)(unsafe.Pointer(in)).PropertySet()
if _, ok := s[ld.KeywordID]; ok {
delete(s, ld.KeywordID)
s["id"] = struct{}{}
}
if _, ok := s[ld.KeywordType]; ok {
delete(s, ld.KeywordType)
s["type"] = struct{}{}
}
return s
}