Advertisement
Guest User

Untitled

a guest
Aug 16th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 10.03 KB | None | 0 0
  1. pub fn validate_address_fedex(
  2.     fedex_settings: FedexSettings,
  3.     va: ValidateFedexAddresses,
  4.     test: bool,
  5. ) -> AddressValidationResult {
  6.     let (c_key, c_pass) = if !test {
  7.         (
  8.             fedex_settings.credential_key,
  9.             fedex_settings.credential_pass,
  10.         )
  11.     } else {
  12.         (
  13.             fedex_settings.test_credential_key,
  14.             fedex_settings.test_credential_pass,
  15.         )
  16.     };
  17.  
  18.     let mut uc = ns2__WebAuthenticationCredential {
  19.         Key: str_as_mut_ptr!(c_key),
  20.         Password: str_as_mut_ptr!(c_pass),
  21.     };
  22.  
  23.     let mut wad = ns2__WebAuthenticationDetail {
  24.         ParentCredential: null_mut_ptr!(ns2__WebAuthenticationCredential),
  25.         UserCredential: item_as_mut_ptr!(uc, ns2__WebAuthenticationCredential),
  26.     };
  27.  
  28.     let (an, mn) = if !test {
  29.         (fedex_settings.accountnumber, fedex_settings.meternumber)
  30.     } else {
  31.         (
  32.             fedex_settings.test_accountnumber,
  33.             fedex_settings.test_meternumber,
  34.         )
  35.     };
  36.  
  37.     let mut cd = ns2__ClientDetail {
  38.         AccountNumber: str_as_mut_ptr!(an),
  39.         MeterNumber: str_as_mut_ptr!(mn),
  40.         IntegratorId: null_mut_ptr!(i8),
  41.         Localization: null_mut_ptr!(ns2__Localization),
  42.     };
  43.  
  44.     let now = Utc::now();
  45.     let mut seconds: i64 = now.timestamp() as i64; // NOTE: diff for windows
  46.  
  47.     let mut td = ns2__TransactionDetail {
  48.         CustomerTransactionId: str_as_mut_ptr!("Address Validation Request"),
  49.         Localization: null_mut_ptr!(ns2__Localization),
  50.     };
  51.  
  52.     let mut v = ns2__VersionId {
  53.         ServiceId: str_as_mut_ptr!("aval"),
  54.         Major: 4 as libc::c_int,
  55.         Intermediate: 0 as libc::c_int,
  56.         Minor: 0 as libc::c_int,
  57.     };
  58.  
  59.     let mut adrs = vec![];
  60.     for address in va.addresses.into_iter() {
  61.         let street_lines_len = address.street_lines.len();
  62.         let mut street_lines = vec![];
  63.  
  64.         for sl in address.street_lines.into_iter() {
  65.             street_lines.push(str_as_mut_ptr!(sl));
  66.         }
  67.  
  68.         let state_or_province_code = match address.state_or_province_code {
  69.             Some(_state_or_province_code) => str_as_mut_ptr!(_state_or_province_code),
  70.             None => str_as_mut_ptr!("".to_owned()),
  71.         };
  72.  
  73.         let urbanization_code = match address.urbanization_code {
  74.             Some(_urbanization_code) => str_as_mut_ptr!(_urbanization_code),
  75.             None => str_as_mut_ptr!("".to_owned()),
  76.         };
  77.  
  78.         let country_name = match address.country_name {
  79.             Some(_country_name) => str_as_mut_ptr!(_country_name),
  80.             None => str_as_mut_ptr!("".to_owned()),
  81.         };
  82.  
  83.         let mut adr = ns2__Address {
  84.             __sizeStreetLines: street_lines_len as libc::c_int,
  85.             StreetLines: street_lines.as_mut_ptr(),
  86.             City: str_as_mut_ptr!(address.city),
  87.             StateOrProvinceCode: state_or_province_code,
  88.             PostalCode: str_as_mut_ptr!(address.postal_code),
  89.             UrbanizationCode: urbanization_code,
  90.             CountryCode: str_as_mut_ptr!(address.country_code),
  91.             CountryName: country_name,
  92.             Residential: null_mut_ptr!(xsd__boolean), // NOTE: some day, if needed
  93.         };
  94.  
  95.         std::mem::forget(street_lines);
  96.  
  97.         adrs.push(ns2__AddressToValidate {
  98.             ClientReferenceId: str_as_mut_ptr!(address.reference_id),
  99.             Contact: null_mut_ptr!(ns2__Contact),
  100.             Address: item_as_mut_ptr!(adr, ns2__Address),
  101.         });
  102.     }
  103.  
  104.     let addrsss_ptr = ptr_mut_array!(adrs, ns2__AddressToValidate);
  105.  
  106.     for i in 0..adrs.len() {
  107.         unsafe { addrsss_ptr.offset(i as isize).write(adrs[i]) };
  108.     }
  109.  
  110.     let mut vr = ns2__AddressValidationRequest {
  111.         WebAuthenticationDetail: item_as_mut_ptr!(wad, ns2__WebAuthenticationDetail),
  112.         ClientDetail: item_as_mut_ptr!(cd, ns2__ClientDetail),
  113.         InEffectAsOfTimestamp: item_as_mut_ptr!(seconds, ::std::os::raw::c_long),
  114.         TransactionDetail: item_as_mut_ptr!(td, ns2__TransactionDetail),
  115.         Version: item_as_mut_ptr!(v, ns2__VersionId),
  116.         __sizeAddressesToValidate: adrs.len() as libc::c_int,
  117.         AddressesToValidate: addrsss_ptr as *mut ns2__AddressToValidate,
  118.     };
  119.  
  120.     let vt_ptr = item_as_mut_ptr!(vr, ns2__AddressValidationRequest);
  121.     std::mem::forget(vr);
  122.  
  123.     let soap = unsafe { create_soap() };
  124.  
  125.     let base_url = if !test {
  126.         fedex_settings.url
  127.     } else {
  128.         fedex_settings.test_url
  129.     };
  130.  
  131.     let output: ns2__AddressValidationReply =
  132.         unsafe { validate_address(soap, CString::new(base_url).unwrap().as_ptr(), vt_ptr) };
  133.  
  134.     let mut result_data: Vec<AddressValidationResultData> = vec![];
  135.  
  136.     for address_results_offset in 0..output.__sizeAddressResults {
  137.         let address_results = unsafe {
  138.             *output
  139.                 .AddressResults
  140.                 .offset(address_results_offset as isize)
  141.         };
  142.  
  143.         let size_attributes = address_results.__sizeAttributes;
  144.         let mut attributes_map: HashMap<String, String> = HashMap::new();
  145.  
  146.         for size_attributes_offset in 0..size_attributes {
  147.             let attributes = unsafe {
  148.                 *address_results
  149.                     .Attributes
  150.                     .offset(size_attributes_offset as isize)
  151.             };
  152.             let name = attributes.Name;
  153.             let value = attributes.Value;
  154.             attributes_map.insert(
  155.                 ptr_as_str!(name).to_owned().to_camel_case(),
  156.                 ptr_as_str!(value).to_owned(),
  157.             );
  158.         }
  159.  
  160.         let client_reference_id = address_results.ClientReferenceId;
  161.  
  162.         let r_state = if !address_results.State.is_null() {
  163.             unsafe { (*address_results.State) }.clone()
  164.         } else {
  165.             999 as u32
  166.         };
  167.  
  168.         //println!("\nr_state = {:?}", r_state);
  169.  
  170.         #[allow(non_upper_case_globals)]
  171.         let state = match r_state {
  172.             ns2__OperationalAddressStateType_ns2__OperationalAddressStateType__NORMALIZED => {
  173.                 "NORMALIZED".to_owned()
  174.             }
  175.             ns2__OperationalAddressStateType_ns2__OperationalAddressStateType__RAW => {
  176.                 "RAW".to_owned()
  177.             }
  178.             ns2__OperationalAddressStateType_ns2__OperationalAddressStateType__STANDARDIZED => {
  179.                 "STANDARDIZED".to_owned()
  180.             }
  181.             _ => "UNKNOWN".to_owned(),
  182.         };
  183.  
  184.         let r_classification = if !address_results.Classification.is_null() {
  185.             unsafe { (*address_results.Classification) }.clone()
  186.         } else {
  187.             999 as u32
  188.         };
  189.  
  190.         //println!("\r_classification = {:?}", r_state);
  191.  
  192.         #[allow(non_upper_case_globals)]
  193.         let classification = match r_classification {
  194.             ns2__FedExAddressClassificationType_ns2__FedExAddressClassificationType__BUSINESS => {
  195.                 "BUSINESS".to_owned()
  196.             }
  197.             ns2__FedExAddressClassificationType_ns2__FedExAddressClassificationType__MIXED => {
  198.                 "MIXED".to_owned()
  199.             }
  200.             ns2__FedExAddressClassificationType_ns2__FedExAddressClassificationType__RESIDENTIAL => {
  201.                 "RESIDENTIAL".to_owned()
  202.             }
  203.             _ => "UNKNOWN".to_owned(),
  204.         };
  205.  
  206.         let effective_address_ptr = unsafe { *address_results.EffectiveAddress };
  207.         let mut ea_street_lines: Vec<String> = vec![];
  208.  
  209.         for ea_street_line_offset in 0..effective_address_ptr.__sizeStreetLines {
  210.             let steet_line_ptr = unsafe {
  211.                 *effective_address_ptr
  212.                     .StreetLines
  213.                     .offset(ea_street_line_offset as isize)
  214.             };
  215.             let steet_line_str = ptr_as_str!(steet_line_ptr).to_owned();
  216.             ea_street_lines.push(steet_line_str);
  217.         }
  218.  
  219.         let effective_address = EffectiveAddress {
  220.             street_lines: ea_street_lines,
  221.             city: ptr_as_op_string!(effective_address_ptr.City),
  222.             state_or_province_code: ptr_as_op_string!(effective_address_ptr.StateOrProvinceCode),
  223.             postal_code: ptr_as_op_string!(effective_address_ptr.PostalCode),
  224.             urbanization_code: ptr_as_op_string!(effective_address_ptr.UrbanizationCode),
  225.             country_code: ptr_as_op_string!(effective_address_ptr.CountryCode),
  226.             country_name: ptr_as_op_string!(effective_address_ptr.CountryName),
  227.             residential: ptr_as_op!(effective_address_ptr.Residential),
  228.         };
  229.  
  230.         result_data.push({
  231.             AddressValidationResultData {
  232.                 client_reference_id: ptr_as_str!(client_reference_id).to_owned(),
  233.                 state: state,
  234.                 classification: classification,
  235.                 attributes: attributes_map,
  236.                 effective_address: effective_address,
  237.             }
  238.         });
  239.  
  240.         break;
  241.     }
  242.  
  243.     let message = if output.Notifications.is_null() {
  244.         "Connection failed! Please check 'URL' and contact support in necessary.".to_owned()
  245.     } else {
  246.         ptr_as_str!((*output.Notifications).Message).to_owned()
  247.     };
  248.  
  249.     #[allow(non_upper_case_globals)]
  250.     let status = match output.HighestSeverity {
  251.         ns1__NotificationSeverityType_ns1__NotificationSeverityType__ERROR => "ERROR".to_owned(),
  252.         ns1__NotificationSeverityType_ns1__NotificationSeverityType__FAILURE => {
  253.             "FAILURE".to_owned()
  254.         }
  255.         ns1__NotificationSeverityType_ns1__NotificationSeverityType__NOTE => "NOTE".to_owned(),
  256.         ns1__NotificationSeverityType_ns1__NotificationSeverityType__SUCCESS => {
  257.             "SUCCESS".to_owned()
  258.         }
  259.         ns1__NotificationSeverityType_ns1__NotificationSeverityType__WARNING => {
  260.             "WARNING".to_owned()
  261.         }
  262.         _ => "FAILURE".to_owned(),
  263.     };
  264.  
  265.     unsafe { free_soap(soap) };
  266.  
  267.     //println!("output.HighestSeverity = {:?}", output.HighestSeverity);
  268.  
  269.     AddressValidationResult {
  270.         status: status,
  271.         status_code: output.HighestSeverity,
  272.         message: message,
  273.         data: result_data,
  274.     }
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement