github.com/cayleygraph/cayley@v0.7.7/schema/namespaces.go (about) 1 package schema 2 3 import ( 4 "context" 5 "fmt" 6 "reflect" 7 8 "github.com/cayleygraph/cayley/graph" 9 "github.com/cayleygraph/quad" 10 "github.com/cayleygraph/quad/voc" 11 ) 12 13 type namespace struct { 14 _ struct{} `quad:"@type > cayley:namespace"` 15 Full quad.IRI `quad:"@id"` 16 Prefix quad.IRI `quad:"cayley:prefix"` 17 } 18 19 // WriteNamespaces will writes namespaces list into graph. 20 func (c *Config) WriteNamespaces(w quad.Writer, n *voc.Namespaces) error { 21 rules, err := c.rulesFor(reflect.TypeOf(namespace{})) 22 if err != nil { 23 return fmt.Errorf("can't load rules: %v", err) 24 } 25 wr := c.newWriter(w) 26 for _, ns := range n.List() { 27 obj := namespace{ 28 Full: quad.IRI(ns.Full), 29 Prefix: quad.IRI(ns.Prefix), 30 } 31 rv := reflect.ValueOf(obj) 32 if err = wr.writeValueAs(obj.Full, rv, "", rules); err != nil { 33 return err 34 } 35 } 36 return nil 37 } 38 39 // LoadNamespaces will load namespaces stored in graph to a specified list. 40 // If destination list is empty, global namespace registry will be used. 41 func (c *Config) LoadNamespaces(ctx context.Context, qs graph.QuadStore, dest *voc.Namespaces) error { 42 var list []namespace 43 if err := c.LoadTo(ctx, qs, &list); err != nil { 44 return err 45 } 46 register := dest.Register 47 if dest == nil { 48 register = voc.Register 49 } 50 for _, ns := range list { 51 register(voc.Namespace{ 52 Prefix: string(ns.Prefix), 53 Full: string(ns.Full), 54 }) 55 } 56 return nil 57 }