12 releases
0.2.2 | Oct 5, 2023 |
---|---|
0.2.1 | Sep 28, 2023 |
0.1.8 | Sep 15, 2023 |
#3 in #odata
34KB
589 lines
Parse an SAP OData V2 XML atom:Feed
This is a work in progress!
The crate is designed to work in conjunction with the source code generated from the crate parse-sap-odata
.
Crate parse-sap-odata
is invoked by a Rust build script to parse an OData XML metadata file and generates the Rust struct
s and enum
s needed to consume the entity set data described by that metadata.
This crate parse-sap-atom-feed
then makes use of the struct
s and enum
s generated above and allows your business app to consume the XML returned when requesting entity sets from this OData service.
Changes in V0.2
The main change in version 0.2 is to adopt quick-xml
's @
-prefixed attribute syntax introduced in 0.27
and higher.
Example Usage
You want to develop a Rust application that can consume the entity set data exposed by an SAP OData V2 service.
For the purposes of instruction, let's say you're working with a custom OData service that displays services ordered either by functional location or by date:
Rust Application | zcustom-service-orders |
OData Service URL | https://my-sap-server.my-domain.com/sap/opu/odata/sap |
OData Service Name | ZCUSTOM_SERVICE_ORDERS_SRV |
OData Schema Name | ZCUSTOM_SERVICE_ORDERS |
Entity Names | SERVICE_ORDERS_BY_FLOC SERVICE_ORDERS_BY_DATE |
Entity Type | ZServiceOrder |
The general approach to consuming such a service is as follows:
- Create a new Rust binary application
cargo new zcustom-service-orders
cd zcustom-service-orders
- Edit
Cargo.toml
to include at least the following dependencies[build-dependencies] parse-sap-odata = "1.1" [dependencies] chrono = { version = "0.4", features = ["serde"]} parse-sap-atom-feed = "0.1" rust_decimal = "1.30" serde = { version = "1.0", features = ["derive"] } uuid = { version = "1.4", features = ["serde"]}
mkdir odata
- Display your service's metadata.
E.G.
https://my-sap-server.my-domain.com/sap/opu/odata/sap/ZCUSTOM_SERVICE_ORDERS_SRV/$metadata
- Save the metadata as the file
zcustom_service_orders.xml
in theodata
directory - Create a
build.rs
file in same directory asCargo.toml
and add at least the following:use parse_sap_odata::parser::gen_src; fn main() { gen_src("zcustom_service_orders", "ZCUSTOM_SERVICE_ORDERS"); }
- In
src/main.rs
include at least:use parse_sap_atom_feed::{ Feed, xml::sanitise_xml, str::{self, FromStr}, }; include!(concat!(env!("OUT_DIR"), "/zcustom_service_orders.rs")); use zcustom_service_orders::*; fn main() { let raw_xml: String = /* Whatever code is needed to fetch the entity set data as a raw XML string */; // You might need to sanitise the raw XML string before attempting to parse it let clean_xml = sanitise_xml(raw_xml); let srv_orders_by_floc = Feed::<ZServiceOrder>::from_str(&clean_xml); }
Dependencies
~4.5–6.5MB
~116K SLoC