1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: jschorr@google.com (Joseph Schorr)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Utilities for printing and parsing protocol messages in a human-readable,
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// text-based format.
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace io {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class ErrorCollector;      // tokenizer.h
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class implements protocol buffer text format.  Printing and parsing
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// protocol messages in text format is useful for debugging and human editing
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// of messages.
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is really a namespace that contains only static methods.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT TextFormat {
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Outputs a textual representation of the given message to the given
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // output stream.
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool Print(const Message& message, io::ZeroCopyOutputStream* output);
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Print the fields in an UnknownFieldSet.  They are printed by tag number
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // only.  Embedded messages are heuristically identified by attempting to
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // parse them.
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 io::ZeroCopyOutputStream* output);
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Like Print(), but outputs directly to a string.
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool PrintToString(const Message& message, string* output);
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Like PrintUnknownFields(), but outputs directly to a string.
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                         string* output);
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Outputs a textual representation of the value of the field supplied on
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the message supplied. For non-repeated fields, an index of -1 must
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // be supplied. Note that this method will print the default value for a
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // field if it is not set.
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void PrintFieldValueToString(const Message& message,
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      const FieldDescriptor* field,
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      int index,
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      string* output);
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Class for those users which require more fine-grained control over how
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // a protobuffer message is printed out.
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class LIBPROTOBUF_EXPORT Printer {
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Printer();
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ~Printer();
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::Print
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool Print(const Message& message, io::ZeroCopyOutputStream* output);
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::PrintUnknownFields
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            io::ZeroCopyOutputStream* output);
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::PrintToString
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool PrintToString(const Message& message, string* output);
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::PrintUnknownFieldsToString
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                    string* output);
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::PrintFieldValueToString
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void PrintFieldValueToString(const Message& message,
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 const FieldDescriptor* field,
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 int index,
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 string* output);
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Adjust the initial indent level of all output.  Each indent level is
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // equal to two spaces.
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void SetInitialIndentLevel(int indent_level) {
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      initial_indent_level_ = indent_level;
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // If printing in single line mode, then the entire message will be output
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // on a single line with no line breaks.
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void SetSingleLineMode(bool single_line_mode) {
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      single_line_mode_ = single_line_mode;
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // Set true to print repeated primitives in a format like:
121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    //   field_name: [1, 2, 3, 4]
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // instead of printing each value on its own line.  Short format applies
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // only to primitive values -- i.e. everything except strings and
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // sub-messages/groups.  Note that at present this format is not recognized
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // by the parser.
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) {
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      use_short_repeated_primitives_ = use_short_repeated_primitives;
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // Set true to output UTF-8 instead of ASCII.  The only difference
131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // is that bytes >= 0x80 in string fields will not be escaped,
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // because they are assumed to be part of UTF-8 multi-byte
133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // sequences.
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void SetUseUtf8StringEscaping(bool as_utf8) {
135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      utf8_string_escaping_ = as_utf8;
136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Forward declaration of an internal class used to print the text
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // output to the OutputStream (see text_format.cc for implementation).
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class TextGenerator;
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Internal Print method, used for writing to the OutputStream via
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // the TextGenerator class.
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void Print(const Message& message,
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               TextGenerator& generator);
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Print a single field.
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void PrintField(const Message& message,
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    const Reflection* reflection,
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    const FieldDescriptor* field,
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    TextGenerator& generator);
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // Print a repeated primitive field in short form.
155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void PrintShortRepeatedField(const Message& message,
156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                 const Reflection* reflection,
157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                 const FieldDescriptor* field,
158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                 TextGenerator& generator);
159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // Print the name of a field -- i.e. everything that comes before the
161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // ':' for a single name/value pair.
162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    void PrintFieldName(const Message& message,
163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        const Reflection* reflection,
164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        const FieldDescriptor* field,
165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        TextGenerator& generator);
166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Outputs a textual representation of the value of the field supplied on
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // the message supplied or the default value if not set.
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void PrintFieldValue(const Message& message,
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const Reflection* reflection,
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field,
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         int index,
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         TextGenerator& generator);
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Print the fields in an UnknownFieldSet.  They are printed by tag number
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // only.  Embedded messages are heuristically identified by attempting to
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // parse them.
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void PrintUnknownFields(const UnknownFieldSet& unknown_fields,
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            TextGenerator& generator);
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int initial_indent_level_;
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool single_line_mode_;
184d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    bool use_short_repeated_primitives_;
186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    bool utf8_string_escaping_;
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parses a text-format protocol message from the given input stream to
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the given message object.  This function parses the format written
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // by Print().
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool Parse(io::ZeroCopyInputStream* input, Message* output);
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Like Parse(), but reads directly from a string.
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool ParseFromString(const string& input, Message* output);
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Like Parse(), but the data is merged into the given message, as if
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // using Message::MergeFrom().
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool Merge(io::ZeroCopyInputStream* input, Message* output);
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Like Merge(), but reads directly from a string.
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool MergeFromString(const string& input, Message* output);
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parse the given text as a single field value and store it into the
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // given field of the given message. If the field is a repeated field,
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the new value will be added to the end
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool ParseFieldValueFromString(const string& input,
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                        const FieldDescriptor* field,
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                        Message* message);
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // For more control over parsing, use this class.
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class LIBPROTOBUF_EXPORT Parser {
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Parser();
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ~Parser();
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::Parse().
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool Parse(io::ZeroCopyInputStream* input, Message* output);
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::ParseFromString().
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool ParseFromString(const string& input, Message* output);
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::Merge().
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool Merge(io::ZeroCopyInputStream* input, Message* output);
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::MergeFromString().
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool MergeFromString(const string& input, Message* output);
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Set where to report parse errors.  If NULL (the default), errors will
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // be printed to stderr.
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void RecordErrorsTo(io::ErrorCollector* error_collector) {
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      error_collector_ = error_collector;
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Normally parsing fails if, after parsing, output->IsInitialized()
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // returns false.  Call AllowPartialMessage(true) to skip this check.
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void AllowPartialMessage(bool allow) {
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      allow_partial_ = allow;
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::ParseFieldValueFromString
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool ParseFieldValueFromString(const string& input,
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                   const FieldDescriptor* field,
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                   Message* output);
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Forward declaration of an internal class used to parse text
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // representations (see text_format.cc for implementation).
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class ParserImpl;
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Like TextFormat::Merge().  The provided implementation is used
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // to do the parsing.
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool MergeUsingImpl(io::ZeroCopyInputStream* input,
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        Message* output,
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        ParserImpl* parser_impl);
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::ErrorCollector* error_collector_;
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    bool allow_partial_;
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat);
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_TEXT_FORMAT_H__
265