blob: 2a4f41308be8fd0201b3b270000a335130efc978 [file] [log] [blame]
// Copyright (C) MongoDB, Inc. 2017-present.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
package command
import (
"errors"
"strings"
)
// Namespace encapsulates a database and collection name, which together
// uniquely identifies a collection within a MongoDB cluster.
type Namespace struct {
DB string
Collection string
}
// NewNamespace returns a new Namespace for the
// given database and collection.
func NewNamespace(db, collection string) Namespace { return Namespace{DB: db, Collection: collection} }
// ParseNamespace parses a namespace string into a Namespace.
//
// The namespace string must contain at least one ".", the first of which is the separator
// between the database and collection names. If not, the default (invalid) Namespace is returned.
func ParseNamespace(name string) Namespace {
index := strings.Index(name, ".")
if index == -1 {
return Namespace{}
}
return Namespace{
DB: name[:index],
Collection: name[index+1:],
}
}
// FullName returns the full namespace string, which is the result of joining the database
// name and the collection name with a "." character.
func (ns *Namespace) FullName() string {
return strings.Join([]string{ns.DB, ns.Collection}, ".")
}
// Validate validates the namespace.
func (ns *Namespace) Validate() error {
if err := ns.validateDB(); err != nil {
return err
}
return ns.validateCollection()
}
// validateDB ensures the database name is not an empty string, contain a ".",
// or contain a " ".
func (ns *Namespace) validateDB() error {
if ns.DB == "" {
return errors.New("database name cannot be empty")
}
if strings.Contains(ns.DB, " ") {
return errors.New("database name cannot contain ' '")
}
if strings.Contains(ns.DB, ".") {
return errors.New("database name cannot contain '.'")
}
return nil
}
// validateCollection ensures the collection name is not an empty string.
func (ns *Namespace) validateCollection() error {
if ns.Collection == "" {
return errors.New("collection name cannot be empty")
}
return nil
}