Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff9d1783 authored by David Duarte's avatar David Duarte Committed by Gerrit Code Review
Browse files

Merge "PDL: Generate TryFrom implementation for rust output"

parents 1e33487f 3a079d9a
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,10 @@ pub enum Error {
  ImpossibleStructError,
  ImpossibleStructError,
}
}


#[derive(Debug, Error)]
#[error("{0}")]
pub struct TryFromError(&'static str);

pub trait Packet {
pub trait Packet {
  fn to_bytes(self) -> Bytes;
  fn to_bytes(self) -> Bytes;
  fn to_vec(self) -> Vec<u8>;
  fn to_vec(self) -> Vec<u8>;
+23 −10
Original line number Original line Diff line number Diff line
@@ -1138,7 +1138,8 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
    s << "impl CommandExpectations for " << name_ << "Packet {";
    s << "impl CommandExpectations for " << name_ << "Packet {";
    s << " type ResponseType = " << complement_->name_ << "Packet;";
    s << " type ResponseType = " << complement_->name_ << "Packet;";
    s << " fn _to_response_type(pkt: EventPacket) -> Self::ResponseType { ";
    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 << " }";
    s << "}";
    s << "}";
  }
  }
@@ -1173,10 +1174,20 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
  s << "}\n";
  s << "}\n";
  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 {";
  s << "impl " << name_ << "Packet {";
  if (parent_ == nullptr) {
  if (parent_ == nullptr) {
    s << "pub fn parse(bytes: &[u8]) -> Result<Self> { ";
    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 << "}";
    s << "}";
  }
  }


@@ -1185,7 +1196,7 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
    s << " match &self." << util::CamelCaseToUnderScore(name_) << ".child {";
    s << " match &self." << util::CamelCaseToUnderScore(name_) << ".child {";
    for (const auto& child : children_) {
    for (const auto& child : children_) {
      s << name_ << "DataChild::" << child->name_ << "(_) => " << name_ << "Child::" << child->name_ << "("
      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()) {
    if (fields_.HasPayload()) {
      s << name_ << "DataChild::Payload(p) => " << name_ << "Child::Payload(p.clone()),";
      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);
  lineage.push_back(this);
  const ParentDef* prev = nullptr;
  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++) {
  for (auto it = lineage.begin(); it != lineage.end(); it++) {
    auto def = *it;
    auto def = *it;
    auto accessor_name = util::CamelCaseToUnderScore(def->name_);
    auto accessor_name = util::CamelCaseToUnderScore(def->name_);
@@ -1206,17 +1217,17 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
    } else {
    } else {
      s << "let " << accessor_name << " = match &" << util::CamelCaseToUnderScore(prev->name_) << ".child {";
      s << "let " << accessor_name << " = match &" << util::CamelCaseToUnderScore(prev->name_) << ".child {";
      s << prev->name_ << "DataChild::" << def->name_ << "(value) => (*value).clone(),";
      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 << "};";
      s << "};";
    }
    }
    prev = def;
    prev = def;
  }
  }
  s << "Self {";
  s << "Ok(Self {";
  for (auto it = lineage.begin(); it != lineage.end(); it++) {
  for (auto it = lineage.begin(); it != lineage.end(); it++) {
    auto def = *it;
    auto def = *it;
    s << util::CamelCaseToUnderScore(def->name_) << ",";
    s << util::CamelCaseToUnderScore(def->name_) << ",";
  }
  }
  s << "}}";
  s << "})}";


  for (auto it = lineage.begin(); it != lineage.end(); it++) {
  for (auto it = lineage.begin(); it != lineage.end(); it++) {
    auto def = *it;
    auto def = *it;
@@ -1250,7 +1261,8 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {
    auto def = *it;
    auto def = *it;
    s << "impl Into<" << def->name_ << "Packet> for " << name_ << "Packet {";
    s << "impl Into<" << def->name_ << "Packet> for " << name_ << "Packet {";
    s << " fn into(self) -> " << def->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 << " }";
    s << "}\n";
    s << "}\n";
  }
  }
@@ -1263,7 +1275,8 @@ void PacketDef::GenRustBuilderStructImpls(std::ostream& s) const {
    s << "impl CommandExpectations for " << name_ << "Builder {";
    s << "impl CommandExpectations for " << name_ << "Builder {";
    s << " type ResponseType = " << complement_->name_ << "Packet;";
    s << " type ResponseType = " << complement_->name_ << "Packet;";
    s << " fn _to_response_type(pkt: EventPacket) -> Self::ResponseType { ";
    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 << " }";
    s << "}";
    s << "}";
  }
  }
@@ -1328,7 +1341,7 @@ void PacketDef::GenRustBuilderStructImpls(std::ostream& s) const {
    prev = ancestor;
    prev = ancestor;
  }
  }


  s << name_ << "Packet::new(" << util::CamelCaseToUnderScore(prev->name_) << ")";
  s << name_ << "Packet::new(" << util::CamelCaseToUnderScore(prev->name_) << ").unwrap()";
  s << "}\n";
  s << "}\n";


  s << "}\n";
  s << "}\n";