Move response deserialization into client

This commit is contained in:
Dirkjan Ochtman 2022-03-12 18:12:16 +01:00 committed by masalachai
parent dd5fbc60ce
commit 3f91647370
2 changed files with 14 additions and 24 deletions

View File

@ -20,7 +20,7 @@ use crate::connection::{self, EppConnection};
use crate::error::Error; use crate::error::Error;
use crate::hello::{Greeting, GreetingDocument, HelloDocument}; use crate::hello::{Greeting, GreetingDocument, HelloDocument};
use crate::request::{Command, CommandDocument, Extension, Transaction}; use crate::request::{Command, CommandDocument, Extension, Transaction};
use crate::response::Response; use crate::response::{Response, ResponseDocument, ResponseStatus};
use crate::xml::EppXml; use crate::xml::EppXml;
/// An `EppClient` provides an interface to sending EPP requests to a registry /// An `EppClient` provides an interface to sending EPP requests to a registry
@ -133,13 +133,19 @@ impl<C: Connector> EppClient<C> {
let response = self.connection.transact(&xml)?.await?; let response = self.connection.transact(&xml)?.await?;
debug!("{}: response: {}", self.connection.registry, &response); debug!("{}: response: {}", self.connection.registry, &response);
match Cmd::deserialize_response(&response) { let rsp =
Ok(response) => Ok(response), <ResponseDocument<Cmd::Response, Ext::Response> as EppXml>::deserialize(&response)?;
Err(e) => { if rsp.data.result.code.is_success() {
error!(%response, "Failed to deserialize response: {}", e); return Ok(rsp.data);
Err(e)
}
} }
let err = crate::error::Error::Command(ResponseStatus {
result: rsp.data.result,
tr_ids: rsp.data.tr_ids,
});
error!(%response, "Failed to deserialize response for transaction: {}", err);
Err(err)
} }
/// Accepts raw EPP XML and returns the raw EPP XML response to it. /// Accepts raw EPP XML and returns the raw EPP XML response to it.

View File

@ -5,30 +5,14 @@ use std::fmt::Debug;
use crate::{ use crate::{
common::{StringValue, EPP_XMLNS}, common::{StringValue, EPP_XMLNS},
response::{Response, ResponseDocument, ResponseStatus},
xml::EppXml, xml::EppXml,
Error,
}; };
pub const EPP_VERSION: &str = "1.0"; pub const EPP_VERSION: &str = "1.0";
pub const EPP_LANG: &str = "en"; pub const EPP_LANG: &str = "en";
/// Trait to set correct value for xml tags when tags are being generated from generic types /// Trait to set correct value for xml tags when tags are being generated from generic types
pub trait Transaction<Ext: Extension>: Command + Sized { pub trait Transaction<Ext: Extension>: Command + Sized {}
fn deserialize_response(
epp_xml: &str,
) -> Result<Response<Self::Response, Ext::Response>, Error> {
let rsp =
<ResponseDocument<Self::Response, Ext::Response> as EppXml>::deserialize(epp_xml)?;
match rsp.data.result.code.is_success() {
true => Ok(rsp.data),
false => Err(crate::error::Error::Command(ResponseStatus {
result: rsp.data.result,
tr_ids: rsp.data.tr_ids,
})),
}
}
}
pub trait Command: Serialize + Debug { pub trait Command: Serialize + Debug {
type Response: DeserializeOwned + Debug; type Response: DeserializeOwned + Debug;