/// <summary>
 /// Parse an AD Use extension
 /// </summary>
 public static AddressSet.AddressSetUse ParseADUseExtension(List <Extension> extension, List <IResultDetail> dtls)
 {
     try
     {
         // Now fun part parse
         AddressSet.AddressSetUse value = 0;
         foreach (var ext in extension.FindAll(o => o.Url == GetExtensionNameUrl("addressUse")))
         {
             var coding = ext.Value as Coding;
             if (coding == null)
             {
                 dtls.Add(new VocabularyIssueResultDetail(ResultDetailType.Error, String.Format("Address use extension must carry a coding from system {0}", typeof(PostalAddressUse).GetValueSetDefinition()), null, null));
             }
             else
             {
                 value |= (AddressSet.AddressSetUse)Enum.Parse(typeof(AddressSet.AddressSetUse), MARC.Everest.Connectors.Util.Convert <PostalAddressUse>(coding.Code).ToString());
             }
         }
         return(value);
     }
     catch (VocabularyException e)
     {
         dtls.Add(new VocabularyIssueResultDetail(ResultDetailType.Error, String.Format(ApplicationContext.LocalizationService.GetString("FHIR007"), GetExtensionNameUrl("addressUse"), e.Message), e));
         return(0);
     }
 }
        /// <summary>
        /// Create an address set
        /// </summary>
        public AddressSet CreateAddressSet(AD address, List <IResultDetail> dtls)
        {
            AddressSet retVal = new AddressSet();

            AddressSet.AddressSetUse internalNameUse = ConvertAddressUse(address.Use, dtls);
            if (address == null || address.IsNull)
            {
                return(null);
            }

            retVal.Use = internalNameUse;
            // Create the parts
            foreach (ADXP namePart in address.Part)
            {
                var pt = new AddressPart()
                {
                    AddressValue = namePart.Value,
                    PartType     = (AddressPart.AddressPartType)Enum.Parse(typeof(AddressPart.AddressPartType), namePart.Type.ToString())
                };
                if (pt.PartType == AddressPart.AddressPartType.AddressLine) // R1 doesn't use AL but SAL and the formatter
                {
                    pt.PartType = AddressPart.AddressPartType.StreetAddressLine;
                }
                retVal.Parts.Add(pt);
            }

            if (address.UseablePeriod != null && !address.UseablePeriod.IsNull)
            {
                dtls.Add(new NotImplementedElementResultDetail("useablePeriod", "urn:hl7-org:v3"));
            }
            return(retVal);
        }
        /// <summary>
        /// Convert address uses
        /// </summary>
        private AddressSet.AddressSetUse ConvertAddressUse(SET <CS <PostalAddressUse> > uses, List <IResultDetail> dtls)
        {
            AddressSet.AddressSetUse retVal = 0;
            if (uses == null)
            {
                return(0);
            }

            foreach (var use in uses)
            {
                switch ((PostalAddressUse)use)
                {
                case PostalAddressUse.Direct:
                    retVal |= AddressSet.AddressSetUse.Direct;
                    break;

                case PostalAddressUse.BadAddress:
                    retVal |= AddressSet.AddressSetUse.BadAddress;
                    break;

                case PostalAddressUse.HomeAddress:
                    retVal |= AddressSet.AddressSetUse.HomeAddress;
                    break;

                case PostalAddressUse.PhysicalVisit:
                    retVal |= AddressSet.AddressSetUse.PhysicalVisit;
                    break;

                case PostalAddressUse.PostalAddress:
                    retVal |= AddressSet.AddressSetUse.PostalAddress;
                    break;

                case PostalAddressUse.PrimaryHome:
                    retVal |= AddressSet.AddressSetUse.PrimaryHome;
                    break;

                case PostalAddressUse.Public:
                    retVal |= AddressSet.AddressSetUse.Public;
                    break;

                case PostalAddressUse.TemporaryAddress:
                    retVal |= AddressSet.AddressSetUse.TemporaryAddress;
                    break;

                case PostalAddressUse.VacationHome:
                    retVal |= AddressSet.AddressSetUse.VacationHome;
                    break;

                case PostalAddressUse.WorkPlace:
                    retVal |= AddressSet.AddressSetUse.WorkPlace;
                    break;

                default:
                    dtls.Add(new VocabularyIssueResultDetail(ResultDetailType.Error, String.Format(m_localeService.GetString("MSGE04D"), use), null, null));
                    break;
                }
            }
            return(retVal);
        }
        public static Extension CreateADUseExtension(AddressSet.AddressSetUse use)
        {
            if (use == AddressSet.AddressSetUse.Search)
            {
                return(CreateNullElementExtension(NullFlavor.Other));
            }

            PostalAddressUse v3Use    = (PostalAddressUse)Enum.Parse(typeof(PostalAddressUse), use.ToString());
            string           wireCode = MARC.Everest.Connectors.Util.ToWireFormat(v3Use);

            return(new Extension()
            {
                Url = GetExtensionNameUrl("addressUse"),
                Value = new Coding(typeof(PostalAddressUse).GetValueSetDefinition(), wireCode)
            });
        }