mws 0.12.0

Client library for Amazon Marketplace Web Service (Amazon MWS)
use chrono::{DateTime, Utc};
use feeds::Envelope;
use feeds::Message;
use types::ToIso8601;
use xmlhelper::encode;

#[derive(Debug, Serialize)]
pub struct OrderFulfillmentMessage {
  pub message_id: String,
  pub amazon_order_id: String,
  pub fulfillment_date: DateTime<Utc>,
  pub carrier_name: String,
  pub shipping_method: String,
  pub shipper_tracking_number: String,
  pub items: Vec<OrderFulfillmentItem>,
}

#[derive(Debug, Serialize)]
pub struct OrderFulfillmentItem {
  pub amazon_order_item_code: String,
  pub quantity: i32,
}

impl Message for OrderFulfillmentMessage {
  fn get_message_type() -> &'static str {
    "OrderFulfillment"
  }
}

impl<W: encode::XmlEventWriter> encode::XmlWrite<W> for Envelope<OrderFulfillmentMessage> {
  fn write_xml(&self, w: &mut W) -> encode::Result<()> {
    self.write_envelope_xml(w, |w: &mut W| {
      for message in self.messages.iter() {
        let fulfillment_date = message.data.fulfillment_date.to_iso8601();
        write_xml!(w,
          Message[][
            MessageID[][
              (&message.data.message_id)
            ]
            OperationType[][
              "Update"
            ]
            OrderFulfillment[][
              AmazonOrderID[][
                (&message.data.amazon_order_id)
              ]
              FulfillmentDate[][
                (&fulfillment_date)
              ]
              FulfillmentData[][
                CarrierName[][
                  (&message.data.carrier_name)
                ]
                ShippingMethod[][
                  (&message.data.shipping_method)
                ]
                ShipperTrackingNumber[][
                  (&message.data.shipper_tracking_number)
                ]
              ]
              [{
                for item in &message.data.items {
                  let quantity = item.quantity.to_string();
                  write_xml!(w,
                    Item[][
                      AmazonOrderItemCode[][
                        (&item.amazon_order_item_code)
                      ]
                      Quantity[][
                        (&quantity)
                      ]
                    ]
                  )?;
                }
                Ok(())
              }]
            ]
          ]
        )?;
      }
      Ok(())
    })
  }
}

#[cfg(test)]
mod tests {
  use super::*;
  use chrono::FixedOffset;
  use feeds::OperationType;
  use xmlhelper::encode::XmlWrite;
  use xmlhelper::encode::{EmitterConfig, EventWriter};

  #[test]
  fn test_order_fulfillment_feed() {
    let mut writer =
      EventWriter::new_with_config(vec![], EmitterConfig::new().perform_indent(true));

    {
      let w = &mut writer;
      let mut e = Envelope::<OrderFulfillmentMessage>::new("1234567890".to_owned());
      e.add_message(
        OrderFulfillmentMessage {
          message_id: "1".to_string(),
          amazon_order_id: "112-3739032-8075461".to_string(),
          fulfillment_date: DateTime::<FixedOffset>::parse_from_rfc3339(
            "2018-12-06T17:08:31.760132Z",
          )
          .unwrap()
          .with_timezone(&Utc),
          carrier_name: "UPS".to_string(),
          shipping_method: "Standard".to_string(),
          shipper_tracking_number: "1Z71178X0261236762".to_string(),
          items: vec![OrderFulfillmentItem {
            amazon_order_item_code: "56323517235162".to_string(),
            quantity: 1,
          }],
        },
        Some(OperationType::Update),
      );
      e.write_xml(w).unwrap();
    }

    let xml = String::from_utf8(writer.into_inner()).unwrap();
    assert_eq!(
      xml,
      r#"<?xml version="1.0" encoding="utf-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amznenvelope.xsd">
  <Header>
    <DocumentVersion>1.01</DocumentVersion>
    <MerchantIdentifier>1234567890</MerchantIdentifier>
  </Header>
  <MessageType>OrderFulfillment</MessageType>
  <Message>
    <MessageID>1</MessageID>
    <OperationType>Update</OperationType>
    <OrderFulfillment>
      <AmazonOrderID>112-3739032-8075461</AmazonOrderID>
      <FulfillmentDate>2018-12-06T17:08:31Z</FulfillmentDate>
      <FulfillmentData>
        <CarrierName>UPS</CarrierName>
        <ShippingMethod>Standard</ShippingMethod>
        <ShipperTrackingNumber>1Z71178X0261236762</ShipperTrackingNumber>
      </FulfillmentData>
      <Item>
        <AmazonOrderItemCode>56323517235162</AmazonOrderItemCode>
        <Quantity>1</Quantity>
      </Item>
    </OrderFulfillment>
  </Message>
</AmazonEnvelope>"#
    );
  }
}