diff options
Diffstat (limited to 'vendor/github.com/superseriousbusiness/activity/streams/util.go')
-rw-r--r-- | vendor/github.com/superseriousbusiness/activity/streams/util.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/vendor/github.com/superseriousbusiness/activity/streams/util.go b/vendor/github.com/superseriousbusiness/activity/streams/util.go new file mode 100644 index 000000000..501a3b66a --- /dev/null +++ b/vendor/github.com/superseriousbusiness/activity/streams/util.go @@ -0,0 +1,66 @@ +package streams + +import ( + "github.com/superseriousbusiness/activity/streams/vocab" +) + +const ( + // jsonLDContext is the key for the JSON-LD specification's context + // value. It contains the definitions of the types contained within the + // rest of the payload. Important for linked-data representations, but + // only applicable to go-fed at code-generation time. + jsonLDContext = "@context" +) + +// Serialize adds the context vocabularies contained within the type +// into the JSON-LD @context field, and aliases them appropriately. +func Serialize(a vocab.Type) (m map[string]interface{}, e error) { + m, e = a.Serialize() + if e != nil { + return + } + v := a.JSONLDContext() + // Transform the map of vocabulary-to-aliases into a context payload, + // but do so in a way that at least keeps it readable for other humans. + var contextValue interface{} + if len(v) == 1 { + for vocab, alias := range v { + if len(alias) == 0 { + contextValue = vocab + } else { + contextValue = map[string]string{ + alias: vocab, + } + } + } + } else { + var arr []interface{} + aliases := make(map[string]string) + for vocab, alias := range v { + if len(alias) == 0 { + arr = append(arr, vocab) + } else { + aliases[alias] = vocab + } + } + if len(aliases) > 0 { + arr = append(arr, aliases) + } + contextValue = arr + } + // TODO: Update the context instead if it already exists + m[jsonLDContext] = contextValue + // TODO: Sort the context based on arbitrary order. + // Delete any existing `@context` in child maps. + var cleanFnRecur func(map[string]interface{}) + cleanFnRecur = func(r map[string]interface{}) { + for _, v := range r { + if n, ok := v.(map[string]interface{}); ok { + delete(n, jsonLDContext) + cleanFnRecur(n) + } + } + } + cleanFnRecur(m) + return +} |