Files
monorepo/LCU.API.Internal.OnlineLoanApp/USPS/Responses/AddressValidationResponseParser.cs
T
2026-03-11 11:18:25 -05:00

69 lines
2.3 KiB
C#

using System.Xml.Linq;
using Landmark.OLA.Models.Addresses;
using Landmark.OLA.Models.Addresses.Enums;
namespace USPS.Parsers
{
public class AddressValidationResponseParser : IResponseParser<Address>
{
public bool CheckForError(XElement xdoc)
{
var elementAddress = xdoc.Element("Address");
if (elementAddress == null)
{
return true;
}
var error = elementAddress.Element("Error");
return (error != null);
}
public Address Parse(XElement xdoc)
{
if( xdoc == null )
{
throw new ArgumentNullException("Address xml is null");
}
var elementAddress = xdoc.Element("Address");
if (elementAddress == null || elementAddress.Element("Error") != null)
{
throw new FormatException("Attempt to parse address that is in error.");
}
try
{
var compareAddress = new Address
{
// USPS considers unit numbers (ex: APT 204) to be Address1. Our app's models would consider these to be Address2. DO NOT CHANGE
Address2 = (string)elementAddress.Element("Address1"),
Address1 = (string)elementAddress.Element("Address2"),
City = (string)elementAddress.Element("City"),
State = MakeStateOptionEnum((string)elementAddress.Element("State")),
PostalCode = (string)elementAddress.Element("Zip5"),
PostalCodeExt = (string)elementAddress.Element("Zip4"),
Country = CountryOption.UnitedStates
};
return compareAddress;
}
catch
{
throw new FormatException("USPS XML is in an unexpected layout.");
}
}
public static StateOption MakeStateOptionEnum(string state)
{
if (Enum.TryParse(state, out StateOption parsedState))
{
return parsedState;
}
else
{
throw new FormatException("USPS XML contains an unexpected 'State'");
}
}
}
}