summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--system/gd/packet/parser/gen_rust.cc4
-rw-r--r--system/gd/packet/parser/packet_def.cc33
2 files changed, 27 insertions, 10 deletions
diff --git a/system/gd/packet/parser/gen_rust.cc b/system/gd/packet/parser/gen_rust.cc
index 0fe9c71d5b..75e814a578 100644
--- a/system/gd/packet/parser/gen_rust.cc
+++ b/system/gd/packet/parser/gen_rust.cc
@@ -52,6 +52,10 @@ pub enum Error {
ImpossibleStructError,
}
+#[derive(Debug, Error)]
+#[error("{0}")]
+pub struct TryFromError(&'static str);
+
pub trait Packet {
fn to_bytes(self) -> Bytes;
fn to_vec(self) -> Vec<u8>;
diff --git a/system/gd/packet/parser/packet_def.cc b/system/gd/packet/parser/packet_def.cc
index 0229360d32..d30be830d3 100644
--- a/system/gd/packet/parser/packet_def.cc
+++ b/system/gd/packet/parser/packet_def.cc
@@ -1138,7 +1138,8 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
s << "impl CommandExpectations for " << name_ << "Packet {";
s << " type ResponseType = " << complement_->name_ << "Packet;";
s << " fn _to_response_type(pkt: EventPacket) -> Self::ResponseType { ";
- s << complement_->name_ << "Packet::new(pkt." << complement_root_accessor << ".clone())";
+ s << complement_->name_ << "Packet::new(pkt." << complement_root_accessor << ".clone())"
+ << ".unwrap()";
s << " }";
s << "}";
}
@@ -1173,10 +1174,20 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
s << "}\n";
s << "}\n";
+ if (root != this) {
+ s << "impl TryFrom<" << root->name_ << "Packet"
+ << "> for " << name_ << "Packet {\n";
+ s << "type Error = TryFromError;\n";
+ s << "fn try_from(value: " << root->name_ << "Packet)"
+ << " -> std::result::Result<Self, Self::Error> {\n";
+ s << "Self::new(value." << root_accessor << ").map_err(TryFromError)\n", s << "}\n";
+ s << "}\n";
+ }
+
s << "impl " << name_ << "Packet {";
if (parent_ == nullptr) {
s << "pub fn parse(bytes: &[u8]) -> Result<Self> { ";
- s << "Ok(Self::new(Arc::new(" << name_ << "Data::parse(bytes)?)))";
+ s << "Ok(Self::new(Arc::new(" << name_ << "Data::parse(bytes)?)).unwrap())";
s << "}";
}
@@ -1185,7 +1196,7 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
s << " match &self." << util::CamelCaseToUnderScore(name_) << ".child {";
for (const auto& child : children_) {
s << name_ << "DataChild::" << child->name_ << "(_) => " << name_ << "Child::" << child->name_ << "("
- << child->name_ << "Packet::new(self." << root_accessor << ".clone())),";
+ << child->name_ << "Packet::new(self." << root_accessor << ".clone()).unwrap()),";
}
if (fields_.HasPayload()) {
s << name_ << "DataChild::Payload(p) => " << name_ << "Child::Payload(p.clone()),";
@@ -1197,7 +1208,7 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
lineage.push_back(this);
const ParentDef* prev = nullptr;
- s << " fn new(root: Arc<" << root->name_ << "Data>) -> Self {";
+ s << " fn new(root: Arc<" << root->name_ << "Data>) -> std::result::Result<Self, &'static str> {";
for (auto it = lineage.begin(); it != lineage.end(); it++) {
auto def = *it;
auto accessor_name = util::CamelCaseToUnderScore(def->name_);
@@ -1206,17 +1217,17 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
} else {
s << "let " << accessor_name << " = match &" << util::CamelCaseToUnderScore(prev->name_) << ".child {";
s << prev->name_ << "DataChild::" << def->name_ << "(value) => (*value).clone(),";
- s << "_ => panic!(\"inconsistent state - child was not " << def->name_ << "\"),";
+ s << "_ => return Err(\"inconsistent state - child was not " << def->name_ << "\"),";
s << "};";
}
prev = def;
}
- s << "Self {";
+ s << "Ok(Self {";
for (auto it = lineage.begin(); it != lineage.end(); it++) {
auto def = *it;
s << util::CamelCaseToUnderScore(def->name_) << ",";
}
- s << "}}";
+ s << "})}";
for (auto it = lineage.begin(); it != lineage.end(); it++) {
auto def = *it;
@@ -1250,7 +1261,8 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
auto def = *it;
s << "impl Into<" << def->name_ << "Packet> for " << name_ << "Packet {";
s << " fn into(self) -> " << def->name_ << "Packet {";
- s << def->name_ << "Packet::new(self." << util::CamelCaseToUnderScore(root->name_) << ")";
+ s << def->name_ << "Packet::new(self." << util::CamelCaseToUnderScore(root->name_) << ")"
+ << ".unwrap()";
s << " }";
s << "}\n";
}
@@ -1263,7 +1275,8 @@ void PacketDef::GenRustBuilderStructImpls(std::ostream& s) const {
s << "impl CommandExpectations for " << name_ << "Builder {";
s << " type ResponseType = " << complement_->name_ << "Packet;";
s << " fn _to_response_type(pkt: EventPacket) -> Self::ResponseType { ";
- s << complement_->name_ << "Packet::new(pkt." << complement_root_accessor << ".clone())";
+ s << complement_->name_ << "Packet::new(pkt." << complement_root_accessor << ".clone())"
+ << ".unwrap()";
s << " }";
s << "}";
}
@@ -1328,7 +1341,7 @@ void PacketDef::GenRustBuilderStructImpls(std::ostream& s) const {
prev = ancestor;
}
- s << name_ << "Packet::new(" << util::CamelCaseToUnderScore(prev->name_) << ")";
+ s << name_ << "Packet::new(" << util::CamelCaseToUnderScore(prev->name_) << ").unwrap()";
s << "}\n";
s << "}\n";