mediapipe/mediapipe/framework/tool/validate_name.h
MediaPipe Team cc6a2f7af6 Project import generated by Copybara.
GitOrigin-RevId: 73d686c40057684f8bfaca285368bf1813f9fc26
2022-03-21 12:12:39 -07:00

118 lines
4.9 KiB
C++

// Copyright 2019 The MediaPipe Authors.
//
// 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
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Defines functions for validating and parsing tags and stream names
// (and side packet names).
#ifndef MEDIAPIPE_FRAMEWORK_TOOL_VALIDATE_NAME_H_
#define MEDIAPIPE_FRAMEWORK_TOOL_VALIDATE_NAME_H_
#include <string>
#include <vector>
#include "absl/base/macros.h"
#include "mediapipe/framework/port/proto_ns.h"
#include "mediapipe/framework/port/status.h"
namespace mediapipe {
namespace internal {
constexpr int kMaxCollectionItemId = 10000;
} // namespace internal
namespace tool {
struct ABSL_DEPRECATED(
"Prefer using mediapipe::tool::TagMap instead, since this structure does "
"not "
"consider the TAG:INDEX:name notation.") TagAndNameInfo {
// The tag names. If this is empty then the collection will use
// indexes.
std::vector<std::string> tags;
// Names of the streams or side packets. If tags are used then
// tags.size() and names.size() must match.
std::vector<std::string> names;
};
// Create a TagAndNameInfo from a list of strings in the form TAG:name.
// The TAG (including colon) is optional, but the entire list must either
// always include tags or never include tags.
ABSL_DEPRECATED(
"Prefer using mediapipe::tool::TagMap instead, since this method does not "
"support the TAG:INDEX:name notation. You can use Create() to create the "
"tag map, and then Names(), Mapping(), and other methods to access the "
"tag, index and name information.")
absl::Status GetTagAndNameInfo(
const proto_ns::RepeatedPtrField<ProtoString>& tags_and_names,
TagAndNameInfo* info);
// Create the proto field names in the form TAG:name based on a
// TagAndNameInfo.
ABSL_DEPRECATED(
"Prefer using mediapipe::tool::TagMap instead, since this method does not "
"support the TAG:INDEX:name notation. You can use CanonicalEntries() to "
"translate a tag map to a RepeatedPtrField of tag and names.")
absl::Status SetFromTagAndNameInfo(
const TagAndNameInfo& info,
proto_ns::RepeatedPtrField<ProtoString>* tags_and_names);
// The string is a valid name for an input stream, output stream,
// side packet, and input collection. Names use only lower case letters,
// numbers, and underscores.
//
// The reason for this restriction is threefold.
// (1) To enforce a consistent style in graph configs.
// (2) To distinguish between "arguments" to calculators and
// trainer/calculator names.
// (3) Because input side packet names end up in model directory names,
// where lower case naming is the norm.
absl::Status ValidateName(const std::string& name);
// The string is a valid tag name. Tags use only upper case letters,
// numbers, and underscores.
absl::Status ValidateTag(const std::string& tag);
// Parse a "Tag and Name" string into a tag and a name.
// The format is an optional tag and colon, followed by a name.
// Example 1: "VIDEO:frames2" -> tag: "VIDEO", name: "frames2"
// Example 2: "video_frames_1" -> tag: "", name: "video_frames_1"
absl::Status ParseTagAndName(const std::string& tag_and_name, std::string* tag,
std::string* name);
// Parse a generic TAG:index:name string. The format is a tag, then an
// index, then a name. The tag and index are optional. If the index
// is included, then the tag must be included. If no tag is used then
// index is set to -1 (and should be assigned by argument position).
// Examples:
// "VIDEO:frames2" -> tag: "VIDEO", index: 0, name: "frames2"
// "VIDEO:1:frames" -> tag: "VIDEO", index: 1, name: "frames"
// "raw_frames" -> tag: "", index: -1, name: "raw_frames"
absl::Status ParseTagIndexName(const std::string& tag_and_name,
std::string* tag, int* index, std::string* name);
// Parse a generic TAG:index string. The format is a tag, then an index
// with both being optional. If the tag is missing it is assumed to be
// "" and if the index is missing then it is assumed to be 0. If the
// index is provided then a colon (':') must be used.
// Examples:
// "VIDEO" -> tag: "VIDEO", index: 0
// "VIDEO:1" -> tag: "VIDEO", index: 1
// ":2" -> tag: "", index: 2
// "" -> tag: "", index: 0
absl::Status ParseTagIndex(const std::string& tag_and_index, std::string* tag,
int* index);
} // namespace tool
} // namespace mediapipe
#endif // MEDIAPIPE_FRAMEWORK_TOOL_VALIDATE_NAME_H_