1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | <?php namespace DrSlump\Protobuf; use DrSlump\Protobuf; class Descriptor { /** @var String Holds the class name of the message */ protected $class; /** @var String Holds the original proto name */ protected $name; /** @var \DrSlump\Protobuf\Field[] */ protected $fields = array(); /** @var array - Cache the relation between names and tags */ protected $names = array(); /** * @param string $class * @param string $name */ public function __construct($class, $name = null) { $this->class = trim($class, '\\ '); $this->name = $name ? trim($name, '. ') : NULL; } /** * @return string */ public function getClass() { return $this->class; } /** * @return string|null */ public function getName() { return $this->name; } /** * Obtain the list of fields in the message * * @return \DrSlump\Protobuf\Field[] */ public function getFields() { return $this->fields; } /** * Adds a field to the message * * @param \DrSlump\Protobuf\Field $field * @param bool $isExtension */ public function addField(Protobuf\Field $field, $isExtension = false) { $field->extension = $isExtension; $this->fields[ $field->number ] = $field; } /** * Obtain a field descriptor by its tag number * * @param int $tag * @return \DrSlump\Protobuf\Field | NULL */ public function getField($tag) { return isset($this->fields[$tag]) ? $this->fields[$tag] : NULL; } /** * Obtain a field descriptor by its name * * @param string $name * @return \DrSlump\Protobuf\Field | NULL */ public function getFieldByName($name) { // Check cached map if (isset($this->names[$name])) { return $this->getField($this->names[$name]); } // Loop thru all fields to find it foreach ($this->fields as $tag=>$field) { // Cache it for next calls $fname = $field->getName(); $this->names[$fname] = $tag; if ($name === $fname) { return $field; } } return null; } /** * Check if the given tag number matches a field * * @param int $tag * @return bool */ public function hasField($tag) { return isset($this->fields[$tag]); } } |