--- a/lib/Protobuf-PHP/library/DrSlump/Protobuf/Codec/TextFormat.php +++ b/lib/Protobuf-PHP/library/DrSlump/Protobuf/Codec/TextFormat.php @@ -1,1 +1,82 @@ +encodeMessage($message); + } + + /** + * + * @throw \DrSlump\Protobuf\Exception - Decoding is not supported + * @param \DrSlump\Protobuf\Message $message + * @param String $data + * @return \DrSlump\Protobuf\Message + */ + public function decode(Protobuf\Message $message, $data) + { + throw new \BadMethodCallException('TextFormat codec does not support decoding'); + } + + protected function encodeMessage(Protobuf\Message $message, $level = 0) + { + $descriptor = Protobuf::getRegistry()->getDescriptor($message); + + $indent = str_repeat(' ', $level); + $data = ''; + foreach ($descriptor->getFields() as $tag=>$field) { + + $empty = !$message->_has($tag); + if ($field->isRequired() && $empty) { + throw new \UnexpectedValueException( + 'Message ' . get_class($message) . '\'s field tag ' . $tag . '(' . $field->getName() . ') is required but has no value' + ); + } + + if ($empty) { + continue; + } + + $name = $field->getName(); + $value = $message->_get($tag); + + if ($field->isRepeated()) { + foreach ($value as $val) { + if ($field->getType() !== Protobuf::TYPE_MESSAGE) { + $data .= $indent . $name . ': ' . json_encode($val) . "\n"; + } else { + $data .= $indent . $name . " {\n"; + $data .= $this->encodeMessage($val, $level+1); + $data .= $indent . "}\n"; + } + } + } else { + if ($field->getType() === Protobuf::TYPE_MESSAGE) { + $data .= $indent . $name . " {\n"; + $data .= $this->encodeMessage($value, $level+1); + $data .= $indent . "}\n"; + } else { + $data .= $indent . $name . ': ' . json_encode($value) . "\n"; + } + } + } + + return $data; + } +} + +