blob: 925d47a2e903594b13ad101a51dcdc0bcd75bc14 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build ignore
package server
import (
"strings"
"v.io/syncbase/v23/services/syncbase"
"v.io/v23/rpc"
"v.io/v23/security"
"v.io/v23/verror"
)
type dispatcher struct {
s *service
}
var _ rpc.Dispatcher = (*dispatcher)(nil)
func NewDispatcher(s *service) *dispatcher {
return &dispatcher{s: s}
}
// TODO(sadovsky): Return a real authorizer in various places below.
func (d *dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
suffix = strings.TrimPrefix(suffix, "/")
parts := strings.Split(suffix, "/")
// Validate all key atoms up front, so that we can avoid doing so in all our
// method implementations.
for _, s := range parts {
if !validKeyAtom(s) {
// TODO(sadovsky): Is it okay to pass a nil context to verror?
return nil, nil, syncbase.NewErrInvalidName(nil, suffix)
}
}
if len(parts) == 0 {
return syncbase.ServiceServer(d.s), nil, nil
}
universe := &universe{
name: parts[0],
s: d.s,
}
if len(parts) == 1 {
return syncbase.UniverseServer(universe), nil, nil
}
database := &database{
name: parts[1],
u: universe,
}
if len(parts) == 2 {
return syncbase.DatabaseServer(database), nil, nil
}
table := &table{
name: parts[2],
d: database,
}
if len(parts) == 3 {
return syncbase.TableServer(table), nil, nil
}
item := &item{
encodedKey: parts[3],
t: table,
}
if len(parts) == 4 {
return syncbase.ItemServer(item), nil, nil
}
// TODO(sadovsky): Is it okay to pass a nil context to verror?
return nil, nil, verror.NewErrNoExist(nil)
}