OSDN Git Service

rusty-gd: Added methods to compute size
authorQasim Javed <qasimj@google.com>
Fri, 22 Jan 2021 22:53:16 +0000 (14:53 -0800)
committerQasim Javed <qasimj@google.com>
Sat, 23 Jan 2021 01:36:22 +0000 (17:36 -0800)
Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost

Change-Id: Iadd4663eac45d3b61ea891def71ece4bba0cdcf6

gd/packet/parser/packet_def.cc

index 8876531..0073db3 100644 (file)
@@ -756,6 +756,24 @@ void PacketDef::GenRustChildEnums(std::ostream& s) const {
     }
     s << "None,";
     s << "}\n";
+
+    s << "impl " << name_ << "DataChild {";
+    s << "fn get_total_size(&self) -> usize {";
+    s << "match self {";
+    for (const auto& child : children_) {
+      if (child->name_.rfind("LeGetVendorCapabilitiesComplete", 0) == 0) {
+        continue;
+      }
+      s << name_ << "DataChild::" << child->name_ << "(value) => value.get_total_size(),";
+    }
+    if (payload) {
+      s << name_ << "DataChild::Payload(p) => p.len(),";
+    }
+    s << name_ << "DataChild::None => 0,";
+    s << "}\n";
+    s << "}\n";
+    s << "}\n";
+
     s << "#[derive(Debug)] ";
     s << "pub enum " << name_ << "Child {";
     for (const auto& child : children_) {
@@ -858,9 +876,7 @@ void PacketDef::GenRustStructSizeField(std::ostream& s) const {
   for (int i = 0; i < fields.size(); i++) {
     size += fields[i]->GetSize().bytes();
   }
-  if (fields.size() > 0) {
-    s << size;
-  }
+  s << size;
 }
 
 void PacketDef::GenRustStructImpls(std::ostream& s) const {
@@ -1023,12 +1039,18 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {
 
   s << "}\n";
 
-  if (fields.size() > 0) {
-    s << "pub fn get_size(&self) -> usize {";
-    GenRustStructSizeField(s);
-    s << "}";
+  s << "fn get_total_size(&self) -> usize {";
+  if (HasChildEnums()) {
+    s << "self.get_size() + self.child.get_total_size()";
+  } else {
+    s << "self.get_size()";
   }
   s << "}\n";
+
+  s << "pub fn get_size(&self) -> usize {";
+  GenRustStructSizeField(s);
+  s << "}\n";
+  s << "}\n";
 }
 
 void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {