private void BuildStreetAddress(StringBuilder builder, bool includeSiteName = true)
        {
            // street_address = name_part number_part street_part
            //     name_part = (address_site_name SP / building_part)
            //         building_part = ( / building_name SP)
            //     street_part = street_name ( / SP street_type) ( / SP street_suffix)

            // name_part
            if (includeSiteName && SiteName.HasValue())
            {
                builder.Append(SiteName);
                builder.Append(Sp);
                // need building_name from datasets
            }

            number_part(builder);

            // street_part
            builder.Append(StreetName);
            if (StreetType.HasValue())
            {
                builder.Append(Sp);
                builder.Append(StreetType);
            }
            if (StreetSuffix.HasValue())
            {
                builder.Append(Sp);
                builder.Append(StreetSuffix);
            }
        }
 public string[] GenerateCompletionAddresses(string locality, List <string> addresses)
 {
     addresses.Add(GenerateCompletionAddress(locality, true));
     if (SiteName.HasValue())
     {
         addresses.Add(GenerateCompletionAddress(locality, false));
     }
     if (ComplexUnitType.HasValue())
     {
         var addressWithoutUnitType = DeepCopyAttributes();
         addressWithoutUnitType.ComplexUnitType = null;
         addresses.Add(addressWithoutUnitType.GenerateCompletionAddress(locality, true));
         if (SiteName.HasValue())
         {
             addresses.Add(addressWithoutUnitType.GenerateCompletionAddress(locality, false));
         }
     }
     return(addresses.ToArray());
 }