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  }